编写 pytest 函数来检查控制台上的输出(stdout)

问题描述 投票:0回答:2

本文介绍了如何使用 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
,但得到了同样的错误。

出了什么问题以及如何修复?

python printing stdout pytest
2个回答
62
投票

使用

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 主要做三件事:

  1. 收集您的测试
  2. 运行测试
  3. 显示统计数据和可能的错误

默认情况下,

py.test
会在测试模块中查找(可配置的iirc
test_foo.py
测试模块和
test_foo()
测试功能。


8
投票

问题在于您在第一个代码片段块的最后显式调用测试函数:

test_add(sys.stdout)

你不应该这样做; pytest 的工作就是调用你的测试函数。 当它这样做时,它会识别名称

capsys
(或
capfd
,就此而言) 并自动为您提供合适的 pytest-internal 对象作为调用参数。 (pytest 文档中给出的示例非常完整。)

该对象将提供所需的

readouterr()
功能。
sys.stdout
没有这个功能,这就是你的程序失败的原因。

© www.soinside.com 2019 - 2024. All rights reserved.