Отключение вывода источника в трассировках стека юнит-тестов Python - PullRequest
0 голосов
/ 26 января 2019

Фреймворк unittest в python выводит трассировку стека при возникновении исключения. Каждая строка трассировки стека сопровождается исходным кодом в выводе. Это приводит к тому, что трассировка стека составляет сотни строк прокрутки и, на мой взгляд, очень трудно читается.

Есть ли способ запустить тестовый модуль python, чтобы при обнаружении исключения вывод трассировки стека находился в укороченной форме? Я хотел бы только строки источника, исключая все дополнительные источники.

1 Ответ

0 голосов
/ 01 февраля 2019

Задачей 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)(
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...