在unittest docs [http://docs.python.org/2/library/unittest.html#unittest.main]中,我看到了以下描述的方法签名:
unittest.main([module[, defaultTest[, argv[, testRunner[, testLoader[, exit[, verbosity[, failfast[, catchbreak[, buffer]]]]]]]]]])
最后一个选项是“缓冲区”。文档解释了有关此选项的以下内容:
failfast,catchbreak和buffer参数与同名命令行选项具有相同的效果。
命令行选项[http://docs.python.org/2/library/unittest.html#command-line-options]的文档解释'缓冲区'如下:
-b, - 缓冲区
在测试运行期间缓冲标准输出和标准错误流。通过测试期间的输出被丢弃。输出在测试失败或错误时正常回显,并添加到失败消息中。
我有以下演示代码,但没有表现出预期的行为:
import unittest2
class DemoTest(unittest2.TestCase):
def test_one(self):
self.assertTrue(True)
def test_two(self):
self.assertTrue(True)
if __name__ == '__main__':
test_program = unittest2.main(verbosity=0, buffer=True, exit=False)
该程序的输出是:
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
事实上,如果我将程序中的最后一行改为:
,我会得到相同的输出test_program = unittest2.main(verbosity=0, buffer="hello", exit=False)
我做错了什么? (我尝试使用unittest
代替unittest2
,但没有区别。)
答案 0 :(得分:7)
关键是buffer option会影响测试中的stdout写入,忽略unittest2行为。也就是说,如果你添加像
这样的字符串,你会看到差异print "Suppress me!"
对于任何测试方法,如果选择buffer=False
,此表达式将显示在stdout上,而如果将其设置为True则将被禁止。
答案 1 :(得分:4)
正如我在评论中所解释的那样,buffer
只是缓冲测试代码的输出。这意味着您只能从unittest2
本身获得输出。它工作得很好。 (在你的情况下,它也很简单 - 你的代码不会打印任何东西,所以缓冲区没有缓冲区,这就是为什么没有它就得到相同的结果。)
如果您不想要unittest2
的任何输出,您始终可以使用重定向到/dev/null
的shell命令行运行该脚本,或者从脚本中导入unittest2
重定向sys.stdout
。
但通常你真的想读那个标准输出,而不是丢弃它。即使您不想将其记录在任何地方,也要检查最后一行是"OK"
,这样您就可以向编程团队发送电击或者在失败时执行任何操作。否则,通过cron
运行测试的重点是什么?