Задачей 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)(