启用 -w error::deprecationwarning 可使 pytest 将弃用警告转为错误,立即暴露 pytest.ini 中已废弃的配置项;结合 pytest --help 验证选项是否存在,并用 10 行脚本自动化检测,确保升级后配置行为等价。

怎么快速发现 pytest.ini 里已废弃的配置项
Pytest 版本升级后,很多旧配置项会被标记为弃用(deprecated),甚至直接移除。但 pytest 默认不会报错,只在运行时悄悄忽略或降级处理,导致你误以为配置生效了,实际没起作用。
最直接的办法是启用弃用警告并捕获它们——不是靠人眼扫文档,而是让 pytest 自己“说出来”:
- 在命令行加
-W error::DeprecationWarning,把所有弃用警告转为错误,运行时立刻暴露问题 - 或者临时改用
python -W error::DeprecationWarning -m pytest,避免污染当前环境 - 注意:Python 3.12+ 默认不显示
DeprecationWarning,必须显式开启,否则根本看不到
pytest.ini 哪些配置项最容易过时
高频踩坑点集中在插件集成和核心行为覆盖上。比如:
-
addopts = --strict-markers:Pytest 7.0+ 已移除,应改用--strict或更细粒度的--strict-markers(仅当启用 markers 插件时才有效) -
python_files = test_*.py *_test.py:语法本身没废,但若混用testpaths+python_files,新版会优先以testpaths为准,旧配置可能被静默忽略 -
filterwarnings = ignore::DeprecationWarning:这行本身就会屏蔽掉你真正想看到的弃用提示,属于“自欺欺人型配置”
用 pytest --help 验证配置项是否还存在
别信记忆,也别信旧项目里的注释。每个版本的合法配置项都藏在帮助输出里:
- 运行
pytest --help,搜索你怀疑的选项名(如strict-markers),如果没出现在 help 输出中,基本可以判定已移除 - 对比不同版本的输出差异:比如 Pytest 6.x 的 help 里有
--strict-markers,而 7.4+ 的 help 里只剩--strict和--strict-config - 注意区分命令行参数和 ini 配置项:有些选项(如
--tb=short)支持 ini 写法tb = short,但有些(如--override-ini)根本不支持 ini 配置
自动化检查脚本怎么写(最小可行版)
不需要大工具链,一个 10 行以内的 Python 脚本就能跑通基础校验:
import subprocess
import sys
result = subprocess.run(
[sys.executable, "-W", "error::DeprecationWarning", "-m", "pytest", "--help"],
capture_output=True,
text=True
)
if "DeprecationWarning" in result.stderr:
print("⚠️ 检测到弃用警告,请检查 pytest.ini 中的配置项")
print(result.stderr)
把它加进 CI 的 pre-commit 或 nightly job 里,比人工 review 可靠得多。重点不是“一次清零”,而是“每次变更都能触发提醒”。
真正的难点不在识别,而在确认某项配置是否被替代、替代后行为是否等价——比如 python_classes = Test* 和 python_classes = *Test 在新版本下匹配逻辑可能不同,得结合实际测试文件结构验证。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











