为一项测试更改 pytest 捕获

Posted

技术标签:

【中文标题】为一项测试更改 pytest 捕获【英文标题】:Change pytest capturing for one test 【发布时间】:2016-12-08 09:39:28 【问题描述】:

是否可以仅针对一项测试(即在测试脚本中)更改 pytest 中的捕获行为?

我有一堆与pytest 一起使用的测试。在一些测试中我喜欢打印几个有用的数量,所以我使用-s 标志在pytest 输出中显示它们。但我也测试了警告,这些警告也会被打印出来,看起来很丑陋和分散注意力。我已经尝试像往常一样使用warnings.simplefilter 来不显示警告,但这似乎没有任何作用。 (也许pytest 破解它???)无论如何,我想要一些方法来消除警告,但仍然检查它们是否被引发,同时还能够从我的其他打印语句中看到捕获的输出。有什么方法可以做到这一点 - 例如,仅更改一个测试函数的捕获?

【问题讨论】:

【参考方案1】:

在 pytest 3.x 中,有一个 easy way 可以暂时禁用捕获(请参阅有关 capsys.disabled() 的部分。

还有pytest-warnings 插件,它在专门的报告部分显示警告。

【讨论】:

感谢您指出这些;他们看起来都很棒。我尝试从 github 安装,但它说 capsys 没有 disabled 属性。一定很前卫! :) master 分支用于稳定版本,因此要查看upcoming in 3.0(很多!)您需要使用features 分支。 啊,我明白了。谢谢。【参考方案2】:

我已经通过手动重定向stderr

import os
import sys
import warnings
import pytest

def test():
    stderr = sys.stderr
    sys.stderr = open(os.devnull, 'w')
    with pytest.warns(UserWarning):
        warnings.warn("Warning!", UserWarning)
    sys.stderr = stderr

如果不需要其他打印语句,我可以类似地将 stdout 重定向到 devnull。

【讨论】:

以上是关于为一项测试更改 pytest 捕获的主要内容,如果未能解决你的问题,请参考以下文章

如何让 pytest 不捕获异常

pytest 如何在第一项断言失败后不退出 for 循环

无法在装饰器中捕获 pytest 的结果

如何在运行pytest测试时随意执行ipdb.set_trace()

python ----> pytest 测试框架

用 pytest 测试 python 代码