8

在 unittest 文档 [ 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, --buffer
在测试运行期间缓冲标准输出和标准错误流。通过测试期间的输出将被丢弃。输出在测试失败或错误时正常回显,并添加到失败消息中。

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

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

4

2 回答 2

9

关键是buffer选项会影响测试中的标准输出写入,而忽略 unittest2 的行为。也就是说,你会看到不同之处,如果你添加像这样的字符串

print "Suppress me!"

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

于 2013-01-09T20:20:15.253 回答
4

正如我在评论中解释的那样,buffer只是缓冲测试代码的输出。这意味着您只能从unittest2自身获得输出。它运行良好。(在您的情况下,它的工作也很简单-您的代码不会打印任何内容,因此缓冲区到缓冲区没有任何内容,这就是为什么没有它您会得到相同的结果。)

如果您不想要任何输出unittest2,您始终可以使用重定向到的 shell 命令行运行脚本,或从重定向的脚本/dev/null导入。unittest2sys.stdout

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

于 2013-01-09T20:29:02.517 回答