如何将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的内容,完全不会冲突。
- 记得根据需求设置fixture的
内容的提问来源于stack exchange,提问作者CurtLH
相关产品推荐
相关产品推荐

