[Python] How to use Python Unittest TearDownClass with TestResult.wasSuccessful()

Discussão em 'Python' iniciado por Stack, Maio 5, 2025.

  1. Stack

    Stack Membro Participativo

    I wanted to call setUpClass and tearDownClass so that setup and teardown would be performed only once for each test. However, it keeps failing for me when I call tearDownClass. I only want to record 1 test result, either PASS if both tests passed or FAIL if both tests failed. If I call only setup and tearDown then all works fine:

    Calling setUpClass and tearDownClass:

    #!/usr/bin/python

    import datetime
    import itertools
    import logging
    import os
    import sys
    import time
    import unittest

    LOGFILE = 'logfile.txt'

    class MyTest(unittest.TestCase):

    global testResult
    testResult = None

    @classmethod
    def setUpClass(self):

    ## test result for DB Entry:
    self.dbresult_dict = {
    'SCRIPT' : 'MyTest.py',
    'RESULT' : testResult,
    }

    def test1(self):

    expected_number = 10
    actual_number = 10

    self.assertEqual(expected_number, actual_number)

    def test2(self):

    expected = True
    actual = True

    self.assertEqual(expected, actual)


    def run(self, result=None):
    self.testResult = result
    unittest.TestCase.run(self, result)

    @classmethod
    def tearDownClass(self):
    ok = self.testResult.wasSuccessful()
    errors = self.testResult.errors
    failures = self.testResult.failures
    if ok:
    self.dbresult_dict['RESULT'] = 'Pass'
    else:
    logging.info(' %d errors and %d failures',
    len(errors), len(failures))
    self.dbresult_dict['RESULT'] = 'Fail'

    if __name__ == '__main__':
    logger = logging.getLogger()
    logger.addHandler(logging.FileHandler(LOGFILE, mode='a'))
    stderr_file = open(LOGFILE, 'a')

    runner = unittest.TextTestRunner(verbosity=2, stream=stderr_file, descriptions=True)
    itersuite = unittest.TestLoader().loadTestsFromTestCase(MyTest)
    runner.run(itersuite)
    sys.exit()
    unittest.main(module=itersuite, exit=True)

    stderr_file.close()


    Error:

    test1 (__main__.MyTest) ... ok
    test2 (__main__.MyTest) ... ok
    ERROR
    ===================================================================
    ERROR: tearDownClass (__main__.MyTest)
    -------------------------------------------------------------------
    Traceback (most recent call last):
    File "testTearDownClass.py", line 47, in tearDownClass
    ok = self.testResult.wasSuccessful()
    AttributeError: type object 'MyTest' has no attribute 'testResult'
    ----------------------------------------------------------------------
    Ran 2 tests in 0.006s
    FAILED (errors=1)

    Continue reading...

Compartilhe esta Página