【问题标题】:Turn some print off in python unittest在 python unittest 中关闭一些打印
【发布时间】:2012-01-21 00:40:27
【问题描述】:

我正在使用 unittest,它会在每次测试后为“ok”、“error”和“fail”打印“.”、“E”或“F”。如何关闭它?我使用 Python 2.7,这些打印来自内置的 runner 类。 覆盖类听起来非常困难,因为它们都是嵌套的。

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

【问题讨论】:

  • 为什么要这样做?看看测试进度肯定会有帮助吗?
  • 在我的情况下,它增加了混乱,因为我的测试是并行运行的,我打印了 1 条日志消息,并且这些测试日志消息与相应的“E”“F”或“。”不同步。 .
  • 如何在单独的进程中运行这些测试,从而分离输出流?

标签: python unit-testing runner


【解决方案1】:

回复有点晚,但有人可能会觉得它很有用。 你可以转。通过将详细级别设置为 0 来关闭 E 和 F:

testRunner = unittest.TextTestRunner( verbosity = 0 )

在标准错误中的测试结束时,您仍然会看到最终结果和可能的错误/异常。

在 Python 2.4 和 2.7 中测试。

【讨论】:

    【解决方案2】:

    unittest 的输出被写入标准错误流,您可以将其通过管道传输到其他地方。在 *nix 盒子上,这可能是这样的:

    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)
    

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

    请注意:很遗憾,这在命令行中是不可能的。

    【讨论】:

    • os.devnull 是一个字符串。你的意思是open(os.devnull, 'w')
    • 我需要一些输出,我只想取消激活一些跟踪。这些字符。 E 和 F 写得不方便
    【解决方案3】:

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

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

    【讨论】:

    • "."、"E" 或 "F" 仍以-q 模式打印。
    • 我不通过命令 python -m unittest 运行我的测试,而是使用以下命令并行运行它们:code.activestate.com/recipes/391414
    • 在 Python 3.6 中,-q 似乎抑制了字母,但我认为这是很久以前修复的错误。仍将打印完整的测试失败输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多