python unittest - 使用'buffer'选项来抑制stdout - 我该怎么办?

时间:2013-01-09 20:04:07

标签: python unit-testing

在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,但没有区别。)

2 个答案:

答案 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运行测试的重点是什么?