在python unittest中打开一些打印件

swa*_*wan 7 python unit-testing runner

我使用unittest并在每次测试后打印".","E"或"F"表示"ok","error"和"fail".我该如何关闭它?我使用Python 2.7,这些打印来自内置的转轮类.听起来非常难以覆盖类,因为它都是嵌套的.

编辑:我只想取下角色E. 和F因为它们与我的测试中的其他一些日志不同时出现.

Con*_*ius 10

输出将unittest写入标准错误流,您可以将其输出到其他位置.在*nix框中,这可能是这样的:

python -m unittest some_module 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

在Windows上,这应该是这样的(感谢Karl Knechtel):

python -m unittest some_module 2> NUL
Run Code Online (Sandbox Code Playgroud)

如果你从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
Run Code Online (Sandbox Code Playgroud)

由于您只想关闭.,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)
Run Code Online (Sandbox Code Playgroud)

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

现在我们还需要一个新TestRunner类并覆盖该_makeResult方法:

class MyTestRunner(unittest.TextTestRunner):
    def _makeResult(self):
        return MyTestResult(self.stream, self.descriptions, self.verbosity)
Run Code Online (Sandbox Code Playgroud)

有了这个跑步者,您现在可以享受无日志测试.

请注意:遗憾的是,命令行无法实现这一点.


Kar*_*dur 7

有点迟到的反应,但有人可能会发现它很有用.你可以转.通过将详细级别设置为0来关闭E和F:

testRunner = unittest.TextTestRunner( verbosity = 0 )
Run Code Online (Sandbox Code Playgroud)

在stderr的测试结束时,您仍将获得最终结果和可能的错误/异常.

在Python 2.4和2.7中测试过.


tit*_*ito 1

根据您使用的单元测试框架(标准、nose...),您有多种方法来减少冗长:

python -m unittest -h
...
-q, --quiet      Minimal output
...
Run Code Online (Sandbox Code Playgroud)