我正在为下一个函数编写测试:
def foo():
print 'hello world!'
所以当我想测试这个函数时,代码将是这样的:
import sys
from foomodule import foo
def test_foo():
foo()
output = sys.stdout.getline().strip() # because stdout is an StringIO instance
assert output == 'hello world!'
但是如果我使用 -s 参数运行鼻子测试,测试就会崩溃。如何使用unittest或nose模块捕获输出?
我用这个上下文管理器捕获输出。它最终使用与其他一些答案相同的技术,暂时替换sys.stdout
。我更喜欢上下文管理器,因为它将所有簿记包装到一个函数中,因此我不必重新编写任何 try-finally 代码,也不必为此编写设置和拆卸函数。
import sys
from contextlib import contextmanager
from StringIO import StringIO
@contextmanager
def captured_output():
new_out, new_err = StringIO(), StringIO()
old_out, old_err = sys.stdout, sys.stderr
try:
sys.stdout, sys.stderr = new_out, new_err
yield sys.stdout, sys.stderr
finally:
sys.stdout, sys.stderr = old_out, old_err
像这样使用它:
with captured_output() as (out, err):
foo()
# This can go inside or outside the `with` block
output = out.getvalue().strip()
self.assertEqual(output, 'hello world!')
此外,由于退出时恢复原始输出状态with
块,我们可以在与第一个捕获块相同的函数中设置第二个捕获块,这是使用设置和拆卸函数不可能实现的,并且在手动编写 try-finally 块时会变得冗长。当测试的目标是比较两个函数的结果而不是与某个预先计算的值时,这种能力就派上用场了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)