Welcome, guest | Sign In | My Account | Store | Cart

So far, there is no way of returning the results of the tests run with unittest in any form, except for having the results printed. The purpose of this code is to have the name of the test cases, their indexes, as well as the results (Pass, Fail, Error) as a list. This is extremely used when you want to create a table with the results, as it has all the information needed.

The affected file is the result.py in the unittest library folder.

Python, 117 lines
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# FILE: result.py

class TestResult(object):

    """Holder for test result information.



    Test results are automatically managed by the TestCase and TestSuite

    classes, and do not need to be explicitly manipulated by writers of tests.



    Each instance holds the total number of tests run, and collections of

    failures and errors that occurred among those test runs. The collections

    contain tuples of (testcase, exceptioninfo), where exceptioninfo is the

    formatted traceback of the error that occurred.

    """

    _previousTestClass = None

    _testRunEntered = False

    _moduleSetUpFailed = False

    def __init__(self, stream=None, descriptions=None, verbosity=None):

        self.failfast = False

        self.failures = []

        self.errors = []

        self.testsRun = 0

        self.skipped = []

        self.expectedFailures = []

        self.unexpectedSuccesses = []

        self.shouldStop = False

        self.buffer = False

        self._stdout_buffer = None

        self._stderr_buffer = None

        self._original_stdout = sys.stdout

        self._original_stderr = sys.stderr

        self._mirrorOutput = False



        # List containing all the run tests, their index and their result. This is the new line of code.

        self.tests_run = []


    ###
    ### New function added
    ###

    def getTestsReport(self):

        """Returns the run tests as a list of the form [test_description, test_index, result]"""

        return self.tests_run

        ### Rest of the code

    ###
    ### Modified the functions so that we add the test case to the tests run list.
    ### -1 means Failure. 0 means error. 1 means success. 
    ###

    def addError(self, test, err):

        """Called when an error has occurred. 'err' is a tuple of values as

        returned by sys.exc_info().

        """

        self.errors.append((test, self._exc_info_to_string(err, test)))

        self._mirrorOutput = True

        self.tests_run.append([test.shortDescription(), self.testsRun, 0])

    def addFailure(self, test, err):

        """Called when an error has occurred. 'err' is a tuple of values as

        returned by sys.exc_info()."""

        self.failures.append((test, self._exc_info_to_string(err, test)))

        self._mirrorOutput = True

        self.tests_run.append([test.shortDescription(), self.testsRun, -1])



    def addSuccess(self, test):

        "Called when a test has completed successfully"

        self.tests_run.append([test.shortDescription(), self.testsRun, 1])

4 comments

Joel 8 years, 11 months ago  # | flag

Can you give an example of how to call getTestsReport()? Thanks

Cosmin Niculae (author) 8 years, 11 months ago  # | flag

Hi, @Joel. I am glad after almost an year someone replies. Well, I have not used this since then, but from what I remember you need to directly call the method on the TestResult object. So, if result_instance's type is TestResult class, you just perform result_instance.getTestsReport() and it will return an array that you can then parse. I will try it myself if you still cannot make it run.

Jared Murrell 8 years, 5 months ago  # | flag

I signed up for an account just to say "Thanks for this!"

Abhilash 8 years ago  # | flag

Hi @Cosmin. Thanks for putting this up here. This is very valuable. However, whenever I save the result.py, these changes don't get saved. Is there a way I can save that file with these changes?