最稳方案是在 pytest.ini 中配置 filterwarnings,因其在 ci 环境下可靠不遗漏;需按精确到宽泛顺序书写规则,如 ignore::deprecationwarning:selenium.* 优先于全局忽略,避免误杀自研警告。

直接在 pytest.ini 里配 filterwarnings 是最稳的方案,比命令行或代码内调用更可靠,尤其在 CI 环境下不会漏过滤。
为什么不能只写 ignore::DeprecationWarning 就完事
这个规则本身有效,但容易忽略两点:一是它会全局屏蔽所有 DeprecationWarning,包括你自己代码里该修的;二是如果项目里混用了多个第三方库(比如 selenium、botocore、pkg_resources),它们触发警告的模块路径不同,单条宽泛规则可能匹配不准,或者误杀。
- 实际常见情况是:警告来自
selenium.webdriver.remote.remote_connection或pkg_resources,但你自己的模块也用了DeprecationWarning提示重构点——这时候一刀切就丢了关键信号 - 更稳妥的做法是先定位警告来源,再精确过滤。比如运行一次
pytest -W default,看 warning summary 里具体报的是哪行、哪个模块 - 如果 warning summary 显示类似
/site-packages/selenium/.../remote_connection.py:24: DeprecationWarning,说明是 selenium 内部触发,可以针对性加ignore::DeprecationWarning:selenium.*
pytest.ini 中 filterwarnings 的写法和顺序陷阱
规则按从上到下顺序匹配,**第一条命中即终止,后续不执行**。这意味着你要把更具体的规则放前面,宽泛的放后面。
- 错误写法:
ignore::DeprecationWarning放第一行 → 后面所有规则都无效 - 推荐写法(按优先级降序):
[pytest] filterwarnings = ignore::DeprecationWarning:selenium.* ignore::DeprecationWarning:pkg_resources ignore::DeprecationWarning:urllib3.* ignore::DeprecationWarning - 注意冒号分隔:格式为
action:msg:category:module:lineno,其中module支持正则,selenium.*能覆盖selenium.webdriver和selenium.common - 如果 warning summary 里显示模块路径含
vendored(如botocore.vendored.requests),就得写ignore::DeprecationWarning:botocore.*vendored.*
为什么在测试函数里调用 warnings.filterwarnings() 常常失效
因为很多 DeprecationWarning 是在模块导入阶段就触发的,比如 import selenium.webdriver 时内部就 warn 了;而函数体里的 warnings.filterwarnings() 要等测试执行才运行,早就晚了。
- 典型表现:你加了
warnings.filterwarnings('ignore', category=DeprecationWarning),但 warning summary 里还是有 selenium 的警告 - 真正起作用的位置只有两个:项目根目录的
conftest.py里用pytest_configure钩子,或者在触发警告的模块被 import 之前,提前在__init__.py或主测试文件顶部注册 - 不建议放在
setup_method、setUp或 fixture 里——太迟,且 pytest 会重置警告过滤器 - 如果你必须临时调试,用
pytest -W ignore::DeprecationWarning -W ignore::FutureWarning可以快速验证,但别写进 CI 脚本,否则会干扰pytest.warns()断言
最常被忽略的一点是:warning summary 里显示的模块路径,和你本地 site-packages 实际路径可能不一致(尤其在虚拟环境或容器中),所以复制粘贴路径前务必确认是否真实存在。另外,某些警告(比如 access violation)根本不是 Python warnings 模块发出的,filterwarnings 对它们完全无效——那是 Windows 底层异常,得从驱动或环境层面解决。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











