python unittest使用“buffer”选项来抑制stdout我该怎么做?

2024-09-29 01:30:03 发布

您现在位置:Python中文网/ 问答频道 /正文

在unittest文档[http://docs.python.org/2/library/unittest.html#unittest.main]中,我看到下面描述的方法签名:

unittest.main([module[, defaultTest[, argv[, testRunner[, testLoader[, exit[, verbosity[, failfast[, catchbreak[, buffer]]]]]]]]]])

最后一个选项是“buffer”。文档解释了关于此选项的以下内容:

The failfast, catchbreak and buffer parameters have the same effect as the same-name command-line options.

命令行选项[http://docs.python.org/2/library/unittest.html#command-line-options]的文档对“buffer”的解释如下:

-b, --buffer
The standard output and standard error streams are buffered during the test run. Output during a passing test is discarded. Output is echoed normally on test fail or error and is added to the failure messages.

我有以下演示代码,它没有显示预期的行为:

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


Tags: andthe文档testselftruehttpis
2条回答

正如我在注释中所解释的,buffer只是缓冲测试代码的输出。这意味着您只能从unittest2本身获得输出。它工作得很好。(在您的例子中,它的工作也很简单,您的代码不会打印出任何内容,因此缓冲区与缓冲区之间没有任何内容,这就是为什么没有它,您会得到相同的结果。)

如果您也不想从unittest2获得任何输出,则可以始终使用重定向到/dev/null的shell命令行运行该脚本,或者从重定向到sys.stdout的脚本导入unittest2

但通常你真的想读那个标准输出,而不仅仅是丢弃它。即使你不想把它记录在任何地方,你也要检查最后一行是否是"OK",这样你就可以向你的编程团队发送电击,或者在失败时执行任何操作。否则,通过cron运行测试有什么意义?

关键是buffer option会影响在测试中编写stdout,而忽略unittest2行为的影响。也就是说,如果您添加字符串

print "Suppress me!"

对于任何测试方法,如果选择buffer=False,则此表达式将出现在stdout上,而如果将其设置为True,则它将被抑制。

相关问题 更多 >