Skip to content

Commit d70a9b2

Browse files
authored
Merge pull request #129 from xmlrunner/fixbranch
garbage collect test reference.
2 parents 1ff2df6 + e10012e commit d70a9b2

File tree

2 files changed

+31
-5
lines changed

2 files changed

+31
-5
lines changed

tests/testsuite.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,13 @@ def test_pass(self):
131131
# it is expected not to be called.
132132
pass # pragma: no cover
133133

134+
class DummyRefCountTest(unittest.TestCase):
135+
class dummy(object):
136+
pass
137+
def test_fail(self):
138+
inst = self.dummy()
139+
self.assertTrue(False)
140+
134141
def setUp(self):
135142
self.stream = StringIO()
136143
self.outdir = mkdtemp()
@@ -472,3 +479,16 @@ def test_xmlrunner_error_in_call(self):
472479
self._test_xmlrunner(suite)
473480
testsuite_output = self.stream.getvalue()
474481
self.assertIn('Exception: Massive fail', testsuite_output)
482+
483+
@unittest.skipIf(not hasattr(sys, 'getrefcount'),
484+
'skip - PyPy does not have sys.getrefcount.')
485+
@unittest.skipIf((3, 0) <= sys.version_info < (3, 4),
486+
'skip - test not garbage collected. '
487+
'https://bugs.python.org/issue11798.')
488+
def test_xmlrunner_hold_traceback(self):
489+
suite = unittest.TestSuite()
490+
suite.addTest(self.DummyRefCountTest('test_fail'))
491+
countBeforeTest = sys.getrefcount(self.DummyRefCountTest.dummy)
492+
runner = self._test_xmlrunner(suite)
493+
countAfterTest = sys.getrefcount(self.DummyRefCountTest.dummy)
494+
self.assertEqual(countBeforeTest, countAfterTest)

xmlrunner/result.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,15 +94,21 @@ def __init__(self, test_result, test_method, outcome=SUCCESS, err=None, subTest=
9494
self.test_result = test_result
9595
self.outcome = outcome
9696
self.elapsed_time = 0
97-
self.err = err
97+
if err:
98+
if self.outcome != _TestInfo.SKIP:
99+
self.test_exception_name = safe_unicode(err[0].__name__)
100+
self.test_exception_message = safe_unicode(err[1])
101+
else:
102+
self.test_exception_message = safe_unicode(err)
103+
98104
self.stdout = test_result._stdout_data
99105
self.stderr = test_result._stderr_data
100106

101107
self.test_description = self.test_result.getDescription(test_method)
102108
self.test_exception_info = (
103109
'' if outcome in (self.SUCCESS, self.SKIP)
104110
else self.test_result._exc_info_to_string(
105-
self.err, test_method)
111+
err, test_method)
106112
)
107113

108114
self.test_name = testcase_name(test_method)
@@ -422,18 +428,18 @@ def _report_testcase(test_result, xml_testsuite, xml_document):
422428
if test_result.outcome != test_result.SKIP:
423429
failure.setAttribute(
424430
'type',
425-
safe_unicode(test_result.err[0].__name__)
431+
test_result.test_exception_name
426432
)
427433
failure.setAttribute(
428434
'message',
429-
safe_unicode(test_result.err[1])
435+
test_result.test_exception_message
430436
)
431437
error_info = safe_unicode(test_result.get_error_info())
432438
_XMLTestResult._createCDATAsections(
433439
xml_document, failure, error_info)
434440
else:
435441
failure.setAttribute('type', 'skip')
436-
failure.setAttribute('message', safe_unicode(test_result.err))
442+
failure.setAttribute('message', test_result.test_exception_message)
437443

438444
_report_testcase = staticmethod(_report_testcase)
439445

0 commit comments

Comments
 (0)