Getting Python's unittest results in a tearDown() method

前端 未结 13 1368
野的像风
野的像风 2020-11-28 22:40

Is it possible to get the results of a test (i.e. whether all assertions have passed) in a tearDown() method? I\'m running Selenium scripts, and I\'d like to do some reporti

13条回答
  •  南笙
    南笙 (楼主)
    2020-11-28 23:07

    If you take a look at the implementation of unittest.TestCase.run, you can see that all test results are collected in the result object (typically a unittest.TestResult instance) passed as argument. No result status is left in the unittest.TestCase object.

    So there isn't much you can do in the unittest.TestCase.tearDown method unless you mercilessly break the elegant decoupling of test cases and test results with something like this:

    import unittest
    
    class MyTest(unittest.TestCase):
    
        currentResult = None # holds last result object passed to run method
    
        def setUp(self):
            pass
    
        def tearDown(self):
            ok = self.currentResult.wasSuccessful()
            errors = self.currentResult.errors
            failures = self.currentResult.failures
            print ' All tests passed so far!' if ok else \
                    ' %d errors and %d failures so far' % \
                    (len(errors), len(failures))
    
        def run(self, result=None):
            self.currentResult = result # remember result for use in tearDown
            unittest.TestCase.run(self, result) # call superclass run method
    
        def test_onePlusOneEqualsTwo(self):
            self.assertTrue(1 + 1 == 2) # succeeds
    
        def test_onePlusOneEqualsThree(self):
            self.assertTrue(1 + 1 == 3) # fails
    
        def test_onePlusNoneIsNone(self):
            self.assertTrue(1 + None is None) # raises TypeError
    
    if __name__ == '__main__':
        unittest.main()
    

    EDIT: This works for Python 2.6 - 3.3, (modified for new Python bellow).

提交回复
热议问题