七、捕获告警信息

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、DeprecationWarningPendingDeprecationWarning告警

pytest会默认捕获DeprecationWarningPendingDeprecationWarning类型的告警;可以通过在pytest.ini添加配置;例如,忽略告警信息匹配".*U.*mode is deprecated"DeprecationWarning告警:

 

 

 

(1)pytest.deprecated_call方法

通过deprecated_call方法确保一段代码触发了DeprecationWarningPendingDeprecationWarning告警:

 

 

 

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

 

posted @ 2020-03-24 20:01  晨尛  阅读(333)  评论(0编辑  收藏  举报