我有这个示例代码( test_it.py
):
import sys
def give_me_5():
print >>sys.stdout, "STDOUT"
print >>sys.stderr, "STDERR"
return 6
import unittest
class TestMe(unittest.TestCase):
def setUp(self):
pass
def test_give_me_5(self):
self.assertEqual(give_me_5(), 5)
if __name__ == '__main__':
unittest.main()
这给了我以下输出:
» python -m unittest test_it
A long annoying output message
A long annoying error message
F
======================================================================
FAIL: test_give_me_5 (__main__.TestMe)
----------------------------------------------------------------------
Traceback (most recent call last):
File "xx.py", line 17, in test_give_me_5
self.assertEqual(give_me_5(), 5)
AssertionError: 6 != 5
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (failures=1)
但由于被测程序产生的长而恼人的消息(真正的程序产生很多输出),我无法看到unittest的输出 . 我想摆脱正在测试的函数的stdout / stderr( give_me_5
),但我仍然希望看到 unittest
的stdout / stderr . 我想得到这个结果:
» python -m unittest test_it
F
======================================================================
FAIL: test_give_me_5 (__main__.TestMe)
----------------------------------------------------------------------
Traceback (most recent call last):
File "xx.py", line 17, in test_give_me_5
self.assertEqual(give_me_5(), 5)
AssertionError: 6 != 5
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (failures=1)
因此,被测程序(stdout和stderr)产生的输出被unittest过滤掉, but the output produced by unittest itself is kept . 我不想修改被测试的代码(代码本身没有重定向) . 我只想告诉unittest所有输出到stdout / stderr的输出应该被丢弃 .
这可能吗?
3 回答
@Alik建议是对的 . 但我想它可以改进 .
并输出:
暂时将
sys.stdout
和sys.stderr
替换为类似文件的实例 . 例如,您可以使用StringIO aka内存缓冲区 .您可能希望添加异常处理,甚至可以在上下文管理器中将此代码转换为重用它
作为参考(和获得评论),这里是我最终使用的代码(灵感来自@Alik的回复):
现在只需执行
redirect_testcase(self)
,stdout / stderr重定向到test_it.TestMe.out
/test_it.TestMe.err
,并且unittest的输出在控制台stdout / stderr中可见(如果需要,可以通过shell重定向) .有一个问题(我还不知道如何修复):特定TestCase中的所有测试都将覆盖
.out
/.err
文件 . 为每个测试打开一个不同的out / log文件会很好(而不是每个TestCase的常用文件)