gpt4 book ai didi

python - pytest capsys : checking output AND getting it reported?

转载 作者:太空狗 更新时间:2023-10-29 17:44:03 24 4
gpt4 key购买 nike

Python 3.4.1,pytest 2.6.2。

当测试失败时,pytest 将定期报告测试打印到标准输出的内容。例如这段代码:

def method_under_test():
print("Hallo, Welt!")
return 41

def test_result_only():
result = method_under_test()
assert result == 42

当作为 python -m pytest myfile.py 执行时,将报告:

================================== FAILURES ===================================
______________________________ test_result_only _______________________________

def test_result_only():
result = method_under_test()
> assert result == 42
E assert 41 == 42

pytestest.py:9: AssertionError
---------------------------- Captured stdout call -----------------------------
Hallo, Welt!
========================== 1 failed in 0.03 seconds ===========================

这是一个非常好的功能。但是当我使用 pytest 的内置 capsys fixture 时,像这样:

def test_result_and_stdout(capsys):
result = method_under_test()
out, err = capsys.readouterr()
assert out.startswith("Hello")
assert result == 42

报告不再包含实际输出:

================================== FAILURES ===================================
___________________________ test_result_and_stdout ____________________________

capsys = <_pytest.capture.CaptureFixture object at 0x000000000331FB70>

def test_result_and_stdout(capsys):
result = method_under_test()
out, err = capsys.readouterr()
> assert out.startswith("Hello")
E assert <built-in method startswith of str object at 0x000000000330C3B0>('Hello')
E + where <built-in method startswith of str object at 0x000000000330C3B0> = 'Hallo, Welt!\n'.startswith

pytestest.py:14: AssertionError
========================== 1 failed in 0.03 seconds ===========================

我不确定这种行为是否符合规范;pytest documentation说到 readouterr:"测试功能结束后原始流将被恢复。”

我试过假设 capsys 是一个上下文管理器并且有在断言之前调用了 capsys.__exit__()。这将是一个丑陋的解决方案,但至少是一个解决方案,如果它恢复了我断言之前的输出。然而,这只会产生

AttributeError: 'CaptureFixture' object has no attribute '__exit__'

接下来我查看了 CaptureFixture 类源代码并找到了一个看起来很有前途的方法 close (它调用一些 pop_outerr_to_orig() 方法),但是在我的测试中调用 capsys.close() 也没有帮助,根本没有明显的效果。

如何让 pytest 在失败时报告我的输出在使用 capsys 的测试中?

最佳答案

您看到了正确的行为,当您使用 capsys.readouterr() 时,您正在使用捕获的输出。因此,任何到 stdout 和 stderr 的输出将不再出现在测试报告中。但是您在此之后创建但未使用的任何新输出仍将被报告,因此您可以通过简单地将其再次写入输出流来将完整输出返回到报告中:

def test_result_and_stdout(capsys):
result = method_under_test()
out, err = capsys.readouterr()
sys.stdout.write(out)
sys.stderr.write(err)
assert out.startswith("Hello")
assert result == 42

关于python - pytest capsys : checking output AND getting it reported?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26561822/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com