当遇到异常时,python中的unittest框架会输出堆栈跟踪。堆栈跟踪的每一行在输出中均附带源代码。这导致堆栈跟踪成为几百行滚动,而且我认为很难阅读。
是否有运行python unittest的方法,以便在捕获异常时,堆栈跟踪输出采用简化形式?我只想要源代码行,不包括所有多余的源代码。
答案 0 :(得分:1)
TestResult.addError()
的工作是格式化异常:
在测试用例 test 引发意外异常时调用。 err 是
sys.exc_info()
:(type, value, traceback)
返回的形式的元组。默认实现将元组
(test, formatted_err)
附加到实例的errors
属性,其中 formatted_err 是从 err 派生的格式化回溯。 >
如果要以不同的方式设置回溯的格式,则可以在此处进行更改。您有两种选择:
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)(