目录:

捕获警告信息

3.1版中的新功能。

从版本开始3.1,pytest现在会在测试执行期间自动捕获警告并在会话结束时显示它们:

# content of test_show_warnings.py

import warnings

def api_v1():

warnings.warn(UserWarning("api v1, should use functions from v2"))

return 1

def test_one():

assert api_v1() == 1

运行pytest现在产生这个输出:

$ pytest test_show_warnings.py

=========================== test session starts ============================

platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y

cachedir: $PYTHON_PREFIX/.pytest_cache

rootdir: $REGENDOC_TMPDIR

collected 1 item

test_show_warnings.py . [100%]

============================= warnings summary =============================

test_show_warnings.py::test_one

$REGENDOC_TMPDIR/test_show_warnings.py:5: UserWarning: api v1, should use functions from v2

warnings.warn(UserWarning("api v1, should use functions from v2"))

-- Docs: https://docs.pytest.org/en/latest/warnings.html

=================== 1 passed, 1 warnings in 0.12 seconds ===================

-W可以传递该标志以控制将显示哪些警告,甚至将其转换为错误:

$ pytest -q test_show_warnings.py -W error::UserWarning

F [100%]

================================= FAILURES =================================

_________________________________ test_one _________________________________

def test_one():

> assert api_v1() == 1

test_show_warnings.py:10:

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

def api_v1():

> warnings.warn(UserWarning("api v1, should use functions from v2"))

E UserWarning: api v1, should use functions from v2

test_show_warnings.py:5: UserWarning

1 failed in 0.12 seconds

可以pytest.ini使用filterwarningsini选项在文件中设置相同的选项。例如,以下配置将忽略所有用户警告,但会将所有其他警告转换为错误。

[pytest]

filterwarnings =

error

ignore::UserWarning

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

这两个-W命令行选项和filterwarningsINI选项是基于Python的 -W选项和warnings.simplefilter,所以请参考这些部分Python文档的其他例子和高级的用法英寸

@pytest.mark.filterwarnings

版本3.2中的新功能。

您可以使用@pytest.mark.filterwarnings向特定测试项添加警告过滤器,以便更好地控制应在测试,类甚至模块级别捕获哪些警告:

import warnings

def api_v1():

warnings.warn(UserWarning("api v1, should use functions from v2"))

return 1

@pytest.mark.filterwarnings("ignore:api v1")

def test_one():

assert api_v1() == 1

使用标记应用的过滤器优先于在命令行上传递或由filterwarningsini选项配置的过滤器。

您可以通过使用filterwarnings标记作为类装饰器或通过设置pytestmark变量将模块中的所有测试应用于类的所有测试:

# turns all warnings into errors for this module

pytestmark = pytest.mark.filterwarnings("error")

积分转到Florian Schulze获取 pytest-warnings插件中的参考实现。

禁用警告摘要

虽然不推荐,但您可以使用--disable-warnings命令行选项从测试运行输出中完全禁止警告摘要。

完全禁用警告捕获

此插件默认启用,但可以在您的pytest.ini文件中完全禁用:

[pytest]

addopts = -p no:warnings

或者传入命令行。如果测试套件使用外部系统处理警告,这可能很有用。-p no:warnings

弃用警告和待命记录警告

版本3.8中的新功能。

在3.9版中更改。

默认情况下,pytest将显示DeprecationWarning和PendingDeprecationWarning从用户代码和第三方库警告,建议PEP-0565。这有助于用户保持代码现代化,并在有效删除已弃用的警告时避免破坏。

有时隐藏在您无法控制的代码(例如第三方库)中发生的某些特定弃用警告很有用,在这种情况下,您可以使用警告过滤器选项(ini或标记)来忽略这些警告。

例如:

[pytest]

filterwarnings =

ignore:.*U.*mode is deprecated:DeprecationWarning

这将忽略DeprecationWarning消息开头与正则表达式匹配的所有类型的警告。".*U.*mode isdeprecated"

注意

如果在解释器级别配置警告,使用PYTHONWARNINGS环境变量或 -W命令行选项,pytest将默认不配置任何过滤器。

此外,pytest不遵循PEP-0506重置所有警告过滤器的建议,因为它可能会破坏通过调用自行配置警告过滤器的测试套件warnings.simplefilter(请参阅问题#2430 以获取该示例)。

确保代码触发弃用警告

您还可以调用全局帮助程序来检查某个函数调用是否触发a DeprecationWarning或PendingDeprecationWarning:

import pytest

def test_global():

pytest.deprecated_call(myfunction, 17)

默认情况下,DeprecationWarning并PendingDeprecationWarning不会被使用时,捕捉pytest.warns或recwarn因为默认的Python警告过滤器隐藏起来。如果您希望在自己的代码中记录它们,请使用以下命令warnings.simplefilter('always'):

import warnings

import pytest

def test_deprecation(recwarn):

warnings.simplefilter("always")

warnings.warn("deprecated", DeprecationWarning)

assert len(recwarn) == 1

assert recwarn.pop(DeprecationWarning)

您还可以将其用作上下文管理器:

def test_global():

with pytest.deprecated_call():

myobject.deprecated_method()

用警告功能断言警告

版本2.8中的新功能。

您可以检查代码是否引发了特定警告pytest.warns,其工作方式类似于引发:

import warnings

import pytest

def test_warning():

with pytest.warns(UserWarning):

warnings.warn("my warning", UserWarning)

如果未提出相关警告,测试将失败。match断言异常与文本或正则表达式匹配的关键字参数:

>>> with warns(UserWarning, match='must be 0 or None'):

... warnings.warn("value must be 0 or None", UserWarning)

>>> with warns(UserWarning, match=r'must be \d+/pre>):

... warnings.warn("value must be 42", UserWarning)

>>> with warns(UserWarning, match=r'must be \d+/pre>):

... warnings.warn("this is not here", UserWarning)

Traceback (most recent call last):

...

Failed: DID NOT WARN. No warnings of type ...UserWarning... was emitted...

您还可以调用pytest.warns函数或代码字符串:

pytest.warns(expected_warning, func, *args, **kwargs)

pytest.warns(expected_warning, "func(*args, **kwargs)")

该函数还返回所有引发警告(作为warnings.WarningMessage对象)的列表 ,您可以查询其他信息:

with pytest.warns(RuntimeWarning) as record:

warnings.warn("another warning", RuntimeWarning)

# check that only one warning was raised

assert len(record) == 1

# check that the message matches

assert record[0].message.args[0] == "another warning"

或者,您可以使用recwarn夹具详细检查凸起的警告 (见下文)。

注意

DeprecationWarning并且PendingDeprecationWarning区别对待; 请参阅确保代码触发弃用警告。

录制警告

您可以使用夹具pytest.warns或使用recwarn夹具记录凸起的警告。

要在pytest.warns不声明任何有关警告的情况下进行记录,请传递None为预期的警告类型:

with pytest.warns(None) as record:

warnings.warn("user", UserWarning)

warnings.warn("runtime", RuntimeWarning)

assert len(record) == 2

assert str(record[0].message) == "user"

assert str(record[1].message) == "runtime"

该recwarn夹具将记录整个函数的警告:

import warnings

def test_hello(recwarn):

warnings.warn("hello", UserWarning)

assert len(recwarn) == 1

w = recwarn.pop(UserWarning)

assert issubclass(w.category, UserWarning)

assert str(w.message) == "hello"

assert w.filename

assert w.lineno

双方recwarn并pytest.warns返回相同的接口,用于记录警告:一个WarningsRecorder实例。要查看记录的警告,您可以迭代此实例,调用len它以获取已记录警告的数量,或将其编入索引以获取特定记录的警告。

完整的API : WarningsRecorder.

自定义失败消息

记录警告提供了在未发出警告或满足其他条件时生成自定义测试失败消息的机会。

def test():

with pytest.warns(Warning) as record:

f()

if not record:

pytest.fail("Expected a warning!")

如果在呼叫时没有发出警告f,那么将评估为。然后,您可以使用自定义错误消息进行调用。notrecord``True``pytest.fail

内部pytest警告

版本3.8中的新功能。

pytest可能会在某些情况下生成自己的警告,例如使用不当或不推荐使用的功能。

例如,如果遇到匹配python_classes但也定义__init__构造函数的类,pytest将发出警告,因为这会阻止实例化类:

# content of test_pytest_warnings.py

class Test:

def __init__(self):

pass

def test_foo(self):

assert 1 == 1

$ pytest test_pytest_warnings.py -q

============================= warnings summary =============================

test_pytest_warnings.py:1

$REGENDOC_TMPDIR/test_pytest_warnings.py:1: PytestWarning: cannot collect test class 'Test' because it has a __init__ constructor

class Test:

-- Docs: https://docs.pytest.org/en/latest/warnings.html

1 warnings in 0.12 seconds

可以使用用于过滤其他类型警告的相同内置机制来过滤这些警告。

请阅读我们的向后兼容性政策,了解我们如何继续弃用并最终删除功能。

pytest使用以下警告类型,它们是公共API的一部分:

classPytestWarning

基类:UserWarning pytest发出的所有警告的基类。

classPytestDeprecationWarning

基类:pytest.PytestWarning 将来版本中将删除的功能的警告类。

classRemovedInPytest4Warning

基类:pytest.PytestDeprecationWarning 计划在pytest 4.0中删除的功能的警告类。

classPytestExperimentalApiWarning

基类:pytest.PytestWarning 警告类别用于表示pytest中的实验。谨慎使用,因为API可能会在未来版本中更改甚至完全删除

python捕捉warning_Pytest官方教程-10-捕获警告信息相关推荐

  1. python编写opencv-OpenCV官方教程中文版(for Python)pdf+自己编写的全套目录

    [实例简介] OpenCV官方教程中文翻译版,python语言,自做完整书签方便查找阅读 内容详细,是学OpenCV的必备教程 书虽然挺好的,但是不够全面,不能让读者完全了解 opencv的现状).而 ...

  2. 可转债交易薅羊毛策略 — Python 量化投资实战教程(10)

    往期推荐 量化投资原来这么简单(1) 量化投资原来这么简单(2)-MACD策略(+26.9%) 量化投资原来这么简单(3) -A股回测MACD策略 Python 量化投资原来这么简单(4) -KDJ ...

  3. opencv python下载_[福利] OpenCV4 Python 最新中文版官方教程来了(附下载)

    教程简介 OpenCV 是计算机视觉中经典的专用库,然而其中文版官方教程久久不来.近日,一款最新 OpenCV4.1 版本的完整中文版官方教程出炉,读者朋友可以更好的学习了解 OpenCV 相关细节. ...

  4. opencv python教程-OpenCV4 Python 最新中文版官方教程来了(附下载)

    教程简介 OpenCV 是计算机视觉中经典的专用库,然而其中文版官方教程久久不来.近日,一款最新 OpenCV4.1 版本的完整中文版官方教程出炉,读者朋友可以更好的学习了解 OpenCV 相关细节. ...

  5. python stdout stderr_Pytest官方教程-09-捕获stdout及stderr输出

    目录: 捕获stdout及stderr输出 默认 stdout/stderr/stdin 捕获行为 在测试执行期间,程序中的标准输出/标准错误输出都会被捕获到. 如果测试或setup方法执行失败时,会 ...

  6. labview python opencv_OpenCV官方教程中文版(for Python)pdf+自己编写的全套目录

    [实例简介] OpenCV官方教程中文翻译版,python语言,自做完整书签方便查找阅读 内容详细,是学OpenCV的必备教程 书虽然挺好的,但是不够全面,不能让读者完全了解 opencv的现状).而 ...

  7. 如何在Windows上做Python开发?微软出了官方教程(附链接)

    来源:机器之心 本文附教程,建议阅读5分钟. 本文为你分享微软最近发布的关于在Windows上做Python开发的一系列官方教程. 在Windows上做Python开发太痛苦?微软最近发布了一系列官方 ...

  8. 微软官方教程教你如何在Windows上做Python开发?

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 教程地址:https://docs.microsoft.com/zh-cn/win ...

  9. Caffe官方教程翻译(10):Editing model parameters

    前言 最近打算重新跟着官方教程学习一下caffe,顺便也自己翻译了一下官方的文档.自己也做了一些标注,都用斜体标记出来了.中间可能额外还加了自己遇到的问题或是运行结果之类的.欢迎交流指正,拒绝喷子! ...

  10. 【caffe】Caffe的Python接口-官方教程-01-learning-Lenet-详细说明(含代码)

    01-learning-Lenet, 主要讲的是 如何用python写一个Lenet,以及用来对手写体数据进行分类(Mnist).从此教程可以知道如何用python写prototxt,知道如何单步训练 ...

最新文章

  1. 独家 | 提速20倍!3个细节优化Tableau工作簿加载过程(附实例)
  2. 数据中心机房空调系统的这些“套路”你知多少?
  3. DirectX11 With Windows SDK--27 计算着色器:双调排序
  4. 【机器视觉】 deserialize_measure算子
  5. yum install nginx
  6. Markdown--编辑表格与矩阵
  7. C#的COM接口定义细则
  8. 5分钟快速部署PESCMS TEAM 团队任务管理系统开发版
  9. 【kafka】记一次线上kafka一直rebalance故障 消费慢 数据积压
  10. 漳州职业技术学院计算机学费多少钱,漳州职业技术学院单招2021年学费多少
  11. 如何进行多云环境中的数据管理?
  12. LeetCode 4Sum 4个数之和
  13. php中mysql_affected_rows()更新记录返回0_php中mysql_affected_rows()返回-1帶來的“陷阱” | 學步園...
  14. 计算机视觉中的对象跟踪(完整指南)
  15. xmind服务器维护,如何使用XMind组织您的待办事项?
  16. 7. 生信技能树——TCGA癌症数据2
  17. 开发一个智能问答机器人(优化篇)
  18. 美团java笔试题_美团笔试题目(Java后端5题2小时)
  19. 傻瓜式抠图工具,不用photoshop也能搞定抠图!
  20. 搭建K8S 的dashboard的坑the server could not find the requested resource

热门文章

  1. matlab命令 elempro,装好MATLAB后,The markup in the document preceding the root elem
  2. Similarity Reasoning and Filtration for Image-Text Matching
  3. 【专业课程】网络协议分析与安全
  4. 数据科学家:大器晚成,是软件工程师成功的唯一捷径
  5. Java前叉夹器_大器晚成 SRAM S-900直装夹器评测
  6. 如何从数据库中选出最热的十个检索词
  7. 离开谷歌回归斯坦福,“AI女神”李飞飞新动向揭晓
  8. HTML <meta> http-equiv 属性
  9. Linux系统优化篇
  10. 所有能反演SIF的卫星以及下载链接