conftest.py 作用范围限于同级及子目录,按路径就近加载;共享fixture应放根目录conftest.py或专用目录下,注意scope兼容性与命名一致性。

conftest.py 的作用范围怎么确定
conftest.py 只对**同级和子目录下的测试文件生效**,不会向上影响父目录或其他并列目录。比如 tests/unit/conftest.py 里的 fixture 只能被 tests/unit/test_*.py 和 tests/unit/submodule/test_*.py 使用,tests/integration/conftest.py 完全看不到它。
多个 conftest.py 共存时,pytest 按路径就近原则加载:子目录的 conftest.py 会覆盖父目录中同名 fixture(如果 scope 相同且未显式声明 autouse=True)。
如何让 fixture 被多个测试模块共享
把 fixture 写进项目根目录下的 conftest.py(如 tests/conftest.py),就能被整个 tests/ 下所有测试发现。但要注意:不是所有 fixture 都适合放顶层——过度共享会降低可维护性,也容易引发 scope 冲突。
- 用
@pytest.fixture(scope="session")的 fixture 必须放在最外层conftest.py,否则 session 级生命周期无法跨文件维持 - 若只需在某类测试间共享(比如所有 API 测试),更推荐建专用目录(如
tests/api/)并在其下放conftest.py - 避免在
conftest.py中 import 测试模块或业务代码——这会让 pytest 自动发现机制变慢,还可能触发循环导入
fixture 名称冲突和覆盖规则
当两个 conftest.py 定义了同名 fixture,pytest 会按调用路径选择“最近”的那个。比如 tests/api/conftest.py 和 tests/conftest.py 都定义了 client,那么 tests/api/test_auth.py 会使用前者,而 tests/unit/test_utils.py 用后者。
想强制复用上级 fixture?可以显式重定义并调用:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
@pytest.fixture
def client(api_client):
return api_client
这样既明确依赖关系,又避免隐式覆盖带来的调试困难。
为什么我的 fixture 在测试里报 NameError
最常见的原因是:fixture 函数名拼写错误、没加 @pytest.fixture 装饰器、或者测试函数参数名和 fixture 名不一致(pytest 严格按参数名匹配)。
- 检查是否漏了装饰器:
def database()不是 fixture,必须写成@pytest.fixture def database(): - 确认测试函数签名中的参数名和 fixture 函数名完全一致(包括大小写和下划线)
- 运行
pytest --fixtures查看当前作用域下可用的 fixture 列表,快速验证是否被正确注册 - 如果 fixture 依赖其他 fixture,但依赖项本身未被正确声明或作用域不兼容(比如 function 级 fixture 试图依赖 session 级 fixture),也会静默失败
作用域嵌套比想象中敏感:一个 scope="module" 的 fixture 不能直接依赖 scope="function" 的 fixture,反过来可以。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










