我正在尝试使用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/