conftest的使用以及pytest的夹具函数和钩子函数
conftest.py 的作用
-
共享 fixtures:在多个测试文件间共享测试夹具
-
作用域控制:conftest.py 的位置决定了其影响范围
-
插件配置:配置 pytest 插件和钩子函数
conftest.py是 pytest 的局部配置文件。pytest 会自动加载它,一般用于放置“多个测试共同使用”的内容,不需要手动导入。conftest.py是 pytest 约定的自动发现文件:pytest 启动 ↓ 查找 conftest.py ↓ 加载其中的 fixture 和 hook ↓ 在适用范围内使用所以准确关系是:
内容 属于谁 conftest.py的作用fixture 夹具 pytest 可以存放和共享夹具 hook 钩子 pytest/pluggy 可以实现 pytest 钩子 conftest.pypytest 识别的配置文件 自动注册其中的夹具和钩子 一句话概括:
夹具和钩子是 pytest 的能力,
conftest.py是承载这些能力的常用配置文件。
基本结构
tests/
├── conftest.py # 影响整个 tests/ 目录
├── test_user.py
├── test_order.py
└── api/
├── conftest.py # 只影响 api/ 目录
└── test_api.py
也就是当前目录及其子目录中的测试通常都能使用。但父目录或兄弟目录不能使用!
可以这样理解:
pytest
├── 提供 fixture(夹具)机制
├── 提供 hook(钩子)机制
└── 自动发现并加载 conftest.py
pytest提供了有夹具函数和钩子函数
1. 钩子函数是内部定义的?
更准确地说,它们是内部定义好“规范”的,但需要由用户来实现。
pytest 内部定义了一套钩子规范(Hook Specification),但具体的实现代码需要由用户提供。你需要在 conftest.py 文件或自定义插件中,定义一个函数名与钩子规范完全一致的函数,pytest 就会在对应的测试生命周期节点自动调用它。pytest 在注册时还会检查你函数中的参数名是否与规范匹配。
常用的pytest钩子函数: https://www.cnblogs.com/pingguomang/p/22904900
2. 夹具函数是需要用户自己实现的吗?
是的,夹具函数完全由用户自己实现,并且是实现局部资源初始化和清理最推荐的方式。
相比钩子函数,夹具(Fixture)更加灵活:
-
用户定义:通过
@pytest.fixture装饰器来定义。 -
作用域控制:你可以通过
scope参数精确控制其生命周期,例如scope="session"的夹具就实现了类似会话级初始化和清理的效果。 -
实现方式:使用
yield语句来分隔设置和清理代码,yield之前的代码在测试前执行,之后的代码在测试结束后执行。

浙公网安备 33010602011771号