2011-12-15 117 views
6

使用unittest进行测试,它会在每次测试完成后为“ok”,“error”和“fail”打印“。”,“E”或“F”。我如何关闭它?我使用Python 2.7,这些打印来自内置的亚军类。 覆盖这些类听起来非常困难,因为它们都是嵌套的。在python unittest中打开一些打印

编辑: 我只想脱掉字符E。和F,因为它们不会与我测试中的其他日志同时出现。

+0

你为什么要这样做?当然,看到测试的进展很有帮助吗? – 2011-12-15 09:47:57

+0

在我的情况下,它增加了混淆,因为我的测试并行运行,我打印1条日志消息,并且这些测试日志消息未与相应的“E”“F”或“。”同步。 。 – swan 2011-12-15 17:12:39

+0

如何在分离输出流的独立进程中运行这些测试? – 2013-02-06 14:03:32

回答

1

,取决于您所使用的单元测试框架(标准,鼻子......),你有多个方法来减少冗长:

python -m unittest -h 
... 
-q, --quiet  Minimal output 
... 
9

unittest输出写入标准错误流,它你可以管别的地方。在* nix框,这将有可能是这样的:

python -m unittest some_module 2> /dev/null 

在Windows中,这应该是这样的(感谢卡尔Knechtel):

python -m unittest some_module 2> NUL 

如果运行的Python测试,你可以简单地更换stderr流这样的:

import sys, os 

sys.stderr = open(os.devnull, 'w') 

... # do your testing here 

sys.stderr = sys.__stderr__ # if you still need the stderr stream 

由于您只是要关闭。,F,E符号的更新,因此您也可以通过覆盖默认的类来创建自己的TestResult类。在我的情况(Python 2.6中),这将是这样的:

import unittest 

class MyTestResult(unittest._TextTestResult): 
    def addSuccess(self, test): 
     TestResult.addSuccess(self, test) 
    def addError(self, test, err): 
     TestResult.addError(self, test, err) 
    def addFailure(self, test, err): 
     TestResult.addFailure(self, test, err) 

这有效地关闭了字符的打印,但保持默认功能。

现在我们还需要一个新的TestRunner类和重写_makeResult方法:

class MyTestRunner(unittest.TextTestRunner): 
    def _makeResult(self): 
     return MyTestResult(self.stream, self.descriptions, self.verbosity) 

有了这个亚军你现在可以享受一个日志免费检测。

只是说明:不幸的是,从命令行不可能这样做。

5

有点迟到的反应,但有人可能会觉得它有用。 你可以转动。 E和F关闭的详细级别设置为0:

testRunner = unittest.TextTestRunner(verbosity = 0) 

你仍然会有最终结果,并在在标准错误的测试结束时可能出现的错误/异常。

在Python 2.4和2.7中测试。