首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

pytest的内置插件盘点27. warnings | 对python警告信息进行忽略、显示或引发错误

本文系《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 ================

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OUpA-f7yeLVkX-p3Vy_z4TyA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券