Pytest配置项详解与实战应用
配置文件与选项管理
Pytest支持通过多个配置文件统一管理测试行为,常见配置文件包括:pytest.ini、tox.ini 和 setup.cfg。这些文件通常放置在项目根目录下,所有配置项需置于 [pytest] 段中(setup.cfg 中为 [tool:pytest])。
注意:推荐使用 pytest.ini 或 tox.ini 作为主要配置方式。由于 .cfg 文件采用不同的解析逻辑,可能导致难以排查的问题。仅在极简场景下考虑使用 setup.cfg。
命令行可通过 -o/--override 覆盖配置项,支持多次传递,格式为 name=value:
pytest -o console_output_style=classic -o cache_dir=/tmp/mycache
核心配置项说明
| 配置项 | 作用 | 默认值 |
|---|---|---|
addopts |
追加默认命令行参数,等同于用户输入 | 无 |
cache_dir |
缓存失败测试结果的路径 | .pytest_cache |
confcutdir |
控制 conftest.py 搜索范围的起始目录 |
空 |
console_output_style |
控制台输出样式:classic(经典)、progress(带进度条)、count(计数模式) |
progress |
addopts:预设命令行参数
该选项可将一组命令行参数注入到每次执行中。例如:
[pytest]
addopts = --maxfail=2 -rf
执行 pytest test_hello.py 等价于:
pytest --maxfail=2 -rf test_hello.py
cache_dir:自定义缓存目录
用于存储测试失败状态和中间结果,提升重复运行效率。默认位于项目根目录下的 .pytest_cache 文件夹。
confcutdir:限制 conftest 搜寻范围
指定向上查找 conftest.py 的边界目录。若未设置,pytest 将从配置文件所在目录开始逐级向上搜索,直到系统根目录。
console_output_style:输出风格定制
调整测试执行时的终端显示方式:
classic:标准输出,简洁明了progress:带进度条,直观展示执行进度count:以"已运行数量/总数"形式显示进度
示例配置:
[pytest]
console_output_style = classic
empty_parameter_set_mark:空参数集处理策略
当参数化测试遇到空参数列表时的行为:
skip(默认):跳过该测试xfail:标记为预期失败(不执行)fail_at_collect:收集阶段即抛出异常
示例:
[pytest]
empty_parameter_set_mark = xfail
filterwarnings:警告过滤规则
定义测试过程中对警告的处理方式。格式为每行一个规则,支持 error、ignore、warn 等操作。
[pytest]
filterwarnings =
error
ignore::DeprecationWarning
表示将弃用警告视为错误,其他警告一律忽略。
junit_family:JUnit XML 输出格式
控制生成的 JUnit 格式报告版本:
xunit1(或legacy):兼容旧版 xunit 1.0(默认)xunit2:符合 xunit 2.0 规范,更适配现代 CI 工具如 Jenkins
示例:
[pytest]
junit_family = xunit2
junit_suite_name:测试套件名称
自定义 JUnit 报告中根节点的名称:
[pytest]
junit_suite_name = my_custom_suite
日志相关配置
以下配置项用于控制日志输出行为:
log_cli_format:实时日志格式字符串(如%(asctime)s %(levelname)s %(message)s)log_cli_level:CLI 日志最低级别(如INFO)log_file:日志写入文件路径(如logs/test.log)log_file_level:文件日志最低级别log_format:捕获日志的通用格式log_print:是否在失败时打印捕获的日志信息(False则隐藏)
所有日志时间格式支持 time.strftime() 语法,例如:
[pytest]
log_cli_date_format = %Y-%m-%d %H:%M:%S
markers:标记白名单
配合 --strict-markers 使用,仅允许配置中列出的标记。多行配置支持:
[pytest]
markers =
slow
serial
minversion:最小 Pytest 版本要求
确保测试环境满足最低版本需求:
[pytest]
minversion = 3.0
低于此版本将报错终止。
norecursedirs:禁止递归扫描目录
避免进入特定目录进行测试发现。支持通配符匹配(类似 fnmatch):
*匹配任意字符?匹配单个字符[seq]匹配集合中的任一字符[!seq]匹配不在集合中的字符
示例:
[pytest]
norecursedirs = .svn _build tmp* .git
同时,pytest 会自动识别虚拟环境目录(如包含 activate 脚本),除非显式使用 --collect-in-virtualenv 否则不会扫描。
python_classes:测试类命名规则
定义哪些类会被当作测试类。默认匹配以 Test 开头的类。可扩展为:
[pytest]
python_classes = *Suite Test*
python_files:测试文件匹配模式
决定哪些 Python 文件被视为测试模块:
[pytest]
python_files = test_*.py check_*.py example_*.py
支持多行写法,便于维护。
python_functions:测试函数命名规则
控制哪些函数被识别为测试函数:
[pytest]
python_functions = *_test
注意:此类规则不影响 unittest.TestCase 派生类的方法收集。
testpaths:测试路径优先级
当未指定具体路径时,限定搜索范围:
[pytest]
testpaths = tests docs
有助于加快测试发现速度并防止误扫非目标目录。
usefixtures:全局固定装置
为所有测试函数自动注入指定 fixture:
[pytest]
usefixtures =
clean_db
reset_cache
等价于为每个测试添加 @pytest.mark.usefixtures("clean_db")。
xfail_strict:严格 XFail 检查
若启用,标记为 @pytest.mark.xfail 但实际通过的测试将被视为失败:
[pytest]
xfail_strict = True
适用于强调测试预期失败状态的严格验证场景。
