浅谈Pytest中的warning处理

没有处理warning

  • 我们写一个简单的测试
import pytest

def test_demo():
import warnings
warnings.warn('test warn',DeprecationWarning)
assert True if __name__ == '__main__':
pytest.main(['-sv',__file__])
  • 你运行的话会有如下提示
============================= test session starts =============================
platform win32 -- Python 3.9.6, pytest-7.1.2, pluggy-1.0.0 -- D:\Python39\python.exe
cachedir: .pytest_cache
metadata: ...
rootdir: D:\pythonProject\AutoTest\PytestTemp, configfile: pytest.ini
plugins: ...
collecting ... collected 1 item test_demo.py::test_demo PASSED ============================== warnings summary ===============================
testCases/test_demo.py::test_demo
test_demo.py:5: DeprecationWarning: test warn
warnings.warn('test warn',DeprecationWarning) -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
======================== 1 passed, 1 warning in 0.05s ========================= 进程已结束,退出代码为 0
  • warning在pytest3.1之后会在执行期间捕获,初学者多见于mark漏了标记,可以参考浅谈Pytest中的marker

-W 命令行及处理

  • pytest提供了一个命令行参数-W

    -W PYTHONWARNINGS, --pythonwarnings=PYTHONWARNINGS
    含义:  set which warnings to report, see -W option of python itself.
  • python的-W

    -W arg : warning control; arg is action:message:category:module:lineno  also PYTHONWARNINGS=arg

    https://docs.python.org/3/library/warnings.html#warning-filter

  • 关于格式说明

    • action is one of the following strings:

      Value Disposition
      "default" print the first occurrence of matching warnings for each location (module + line number) where the warning is issued
      "error" turn matching warnings into exceptions
      "ignore" never print matching warnings
      "always" always print matching warnings
      "module" print the first occurrence of matching warnings for each module where the warning is issued (regardless of line number)
      "once" print only the first occurrence of matching warnings, regardless of location
    • message is a string containing a regular expression that the start of the warning message must match, case-insensitively. In -W and PYTHONWARNINGS, message is a literal string that the start of the warning message must contain (case-insensitively), ignoring any whitespace at the start or end of message.

    • category is a class (a subclass of Warning) of which the warning category must be a subclass in order to match.

    • module is a string containing a regular expression that the start of the fully qualified module name must match, case-sensitively. In -W and PYTHONWARNINGS, module is a literal string that the fully qualified module name must be equal to (case-sensitively), ignoring any whitespace at the start or end of module.

    • lineno is an integer that the line number where the warning occurred must match, or 0 to match all line numbers.


  • 增加命令行处理

    # action:message:category:module:lineno   # 注意格式
    -W error::DeprecationWarning # 意思是看到DeprecationWarning就把它当做是一个error
    ================================== FAILURES ===================================
    __________________________________ test_demo __________________________________ def test_demo():
    import warnings
    > warnings.warn('test warn',DeprecationWarning)
    E DeprecationWarning: test warn test_demo.py:5: DeprecationWarning
    =========================== short test summary info ===========================
    FAILED test_demo.py::test_demo - DeprecationWarning: test warn
    ============================== 1 failed in 0.09s ==============================
  • 可以看到case变成了failed


  • 换一下,改为ignore,case就PASSED了

    pytest.main(['-sv','-W ignore::DeprecationWarning',__file__])
    ============================== 1 passed in 0.07s ==============================

等价的装饰器pytest.mark.filterwarnings

  • 命令行的做法也可以等价到装饰器的写法,跟大多数的插件类似,命令行是针对所有的,装饰器是针对某个case的

    @pytest.mark.filterwarnings('ignore::DeprecationWarning')  # 装饰在被测函数上即可
    
    @pytest.mark.filterwarnings('error::DeprecationWarning')
    
    

等价的pytest.ini中的filterwarnings

  • 你也可以这样写一个pytest.ini

    [pytest]
    filterwarnings:
    ignore::DeprecationWarning
  • 或者这样

    [pytest]
    filterwarnings:
    error::DeprecationWarning

  • 还可以这样

    [pytest]
    filterwarnings:
    error
    ignore::DeprecationWarning

    这个意思是,所有的warning都被处理成error,但忽略DeprecationWarning。

    注意:当警告与列表中的多个选项匹配时,将执行最后一个匹配选项的操作。

