diff --git a/tests/testsuite.py b/tests/testsuite.py index 55a0c55..1c2a530 100755 --- a/tests/testsuite.py +++ b/tests/testsuite.py @@ -92,6 +92,13 @@ def __call__(self, result): def test_pass(self): pass + class DummyRefCountTest(unittest.TestCase): + class dummy(object): + pass + def test_fail(self): + inst = self.dummy() + self.assertTrue(False) + def setUp(self): self.stream = StringIO() self.outdir = mkdtemp() @@ -407,3 +414,11 @@ def test_xmlrunner_error_in_call(self): self._test_xmlrunner(suite) testsuite_output = self.stream.getvalue() self.assertIn('Exception: Massive fail', testsuite_output) + + def test_xmlrunner_hold_traceback(self): + suite = unittest.TestSuite() + suite.addTest(self.DummyRefCountTest('test_fail')) + countBeforeTest = sys.getrefcount(self.DummyRefCountTest.dummy) + runner = self._test_xmlrunner(suite) + countAfterTest = sys.getrefcount(self.DummyRefCountTest.dummy) + self.assertEqual(countBeforeTest, countAfterTest) diff --git a/xmlrunner/result.py b/xmlrunner/result.py index 9b60988..9875f34 100644 --- a/xmlrunner/result.py +++ b/xmlrunner/result.py @@ -94,7 +94,13 @@ def __init__(self, test_result, test_method, outcome=SUCCESS, err=None, subTest= self.test_result = test_result self.outcome = outcome self.elapsed_time = 0 - self.err = err + if err: + if self.outcome != _TestInfo.SKIP: + self.test_exception_name = safe_unicode(err[0].__name__) + self.test_exception_message = safe_unicode(err[1]) + else: + self.test_exception_message = safe_unicode(err) + self.stdout = test_result._stdout_data self.stderr = test_result._stderr_data @@ -102,7 +108,7 @@ def __init__(self, test_result, test_method, outcome=SUCCESS, err=None, subTest= self.test_exception_info = ( '' if outcome in (self.SUCCESS, self.SKIP) else self.test_result._exc_info_to_string( - self.err, test_method) + err, test_method) ) self.test_name = testcase_name(test_method) @@ -411,18 +417,18 @@ def _report_testcase(test_result, xml_testsuite, xml_document): if test_result.outcome != _TestInfo.SKIP: failure.setAttribute( 'type', - safe_unicode(test_result.err[0].__name__) + test_result.test_exception_name ) failure.setAttribute( 'message', - safe_unicode(test_result.err[1]) + test_result.test_exception_message ) error_info = safe_unicode(test_result.get_error_info()) _XMLTestResult._createCDATAsections( xml_document, failure, error_info) else: failure.setAttribute('type', 'skip') - failure.setAttribute('message', safe_unicode(test_result.err)) + failure.setAttribute('message', test_result.test_exception_message) _report_testcase = staticmethod(_report_testcase)