本文系《pytest源码剖析》系列内容
warnings 插件允许 pytest 控制哪些警告被忽略、显示或变成错误。
27. warnings
插件路径:_pytest.warnings
实现的 hook
调用的 hook
pytest_warning_recorded
定义的 fixture
无
插件功能
注册 markfilterwarnings,标记要警告控制方式
创建函数warning_record_to_str,将警告对象转为字符串
在以下 hook 环节,进行警告过滤:
pytest_load_initial_conftests:加载 conftest
pytest_collection:收集用例
pytest_runtest_protocol:执行用例
pytest_terminal_summary:输出摘要
pytest_sessionfinish:执行结束
代码片段
略
简评
pytest 中有 2 个和警告相关的插件:
recwarn:主要内对:记录警告,并进行断言
warings(本插件):主要对外,过滤或屏蔽代码引发的异常
recwarn插件,在本章节第 16 节,点此查看
...
warings插件也是调用 python 标准库warings,完成对警告的过滤
它只要启动了承上启下的作用:
首先提供了新的配置方式,
解决用pytest命令是无法给python传递-W参数的苦恼
其次通过对 hook 的使用,让警告过滤实施在了合适的位置
如何进行警告过滤
0. python 如何发出警告
import warnings
def call_user_warning(i=0): warnings.warn(f"这是一条用户警告 ({i=})", UserWarning) return 1
def call_deprecation_warning(): warnings.warn("这是一条弃用警告", DeprecationWarning) return 1
def call_syntax_warning(): warnings.warn("这是一条语法警告", SyntaxWarning) return 1
1. python 中如何进行警告过滤
代码中创建过滤规则
warnings.simplefilter("ignore") # 创建警告过滤规则:忽略所有警告call_user_warning()
warnings.simplefilter("default") # 创建警告过滤规则:正常显示警告call_user_warning()
warnings.simplefilter("error") # 创建警告过滤规则:弃用警告改为异常call_user_warning()
或者命令行参数创建规律规则
python -W error show_warnings.py
规则的语法是
action:message:category:module:line
看几个示例
default # 所有警告正常显示ignore # 所有警告忽略error # 所有警告转为异常error::ResourceWarning # 指定类型警告转为异常default::DeprecationWarning # 指定类型警告正常显示ignore,default:::mymodule # 只有模块`mymodule`中警告正常显示error:::mymodule # 只有模块`mymodule`中警告转为异常
2. pytest 中如何进行警告过滤
在配置文件中设置规则
[pytest]filterwarnings = error ignore::UserWarning default::DeprecationWarning
然后在用例中引发警告
import warnings
def test_syntax_warning(): # 会报错 warnings.warn('SyntaxWarning', category=SyntaxWarning)
def test_user_warning(): # 会忽略
warnings.warn('UserWarning', category=UserWarning)
def test_deprecation_warning(): # 会显示 warnings.warn('DeprecationWarning', category=DeprecationWarning)
执行结果
>pytest test_filter_warnings.py================ test session starts ================platform win32 -- Python 3.12.0, pytest-7.2.2, pluggy-1.0.0rootdir: D:\pytest_7.2.x, configfile: pytest.inicollected 3 items
test_filter_warnings.py F.. [100%]
================ FAILURES ================ ________________ test_syntax_warning ________________
def test_syntax_warning(): # 会报错> warnings.warn('SyntaxWarning', category=SyntaxWarning)E SyntaxWarning: SyntaxWarning
test_filter_warnings.py:6: SyntaxWarning================ warnings summary ================ test_filter_warnings.py::test_deprecation_warning D:\pytest_7.2.x\test_filter_warnings.py:17: DeprecationWarning: DeprecationWarning warnings.warn('DeprecationWarning', category=DeprecationWarning)
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html================ short test summary info ================ FAILED test_filter_warnings.py::test_syntax_warning - SyntaxWarning: SyntaxWarning================ 1 failed, 2 passed, 1 warning in 0.04s ================
领取专属 10元无门槛券
私享最新 技术干货