七、捕获告警信息
1、告警信息的默认捕获行为
pytest
可以自动捕获测试中产生的告警信息,并在执行结束后进行展示;
可以通过-W arg
命令行选项来自定义告警的捕获行为:
arg
参数的格式为:action:message:category:module:lineno
;
action
只能在"error", "ignore", "always(all)", "default", "module", "once"
中取值,默认取值为default
;category
必须是Warning
的子类,默认取值为Warning
类,表示所有的告警;module
必须为字符串,表示特定模块产生的告警信息;
使用场景:
(1)忽略某一种类型的告警信息;例如,忽略UserWarning
类型的告警(-W ignore::UserWarning
):
(2)将某一种类型的告警转换为异常来处理;例如,将UserWarning
告警转换为异常处理(-W error::UserWarning
):
(3)只展示某一个模块中产生的告警;例如,只展示test_show_warnings
模块产生的告警,忽略其它所有的告警(-W ignore -W default:::test_show_warnings
):
多个-W
选项的组合操作,优先级是从左到右依次递增的;这里如果将它们调换一下顺序(即-W default:::test_show_warnings -W ignore
),因为-W ignore
最后生效,覆盖掉之前的操作,最终的结果就是我们一个告警信息都没有捕获到;
(4)可以通过在pytest.ini
文件中配置filterwarnings
项,来实现同样的效果;例如,上述的例子在pytest.ini
的配置为:
2、@pytest.mark.filterwarnings
通过为测试项添加告警过滤器,通过@pytest.mark.filterwarnings
添加的过滤器优先级要高于命令行或pytest.ini
添加的过滤器;可以通过将@pytest.mark.filterwarnings
应用于测试类来为这个类中所有的用例添加告警过滤器;
3、去使能告警信息显示
通过--disable-warnings
命令行选项来禁止告警信息的展示
4、通过-p no:warnings
命令行选项彻底禁止告警的捕获行为:
5、DeprecationWarning
和PendingDeprecationWarning告警
pytest
会默认捕获DeprecationWarning
和PendingDeprecationWarning
类型的告警;可以通过在pytest.ini
添加配置;例如,忽略告警信息匹配".*U.*mode is deprecated"
的DeprecationWarning
告警:
(1)pytest.deprecated_call方法
通过deprecated_call
方法确保一段代码触发了DeprecationWarning
或PendingDeprecationWarning
告警:
6、编写触发期望告警的断言
使用pytest.warns()
作为上下文管理器,来编写一个触发期望告警的断言,它和pytest.raises()
的用法很接近;
(1)自定义失败是的告警信息
如果api_call_v1
没有触发任何告警,pytest
就会显示pytest.fail
中自定义的提示消息;
7、通过recwarn
来实现同样的功能;
recwarn
是一个用例级别的fixture
,它可以记录用例产生的所有的告警;recwarn
和之前pytest.warns()
返回值一样,都是一个WarningsRecorder
的实例;
8、pytest自定义的告警类型
pytest
本身封装了一些告警的类型,并作为公共接口以供用户使用; 一些常见的内部告警:
告警 | 父类 | 描述 |
---|---|---|
PytestWarning |
UserWarning |
所有告警的父类; |
PytestCollectionWarning |
PytestWarning |
不能够收集某个模块中的用例; |
PytestConfigWarning |
PytestWarning |
配置错误; |
PytestUnknownMarkWarning |
PytestWarning |
使用了未知的标记; |
参考:https://docs.pytest.org/en/5.1.3/warnings.html#pytest.PytestWarning