Search code examples
pythonpython-unittest

python unittest count tests


Is it possible with unittest to have an option tou count the number of total test number of skipped tests and number of run. And after the run the number of test failed (I know that it can be seen in the output). I would like to dump it in a json if I wan take it programatically that would be great

Thx a lot


Solution

  • After many trials and errors, I finally got this working...

    Based on scoffey's answer.

    Hope it helps.

    import unittest
    
    class MyTest(unittest.TestCase):
    
        currentResult = None # holds last result object passed to run method
    
        @classmethod
        def setResult(cls, amount, errors, failures, skipped):
            cls.amount, cls.errors, cls.failures, cls.skipped = \
                amount, errors, failures, skipped
    
        def tearDown(self):
            amount = self.currentResult.testsRun
            errors = self.currentResult.errors
            failures = self.currentResult.failures
            skipped = self.currentResult.skipped
            self.setResult(amount, errors, failures, skipped)
    
        @classmethod
        def tearDownClass(cls):
            print("\ntests run: " + str(cls.amount))
            print("errors: " + str(len(cls.errors)))
            print("failures: " + str(len(cls.failures)))
            print("success: " + str(cls.amount - len(cls.errors) - len(cls.failures)))
            print("skipped: " + str(len(cls.skipped)))
    
        def run(self, result=None):
            self.currentResult = result # remember result for use in tearDown
            unittest.TestCase.run(self, result) # call superclass run method
    
        def testA(self):
            self.assertTrue(True) # succeeds
    
        def testB(self):
            self.assertTrue(False) # fails
    
        def testC(self):
            self.assertTrue(1 + None is None) # raises TypeError
    
        @unittest.skip("skip it") # skipped
        def testD(self):
            self.assertTrue("whatever")
    
    if __name__ == '__main__':
        unittest.main() 
    

    run script with

    python test.py > result.txt
    

    result.txt:

    tests run: 3
    errors: 1
    failures: 1
    success: 1
    skipped: 1
    

    I'm not sure this is the best way, but it's working. Unittest module is easy to use but hard to master, now I feel I know little about it.