关于warning的其他

  • --disable-warnings命令行选项可以禁用warning summary

    ============================== warnings summary ===============================
    testCases/test_demo.py::test_demo
    test_demo.py:5: DeprecationWarning: test warn
    warnings.warn('test warn',DeprecationWarning) -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
  • 上面的warning加了命令行之后就没了

  • 命令行的解释

      --disable-warnings, --disable-pytest-warnings  : disable warnings summary
    
    

  • 还有一个命令行-pno:warnings,完全禁用警告捕获

    pytest.main(['-sv','-pno:warnings',__file__])
    
    
  • 实测-pno:warnings的pno要挨在一起,这有点...

  • 命令行的解释

      -p name               early-load given plugin module name or
    entry point (multi-allowed).
    To avoid loading of plugins, use the
    `no:` prefix, e.g. `no:doctest`.
  • 如果你放在pytest.ini中的pno就可分可合(离谱)

    [pytest]
    addopts = -p no:warnings # -pno:warnings

浅谈Pytest中的warning处理的更多相关文章

  1. 浅谈Java中的equals和==(转)

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...

  2. 浅谈Linux中的信号处理机制(二)

    首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Lin ...

  3. 浅谈Java中的对象和引用

    浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...

  4. 浅谈Java中的equals和==

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...

  5. 转【】浅谈sql中的in与not in,exists与not exists的区别_

    浅谈sql中的in与not in,exists与not exists的区别   1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...

  6. 浅谈iOS中的userAgent

    浅谈iOS中的userAgent   User-Agent(用户代理)字符串是Web浏览器用于声明自身型号版本并随HTTP请求发送给Web服务器的字符串,在Web服务器上可以获取到该字符串. 在公司产 ...

  7. 浅谈JavaScript中的闭包

    浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...

  8. 浅谈sql中的in与not in,exists与not exists的区别

    转 浅谈sql中的in与not in,exists与not exists的区别   12月12日北京OSC源创会 —— 开源技术的年终盛典 »   sql exists in 1.in和exists ...

  9. 浅谈Java中的深拷贝和浅拷贝(转载)

    浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...

  10. 浅谈Java中的深拷贝和浅拷贝

    转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...

随机推荐

  1. AtCoder Beginner Contest 277 题解

    掉大分力(悲 A - ^{-1} 直接模拟. #include<bits/stdc++.h> #define IOS ios::sync_with_stdio(false) #define ...

  2. Kubernetes核心技术Pod

    Kubernetes核心技术Pod Pod概述 Pod是K8S系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在K8S上运行容器化应用的资源对象,其它的资源对象 ...

  3. SpringBoot怎么自定义一个Starter ?

    小伙伴们曾经可能都经历过整天写着CURD的业务,都没写过一些组件相关的东西,这篇文章记录一下SpringBoot如何自定义一个Starter. 原理和理论就不用多说了,可以在网上找到很多关于该方面的资 ...

  4. Java自定义排序

    实现Comparator接口 实现该接口需要重写compare()方法 Arrays.sort(students, new Comparator<Student>() { @Overrid ...

  5. HTTPS 基础知识(密钥、对称加密、非对称加密、数字签名、数字证书)

    HTTPS 概述 对称加密 非对称加密 非对称加密改良方案 非对称加密 + 对称加密 中间人攻击 数字证书 数字签名 HTTPS 工作原理 HTTPS 概述 HTTPS(全称:Hyper Text T ...

  6. 基于python的数学建模---scipy库

    instance1: 求解下列线性规划问题 s.t.   代码: from scipy import optimizeimport numpy as npc = np.array([2,3,-5])A ...

  7. java:绘制图形

    java绘图类:Graphics类 绘图是高级程序中必备的技术,在很多方面都能用到,如:绘制闪屏图片,背景图片和组件外观等. 1.Graphics类 Graphics类是所有图形上下文的抽象基类,Gr ...

  8. jquery组件解决option选项框的样式自定义方案

    记录一下今天工作中遇到的一个需求和自行找到的解决办法 需求: 在原始的select选项框中的增加一个标识.(我想增加一个具有样式的span元素,试了半天在option里无法添加span,更别说具有样式 ...

  9. CmakeLists简单使用总结

    单文件工程和多级目录工程CmakeLists.txt编写分享 你若发现该帖中有待商榷的地方,还请指正赐教,先行拜谢了! 1 main.c单文件工程CmakeLists.txt 1.1 目录结构 1.2 ...

  10. 如何使用C#在Excel中插入分页符

    在日常办公中,我们经常会用到Excel文档来帮助我们整理数据.为了方便打印Excel工作表,我们可以在Excel中插入分页符.各种处理软件一般都会自动按照用户所设置页面的大小自动进行分页,以美化文档的 ...