Pytest全局前置后置操作问题:钩子与session级fixture未执行排查
Pytest全局初始化/清理钩子不执行的排查与最佳实践
排查原因
以下是最可能导致conftest.py中钩子、fixture不执行的几个点:
- conftest.py位置或命名错误:必须严格命名为
conftest.py,且放在测试根目录(或你需要作用的测试子目录顶层)。如果测试文件分散在多个子目录,而conftest放在深层子目录,只会作用于该子目录下的测试,无法全局生效。 - 钩子函数定义错误:函数名拼写错误(比如
pytest_sesionstart少了一个s)、参数不匹配是常见问题。正确的钩子签名:pytest_sessionstart(session):必须接收session参数pytest_sessionfinish(session, exitstatus):必须接收session和exitstatus参数
- fixture配置错误:session级自动fixture必须同时设置
scope="session"和autouse=True,否则只有被测试函数显式引用时才会执行;普通自动fixture同理需要autouse=True。 - pytest版本过低:
pytest_sessionstart等钩子从pytest 2.9.0开始支持,如果你的版本太旧,建议升级到最新稳定版:pip install --upgrade pytest - 插件或多conftest冲突:如果项目中有多个
conftest.py(比如上级目录也有),或者第三方插件定义了同名钩子,可能会覆盖你的逻辑。可以用pytest -p no:all禁用所有插件后测试,排查是否是插件冲突。 - 运行路径问题:如果运行pytest时指定了单个测试文件,而
conftest.py不在该文件的目录链中(比如测试文件在tests/a/,conftest在tests/b/),pytest不会加载它。确保conftest在测试文件的父目录或同目录。
最佳实践
方法1:使用session钩子函数(适合无返回资源的全局操作)
在测试根目录的conftest.py中编写钩子,实现纯初始化/清理逻辑:
import pytest def pytest_sessionstart(session): # 全局初始化:比如启动测试服务、创建全局测试数据 print("所有测试执行前,仅运行一次初始化") # 示例:存储全局资源到session.config,供后续钩子使用 session.config.global_resource = start_test_service() def pytest_sessionfinish(session, exitstatus): # 全局清理:无论测试成功/失败都会执行 print("所有测试结束后,仅运行一次清理") # 示例:释放之前创建的全局资源 stop_test_service(session.config.global_resource)
运行时记得加-s参数(关闭stdout捕获),可以看到print的执行日志,验证是否生效。
方法2:使用session级自动fixture(适合需要传递资源给测试用例的场景)
如果初始化后需要将资源(如数据库连接、测试客户端)传递给测试用例,用fixture更灵活:
import pytest @pytest.fixture(scope="session", autouse=True) def global_session_setup(): # 初始化逻辑 db_conn = create_test_database_connection() test_client = init_test_api_client() # 将资源通过yield传递给测试用例 yield {"db": db_conn, "client": test_client} # 清理逻辑:无论测试结果如何都会执行 db_conn.close() test_client.shutdown()
测试用例中可以直接引用该fixture获取资源:
def test_user_login(global_session_setup): client = global_session_setup["client"] response = client.post("/login", data={"username": "test", "password": "123"}) assert response.status_code == 200
验证技巧
- 运行pytest时添加
-s参数,查看print输出,确认初始化/清理逻辑是否执行 - 使用
pytest --trace-config命令,查看pytest加载的conftest文件和插件,确认你的conftest被正确加载
内容的提问来源于stack exchange,提问作者Wizardry
相关产品推荐
相关产品推荐

