使用py.tests capys捕获stderr

时间:2015-04-10 17:00:28

标签: python pytest

我正在尝试使用py.tests capsys fixture来捕获标准错误流。但是,这似乎不像宣传的那样有效。鉴于这个简单的测试:

from sys import stderr


def test_capsys(capsys):
    print('foo')
    print('bar', file=stderr)

    out, err = capsys.readouterr()
    assert out == 'foo\n'
    assert err == 'bar\n'

在Python 3.4.3上使用py.test 2.7.0运行时生成以下输出:

    def test_capsys(capsys):
        print('foo')
        print('bar', file=stderr)

        out, err = capsys.readouterr()
        assert out == 'foo\n'
>       assert err == 'bar\n'
E       assert '' == 'bar\n'
E         + bar

test_capsys.py:10: AssertionError
----------------------------- Captured stderr call -----------------------------
bar

奇怪的是py.test报告错误流的正确内容,但capsys似乎没有捕获它。难道我做错了什么?这是一个错误吗?

1 个答案:

答案 0 :(得分:7)

capsys灯具的工作原理是将sys.stderr替换为自己的虚拟文件对象。在上面给出的代码中,此替换仅在测试导入sys.stderr之后发生,使其无用。要解决此问题,可以在测试中导入sys.stderr

def test_capsys(capsys):
    from sys import stderr

    print('foo')
    print('bar', file=stderr)

    out, err = capsys.readouterr()
    assert out == 'foo\n'
    assert err == 'bar\n'

documentation of the unittest.mock module

中更好地描述了此问题