You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将pytest fixtures集中存放并跨Python包子模块复用?

如何在pytest中实现跨模块共享中央fixtures

嘿,这个需求太常见了!pytest的conftest.py机制正好能完美解决你的问题,不用在每个测试目录重复定义fixtures,我给你捋清楚具体步骤:

  • 第一步:创建中央fixture目录与文件
    在你计划的中央位置./tumble/tumble/test下创建一个conftest.py文件——这是pytest的特殊配置文件,它会被自动识别并全局加载,不管你的测试文件在哪个子模块的test目录里。调整后的目录结构大概是这样:

    tumble/
      tumble/
        math/
          test/
            test_multiply.py
        science/
          test/
            test_divide.py
        test/
          conftest.py  # 所有共享fixtures都放这里
    
  • 第二步:在中央conftest.py中定义共享fixtures
    直接把你想在全项目测试中复用的fixtures写在这个文件里就行,比如:

    import pytest
    
    @pytest.fixture(scope="session")
    def global_session_fixture():
        # 会话级fixture:整个测试运行周期只初始化一次,比如全局配置、数据库连接
        global_config = {"env": "test", "timeout": 30}
        yield global_config
        # 这里可以写测试后的清理逻辑,比如关闭数据库连接
    
    @pytest.fixture(scope="function")
    def global_function_fixture():
        # 函数级fixture:每个测试函数都会调用一次,比如测试数据初始化
        test_data = {"input": 10, "expected": 20}
        return test_data
    
  • 第三步:在任意测试文件中直接使用
    不管你的测试文件在math/test还是science/test下,都不需要手动导入这些fixtures,直接在测试函数的参数里引用就行:
    比如test_multiply.py中的测试代码:

    def test_multiply_two_numbers(global_session_fixture, global_function_fixture):
        assert global_session_fixture["env"] == "test"
        result = global_function_fixture["input"] * 2
        assert result == global_function_fixture["expected"]
    
  • 额外小提示:fixture作用域与局部扩展

    • 记得根据需求设置fixture的scope参数(session/module/function),能有效提升测试运行效率;
    • 如果某个子测试目录需要局部特有的fixtures,直接在该目录下新建自己的conftest.py即可——pytest会优先加载子目录的配置,再合并中央conftest的内容,完全不会冲突。

内容的提问来源于stack exchange,提问作者CurtLH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 06:56:46