我正在尝试使用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似乎无法捕获它。难道我做错了什么?这是一个错误吗?

最佳答案

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中可以更好地描述此问题。

关于python - 使用py.tests capsys捕获stderr,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29566904/

10-09 12:42