在Python unittest中关闭某些打印输出

9 投票
3 回答
11975 浏览
提问于 2025-04-17 08:25

我在使用unittest这个测试工具,它在每次测试后会打印出“.”、“E”或“F”,分别表示“正常”、“错误”和“失败”。我想知道怎么把这些打印关掉?我用的是Python 2.7,这些打印信息是来自内置的运行类。

补充说明:我只是想去掉这些字符E、.和F,因为它们和我测试中的其他日志信息不在同一时间出现。

3 个回答

1

根据你使用的单元测试框架(比如标准框架、nose等),你有多种方法可以减少输出信息的详细程度:

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

虽然回复有点晚,但可能会对某些人有帮助。

你可以通过把详细程度设置为0来关闭E和F:

testRunner = unittest.TextTestRunner( verbosity = 0 )

这样你仍然可以在测试结束时看到最终结果和可能出现的错误或异常,这些信息会在标准错误输出中显示。

这个方法在Python 2.4和2.7中测试过。

12

unittest的输出会写入标准错误流,你可以把它导向其他地方。在*unix系统上,可以这样做:

python -m unittest some_module 2> /dev/null

在Windows上,你可以这样做(感谢Karl 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)

使用这个测试运行器,你现在可以享受无日志的测试体验。

需要注意的是:这在命令行中是无法实现的,遗憾的是。

撰写回答