02 pytest记忆要点
1. pytest.fixture(依赖注入与生命周期)
基本用法:用
@pytest.fixture装饰函数,测试函数将其作为同名参数直接传入即可调用。四种作用域:通过
scope参数控制执行频率。function(默认):每个测试函数执行前都运行一次。class:每个测试类运行前执行一次。module:每个.py脚本运行前执行一次。session:整个测试会话(所有文件)启动时只执行一次。
前后置清理:在 fixture 内部使用
yield分割。yield之前的代码:测试前运行(Setup)。yield之后的代码:测试后运行(Teardown),无论成功失败都会执行。
2. 测试模块与分组(命名与标签)
命名规范:Pytest 依靠命名自动识别测试目标。
文件名:必须是
test_*.py或*_test.py。类名:必须以
Test开头,且不能有__init__方法。函数/方法名:必须以
test_开头。
分组标记:使用
@pytest.mark.标签名装饰器对测试进行分类。示例:
@pytest.mark.slow标记耗时长的用例。注意:自定义标签需在
pytest.ini配置文件中注册,防止报警告。
3. 部分范围测试(精确执行筛选)
按路径与名称筛选:
执行目录/文件:
pytest test/backends/或pytest test_filesystem.py精确到方法:
pytest test_file.py::TestClass::test_method
按表达式与标签筛选:
关键字筛选(
-k):pytest -k "filesystem and not read"(支持逻辑运算符匹配名字)。标签筛选(
-m):pytest -m "slow"或排除标签pytest -m "not slow"。
4. 全局配置文件 conftest.py(机制与自动执行时机)
基本机制:放置在测试根目录下的本地插件配置文件,无需手动
import,pytest 启动时会自动探测并加载。它内部的函数被称为钩子(Hooks)或全局夹具(Fixtures)。核心 Hook 函数执行时机:
pytest_configure(config):整个测试会话最开始、所有测试用例加载(Import)之前。(最适合:加载.env环境变量)。pytest_sessionstart(session):配置完成、在开始去硬盘寻找/收集测试文件之前。(适合:初始化远程测试数据库等全局大对象)。@pytest.fixture(scope="session", autouse=True):在第一个测试用例运行前自动执行(通过yield分割前后置)。(适合:整个测试周期的 Setup/Teardown,如清理临时文件夹)。pytest_runtest_setup(item):在每一个测试用例(函数)即将执行前触发。(适合:条件检查,如无网时自动跳过线上测试)。pytest_runtest_makereport(item, call):在每个测试用例执行的各个阶段结束后触发。(适合:捕获失败状态,如失败时自动截图或保存当前日志)。pytest_sessionfinish(session, exitstatus):所有测试用例全部执行完毕、报告生成之前。(适合:断开全局连接、发送测试报告邮件)。
核心必背命令行参数与技巧
-s:关闭标准输出捕获,让代码中的print()和日志实时显示在控制台。-v:详细模式(Verbose),显示每个测试用例的完整名称和执行状态。-x:一错即停(Maxfail=1),遇到第一个测试失败时立即停止后续所有测试。异常捕获:使用
with pytest.raises(ExpectedException):检查代码是否如预期般抛出特定异常。