How to get failed, succes, error test cases names from the unittest. runner.TextTestResult?

Viewed 188

From the below code, how can I get failed, success, errored test case names from the result variable? A number of the failed, total test runs and all are possible from unittest. runner.TextTestResult. But I also want to know the failed test case name i.e Test_Sample1.test_2

import unittest

class Test_Sample1(unittest.TestCase):

    def test_1(self):
        pass

    def test_2(self):
        self.assertEqual(1,2)
    
    def test_3(self):
        pass


class Test_Sample2(unittest.TestCase):

    def test_1(self):
        pass

    def test_2(self):
        self.assertEqual(1,2)
    
    def test_3(self):
        pass

def main():
    unitt = unittest.main (verbosity = 2, exit=False)
    result = unitt.result

    print(f'wasSuccessful {result.wasSuccessful()}')
    print(f'errors {len(result.errors)}')
    print(f'failures {len(result.failures)}')
    print(f'testsRun {result.testsRun}')


if __name__ == '__main__':
    main()

1 Answers

You can use custom TestRunner + TestResult and configure it as you wish. Just an example:

import unittest
from unittest.runner import TextTestResult, TextTestRunner


class Test1(unittest.TestCase):
    def test_1(self):
        pass

    def test_2(self):
        self.assertEqual(1, 2)


class Test2(unittest.TestCase):
    def test_1(self):
        self.assertEqual(1, 2)

    @unittest.skip('skip example')
    def test_2(self):
        pass


def main():
    class CustomResult(TextTestResult):
        def __init__(self, *args, **kwargs):
            super(CustomResult, self).__init__(*args, **kwargs)
            self.success = []

        def addSuccess(self, test):
            super(CustomResult, self).addSuccess(test)
            self.success.append(test)

    unit = unittest.main(verbosity=2, exit=False, testRunner=TextTestRunner(resultclass=CustomResult))
    result = unit.result  # type: CustomResult
    # just do here all what you need...
    print('success:')
    for test in result.success:
        print(test)
    print('*' * 20 + '\n')

    print('skipped:')
    for test, reason in result.skipped:
        print('{}. reason: {}'.format(test, reason))
    print('*' * 20 + '\n')

    print('failures:')
    for test, trace in result.failures:
        print(test)
        # print(trace) ...if you need
    print('*' * 20 + '\n')

    for error in result.errors:
        # blablabla
        continue

result:

success:
test_1 (__main__.Test1)
********************

skipped:
test_2 (__main__.Test2). reason: skip example
********************

failures:
test_2 (__main__.Test1)
test_1 (__main__.Test2)
********************
Related