Простой вариант - просто запустить тесты без сбора результатов и позволить первому исключению разбиться в стеке (для произвольной посмертной обработки), например,
unittest.findTestCases(__main__).debug()
Другой вариант: переопределить unittest.TextTestResult
addError
и addFailure
в отладочном тестовом средстве для немедленной отладки post_mortem (до tearDown()
) - или для сбора и обработки ошибок и трассировок расширенным способом.
(Не требует дополнительных каркасов или дополнительного декоратора для методов тестирования)
Базовый пример:
import unittest, pdb
class TC(unittest.TestCase):
def testZeroDiv(self):
1 / 0
def debugTestRunner(post_mortem=None):
"""unittest runner doing post mortem debugging on failing tests"""
if post_mortem is None:
post_mortem = pdb.post_mortem
class DebugTestResult(unittest.TextTestResult):
def addError(self, test, err):
# called before tearDown()
traceback.print_exception(*err)
post_mortem(err[2])
super(DebugTestResult, self).addError(test, err)
def addFailure(self, test, err):
traceback.print_exception(*err)
post_mortem(err[2])
super(DebugTestResult, self).addFailure(test, err)
return unittest.TextTestRunner(resultclass=DebugTestResult)
if __name__ == '__main__':
##unittest.main()
unittest.main(testRunner=debugTestRunner())
##unittest.main(testRunner=debugTestRunner(pywin.debugger.post_mortem))
##unittest.findTestCases(__main__).debug()