在python unittest堆栈跟踪中禁用源输出

时间:2019-01-25 22:58:30

标签: python unit-testing

当遇到异常时,python中的unittest框架会输出堆栈跟踪。堆栈跟踪的每一行在输出中均附带源代码。这导致堆栈跟踪成为几百行滚动,而且我认为很难阅读。

是否有运行python unittest的方法,以便在捕获异常时,堆栈跟踪输出采用简化形式?我只想要源代码行,不包括所有多余的源代码。

1 个答案:

答案 0 :(得分:1)

TestResult.addError()的工作是格式化异常:

  

在测试用例 test 引发意外异常时调用。 err sys.exc_info()(type, value, traceback)返回的形式的元组。

     

默认实现将元组(test, formatted_err)附加到实例的errors属性,其中 formatted_err 是从 err 派生的格式化回溯。 >

如果要以不同的方式设置回溯的格式,则可以在此处进行更改。您有两种选择:

  • 编写自己的回溯格式化程序(以替换current implementation
  • 对基本实现添加的formatted_err值进行后处理。

后者可能更简单;只需删除以' File'开头的行之后的所有缩进行:

import re
import unittest
from functools import partial

# traceback `File` lines are followed by an optional source line, and if
# locals are included, by <name> = <value> lines:
_tb_file_line = re.compile(
        r'(  File "[^"]*", line \d+, in [^\n]+\n)'
        r'    [^ ].*\n'
        r'(?:    \w+ = .*\n)*'
)
_clear_source_and_locals = partial(_tb_file_line.sub, r'\1')

class NoSourceTracebackResult(unittest.TextTestResult):
    def addError(self, test, err):
        super().addError(test, err)
        # remove error, format, then put it back again
        t, formatted_err = self.errors.pop()
        formatted_err = _clear_source_and_locals(formatted_err)
        self.errors.append((test, formatted_err))

class NoSourceTracebackRunner(unittest.TextTestRunner):
    resultclass = NoSourceTracebackResult

然后将其用作测试跑步者;如果您在unittest.main()卫队中使用__main__运行,请像这样使用它:

if __name__ == '__main__':
    unittest.main(testRunner=NoSourceTracebackRunner)(