最稳定做法是在pytest.ini中配置filterwarnings,因其在测试启动前全局生效;测试函数内调用warnings.filterwarnings()常无效,因警告多在导入阶段(如import numpy触发runtimewarning)已发出,而函数内注册过晚。

直接在 pytest.ini 里配 filterwarnings 是最稳定、最推荐的做法,其他方式要么失效、要么干扰测试断言。
为什么测试函数里调用 warnings.filterwarnings() 常常无效
警告可能在模块导入阶段就触发了,比如 import numpy 时抛出 RuntimeWarning: invalid value encountered in double_scalars。而函数体内的 warnings.filterwarnings() 要等测试执行才运行,已经晚了。
- 真正生效的位置是:项目根目录的
conftest.py中的pytest_configure(config)钩子,或主测试模块顶部(确保 import 顺序早于触发警告的库) - 避免放在
setup_method、setUp()或测试函数内部 - Python 3.14+ 默认更严格,导入时触发的警告几乎不可能被函数内注册的过滤器捕获
pytest.ini 中 filterwarnings 的写法要点
只写 ignore::RuntimeWarning 很容易漏掉部分警告,必须明确作用域和匹配粒度。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
-
ignore::RuntimeWarning—— 忽略所有RuntimeWarning(最常用) -
ignore::FutureWarning:.*sklearn.*—— 只忽略 sklearn 相关的FutureWarning -
ignore:.*U.*mode is deprecated:DeprecationWarning—— 按消息正则匹配,精准屏蔽 pandas 的弃用提示 - 多个规则分行写,优先级按从上到下顺序,后匹配的规则会覆盖前面的
命令行 -W 参数适合什么场景
pytest -W ignore::RuntimeWarning 确实能立刻生效,但仅限临时调试。
- 多个类型需重复写:
-W ignore::RuntimeWarning -W ignore::UserWarning - 会干扰
pytest.warns()断言,导致Failed: DID NOT WARN - 不能用于 CI/CD 脚本或 Makefile —— 缺乏可维护性和稳定性
别忘了 pytest 自己的警告类型
除了 Python 标准警告,pytest 也会发自己的警告,比如 PytestReturnNotNoneWarning,这类警告不会被 ignore::RuntimeWarning 捕获。
- 它们需要单独配置:
ignore::PytestReturnNotNoneWarning - 常见于忘记写
assert、测试函数意外返回非None值的场景 - 这类警告默认不显示在终端,但会出现在 pytest 的警告汇总里,容易被忽略
真正难处理的不是警告本身,而是警告出现的时机——它可能发生在 import 阶段、fixture 初始化阶段、甚至 pytest 插件加载时。越早注册过滤器,越不容易漏掉;越依赖局部控制,越容易失效。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










