简体   繁体   中英

how to get the traceback of failed test (unittest) in the tearDown() function

I want to save all the traceback of all the exceptions from every failed test I run to an external file. Instead of using try and except in every test i would like to use the tearDown of unittest so it will be more generic.

something like:

import traceback
import unittest

class SomeTestCase(unittest.TestCase):
    def setUp(self):
        pass

    def test_some_test(self):
        self.assertTrue(False)

    def tearDown(self):
        with open(logger.txt, 'a') as doc:
            doc.write(traceback.format_exc())

the problem is that the exception that you get in the test_some_test cant be called with traceback in the teardown (the tracebacke return None)

any suggestion?

So after I went over a big piece of the unittest code I found a solution!

The TestCase class has an _outcome attribute.
The _outcome has a list type attribute called errors .
errors[0][1] is a tuple that is exactly like the sys.exc_info() output that contains the traceback.
So now that I have this tuple that I can use in traceback.format_exception() just like traceback.format_exc() uses it and problem solved .

def tearDown(self):
    try:
        etype, value, tb = self._outcome.errors[0][1]
        trace = ''.join(traceback.format_exception(etype=etype, value=value, tb=tb, limit=None))
        date = '{date}\n'.format(date=str(datetime.datetime.now()))
        name = '\n' + self._testMethodName + '-\n'
        with open(self.logger, 'a') as doc:
            doc.write(name + date + trace)
    except:
        pass

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM