七、捕获告警信息
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

浙公网安备 33010602011771号