本文介绍了如何使用 pytest 捕获控制台输出。我尝试了以下代码,但出现错误
import sys
import pytest
def f(name):
print "hello "+ name
def test_add(capsys):
f("Tom")
out,err=capsys.readouterr()
assert out=="hello Tom"
test_add(sys.stdout)
输出:
python test_pytest.py
hello Tom
Traceback (most recent call last):
File "test_pytest.py", line 12, in <module>
test_add(sys.stdout)
File "test_pytest.py", line 8, in test_add
out,err=capsys.readouterr()
AttributeError: 'file' object has no attribute 'readouterr'
我也尝试用
capsys
替换 capfd
,但得到了同样的错误。
出了什么问题以及如何修复?
使用
capfd
夹具。
示例:
def test_foo(capfd):
foo() # Writes "Hello World!" to stdout
out, err = capfd.readouterr()
assert out == "Hello World!"
请参阅:http://pytest.org/en/latest/fixture.html了解更多详细信息
请参阅:
py.test --fixtures
了解内置灯具列表。
您的示例有一些问题。这是更正后的版本:
def f(name):
print "hello {}".format(name)
def test_f(capfd):
f("Tom")
out, err = capfd.readouterr()
assert out == "hello Tom\n"
注:
sys.stdout
-- 按 pytest 提供的 capfd
夹具使用。py.test foo.py
测试运行输出:
$ py.test foo.py
====================================================================== test session starts ======================================================================
platform linux2 -- Python 2.7.5 -- pytest-2.4.2
plugins: flakes, cache, pep8, cov
collected 1 items
foo.py .
=================================================================== 1 passed in 0.01 seconds ====================================================================
另请注意:
py.test
(CLI 工具和测试运行器)可以为您完成此操作。py.test 主要做三件事:
默认情况下,
py.test
会在测试模块中查找(可配置的iirc)test_foo.py
测试模块和test_foo()
测试功能。
问题在于您在第一个代码片段块的最后显式调用测试函数:
test_add(sys.stdout)
你不应该这样做; pytest 的工作就是调用你的测试函数。 当它这样做时,它会识别名称
capsys
(或 capfd
,就此而言)
并自动为您提供合适的 pytest-internal 对象作为调用参数。
(pytest 文档中给出的示例非常完整。)
该对象将提供所需的
readouterr()
功能。
sys.stdout
没有这个功能,这就是你的程序失败的原因。