|  | import io | 
|  | import sys | 
|  |  | 
|  | import unittest | 
|  |  | 
|  |  | 
|  | def resultFactory(*_): | 
|  | return unittest.TestResult() | 
|  |  | 
|  |  | 
|  | class TestSetups(unittest.TestCase): | 
|  |  | 
|  | def getRunner(self): | 
|  | return unittest.TextTestRunner(resultclass=resultFactory, | 
|  | stream=io.StringIO()) | 
|  | def runTests(self, *cases): | 
|  | suite = unittest.TestSuite() | 
|  | for case in cases: | 
|  | tests = unittest.defaultTestLoader.loadTestsFromTestCase(case) | 
|  | suite.addTests(tests) | 
|  |  | 
|  | runner = self.getRunner() | 
|  |  | 
|  | # creating a nested suite exposes some potential bugs | 
|  | realSuite = unittest.TestSuite() | 
|  | realSuite.addTest(suite) | 
|  | # adding empty suites to the end exposes potential bugs | 
|  | suite.addTest(unittest.TestSuite()) | 
|  | realSuite.addTest(unittest.TestSuite()) | 
|  | return runner.run(realSuite) | 
|  |  | 
|  | def test_setup_class(self): | 
|  | class Test(unittest.TestCase): | 
|  | setUpCalled = 0 | 
|  | @classmethod | 
|  | def setUpClass(cls): | 
|  | Test.setUpCalled += 1 | 
|  | unittest.TestCase.setUpClass() | 
|  | def test_one(self): | 
|  | pass | 
|  | def test_two(self): | 
|  | pass | 
|  |  | 
|  | result = self.runTests(Test) | 
|  |  | 
|  | self.assertEqual(Test.setUpCalled, 1) | 
|  | self.assertEqual(result.testsRun, 2) | 
|  | self.assertEqual(len(result.errors), 0) | 
|  |  | 
|  | def test_teardown_class(self): | 
|  | class Test(unittest.TestCase): | 
|  | tearDownCalled = 0 | 
|  | @classmethod | 
|  | def tearDownClass(cls): | 
|  | Test.tearDownCalled += 1 | 
|  | unittest.TestCase.tearDownClass() | 
|  | def test_one(self): | 
|  | pass | 
|  | def test_two(self): | 
|  | pass | 
|  |  | 
|  | result = self.runTests(Test) | 
|  |  | 
|  | self.assertEqual(Test.tearDownCalled, 1) | 
|  | self.assertEqual(result.testsRun, 2) | 
|  | self.assertEqual(len(result.errors), 0) | 
|  |  | 
|  | def test_teardown_class_two_classes(self): | 
|  | class Test(unittest.TestCase): | 
|  | tearDownCalled = 0 | 
|  | @classmethod | 
|  | def tearDownClass(cls): | 
|  | Test.tearDownCalled += 1 | 
|  | unittest.TestCase.tearDownClass() | 
|  | def test_one(self): | 
|  | pass | 
|  | def test_two(self): | 
|  | pass | 
|  |  | 
|  | class Test2(unittest.TestCase): | 
|  | tearDownCalled = 0 | 
|  | @classmethod | 
|  | def tearDownClass(cls): | 
|  | Test2.tearDownCalled += 1 | 
|  | unittest.TestCase.tearDownClass() | 
|  | def test_one(self): | 
|  | pass | 
|  | def test_two(self): | 
|  | pass | 
|  |  | 
|  | result = self.runTests(Test, Test2) | 
|  |  | 
|  | self.assertEqual(Test.tearDownCalled, 1) | 
|  | self.assertEqual(Test2.tearDownCalled, 1) | 
|  | self.assertEqual(result.testsRun, 4) | 
|  | self.assertEqual(len(result.errors), 0) | 
|  |  | 
|  | def test_error_in_setupclass(self): | 
|  | class BrokenTest(unittest.TestCase): | 
|  | @classmethod | 
|  | def setUpClass(cls): | 
|  | raise TypeError('foo') | 
|  | def test_one(self): | 
|  | pass | 
|  | def test_two(self): | 
|  | pass | 
|  |  | 
|  | result = self.runTests(BrokenTest) | 
|  |  | 
|  | self.assertEqual(result.testsRun, 0) | 
|  | self.assertEqual(len(result.errors), 1) | 
|  | error, _ = result.errors[0] | 
|  | self.assertEqual(str(error), | 
|  | 'setUpClass (%s.%s)' % (__name__, BrokenTest.__qualname__)) | 
|  |  | 
|  | def test_error_in_teardown_class(self): | 
|  | class Test(unittest.TestCase): | 
|  | tornDown = 0 | 
|  | @classmethod | 
|  | def tearDownClass(cls): | 
|  | Test.tornDown += 1 | 
|  | raise TypeError('foo') | 
|  | def test_one(self): | 
|  | pass | 
|  | def test_two(self): | 
|  | pass | 
|  |  | 
|  | class Test2(unittest.TestCase): | 
|  | tornDown = 0 | 
|  | @classmethod | 
|  | def tearDownClass(cls): | 
|  | Test2.tornDown += 1 | 
|  | raise TypeError('foo') | 
|  | def test_one(self): | 
|  | pass | 
|  | def test_two(self): | 
|  | pass | 
|  |  | 
|  | result = self.runTests(Test, Test2) | 
|  | self.assertEqual(result.testsRun, 4) | 
|  | self.assertEqual(len(result.errors), 2) | 
|  | self.assertEqual(Test.tornDown, 1) | 
|  | self.assertEqual(Test2.tornDown, 1) | 
|  |  | 
|  | error, _ = result.errors[0] | 
|  | self.assertEqual(str(error), | 
|  | 'tearDownClass (%s.%s)' % (__name__, Test.__qualname__)) | 
|  |  | 
|  | def test_class_not_torndown_when_setup_fails(self): | 
|  | class Test(unittest.TestCase): | 
|  | tornDown = False | 
|  | @classmethod | 
|  | def setUpClass(cls): | 
|  | raise TypeError | 
|  | @classmethod | 
|  | def tearDownClass(cls): | 
|  | Test.tornDown = True | 
|  | raise TypeError('foo') | 
|  | def test_one(self): | 
|  | pass | 
|  |  | 
|  | self.runTests(Test) | 
|  | self.assertFalse(Test.tornDown) | 
|  |  | 
|  | def test_class_not_setup_or_torndown_when_skipped(self): | 
|  | class Test(unittest.TestCase): | 
|  | classSetUp = False | 
|  | tornDown = False | 
|  | @classmethod | 
|  | def setUpClass(cls): | 
|  | Test.classSetUp = True | 
|  | @classmethod | 
|  | def tearDownClass(cls): | 
|  | Test.tornDown = True | 
|  | def test_one(self): | 
|  | pass | 
|  |  | 
|  | Test = unittest.skip("hop")(Test) | 
|  | self.runTests(Test) | 
|  | self.assertFalse(Test.classSetUp) | 
|  | self.assertFalse(Test.tornDown) | 
|  |  | 
|  | def test_setup_teardown_order_with_pathological_suite(self): | 
|  | results = [] | 
|  |  | 
|  | class Module1(object): | 
|  | @staticmethod | 
|  | def setUpModule(): | 
|  | results.append('Module1.setUpModule') | 
|  | @staticmethod | 
|  | def tearDownModule(): | 
|  | results.append('Module1.tearDownModule') | 
|  |  | 
|  | class Module2(object): | 
|  | @staticmethod | 
|  | def setUpModule(): | 
|  | results.append('Module2.setUpModule') | 
|  | @staticmethod | 
|  | def tearDownModule(): | 
|  | results.append('Module2.tearDownModule') | 
|  |  | 
|  | class Test1(unittest.TestCase): | 
|  | @classmethod | 
|  | def setUpClass(cls): | 
|  | results.append('setup 1') | 
|  | @classmethod | 
|  | def tearDownClass(cls): | 
|  | results.append('teardown 1') | 
|  | def testOne(self): | 
|  | results.append('Test1.testOne') | 
|  | def testTwo(self): | 
|  | results.append('Test1.testTwo') | 
|  |  | 
|  | class Test2(unittest.TestCase): | 
|  | @classmethod | 
|  | def setUpClass(cls): | 
|  | results.append('setup 2') | 
|  | @classmethod | 
|  | def tearDownClass(cls): | 
|  | results.append('teardown 2') | 
|  | def testOne(self): | 
|  | results.append('Test2.testOne') | 
|  | def testTwo(self): | 
|  | results.append('Test2.testTwo') | 
|  |  | 
|  | class Test3(unittest.TestCase): | 
|  | @classmethod | 
|  | def setUpClass(cls): | 
|  | results.append('setup 3') | 
|  | @classmethod | 
|  | def tearDownClass(cls): | 
|  | results.append('teardown 3') | 
|  | def testOne(self): | 
|  | results.append('Test3.testOne') | 
|  | def testTwo(self): | 
|  | results.append('Test3.testTwo') | 
|  |  | 
|  | Test1.__module__ = Test2.__module__ = 'Module' | 
|  | Test3.__module__ = 'Module2' | 
|  | sys.modules['Module'] = Module1 | 
|  | sys.modules['Module2'] = Module2 | 
|  |  | 
|  | first = unittest.TestSuite((Test1('testOne'),)) | 
|  | second = unittest.TestSuite((Test1('testTwo'),)) | 
|  | third = unittest.TestSuite((Test2('testOne'),)) | 
|  | fourth = unittest.TestSuite((Test2('testTwo'),)) | 
|  | fifth = unittest.TestSuite((Test3('testOne'),)) | 
|  | sixth = unittest.TestSuite((Test3('testTwo'),)) | 
|  | suite = unittest.TestSuite((first, second, third, fourth, fifth, sixth)) | 
|  |  | 
|  | runner = self.getRunner() | 
|  | result = runner.run(suite) | 
|  | self.assertEqual(result.testsRun, 6) | 
|  | self.assertEqual(len(result.errors), 0) | 
|  |  | 
|  | self.assertEqual(results, | 
|  | ['Module1.setUpModule', 'setup 1', | 
|  | 'Test1.testOne', 'Test1.testTwo', 'teardown 1', | 
|  | 'setup 2', 'Test2.testOne', 'Test2.testTwo', | 
|  | 'teardown 2', 'Module1.tearDownModule', | 
|  | 'Module2.setUpModule', 'setup 3', | 
|  | 'Test3.testOne', 'Test3.testTwo', | 
|  | 'teardown 3', 'Module2.tearDownModule']) | 
|  |  | 
|  | def test_setup_module(self): | 
|  | class Module(object): | 
|  | moduleSetup = 0 | 
|  | @staticmethod | 
|  | def setUpModule(): | 
|  | Module.moduleSetup += 1 | 
|  |  | 
|  | class Test(unittest.TestCase): | 
|  | def test_one(self): | 
|  | pass | 
|  | def test_two(self): | 
|  | pass | 
|  | Test.__module__ = 'Module' | 
|  | sys.modules['Module'] = Module | 
|  |  | 
|  | result = self.runTests(Test) | 
|  | self.assertEqual(Module.moduleSetup, 1) | 
|  | self.assertEqual(result.testsRun, 2) | 
|  | self.assertEqual(len(result.errors), 0) | 
|  |  | 
|  | def test_error_in_setup_module(self): | 
|  | class Module(object): | 
|  | moduleSetup = 0 | 
|  | moduleTornDown = 0 | 
|  | @staticmethod | 
|  | def setUpModule(): | 
|  | Module.moduleSetup += 1 | 
|  | raise TypeError('foo') | 
|  | @staticmethod | 
|  | def tearDownModule(): | 
|  | Module.moduleTornDown += 1 | 
|  |  | 
|  | class Test(unittest.TestCase): | 
|  | classSetUp = False | 
|  | classTornDown = False | 
|  | @classmethod | 
|  | def setUpClass(cls): | 
|  | Test.classSetUp = True | 
|  | @classmethod | 
|  | def tearDownClass(cls): | 
|  | Test.classTornDown = True | 
|  | def test_one(self): | 
|  | pass | 
|  | def test_two(self): | 
|  | pass | 
|  |  | 
|  | class Test2(unittest.TestCase): | 
|  | def test_one(self): | 
|  | pass | 
|  | def test_two(self): | 
|  | pass | 
|  | Test.__module__ = 'Module' | 
|  | Test2.__module__ = 'Module' | 
|  | sys.modules['Module'] = Module | 
|  |  | 
|  | result = self.runTests(Test, Test2) | 
|  | self.assertEqual(Module.moduleSetup, 1) | 
|  | self.assertEqual(Module.moduleTornDown, 0) | 
|  | self.assertEqual(result.testsRun, 0) | 
|  | self.assertFalse(Test.classSetUp) | 
|  | self.assertFalse(Test.classTornDown) | 
|  | self.assertEqual(len(result.errors), 1) | 
|  | error, _ = result.errors[0] | 
|  | self.assertEqual(str(error), 'setUpModule (Module)') | 
|  |  | 
|  | def test_testcase_with_missing_module(self): | 
|  | class Test(unittest.TestCase): | 
|  | def test_one(self): | 
|  | pass | 
|  | def test_two(self): | 
|  | pass | 
|  | Test.__module__ = 'Module' | 
|  | sys.modules.pop('Module', None) | 
|  |  | 
|  | result = self.runTests(Test) | 
|  | self.assertEqual(result.testsRun, 2) | 
|  |  | 
|  | def test_teardown_module(self): | 
|  | class Module(object): | 
|  | moduleTornDown = 0 | 
|  | @staticmethod | 
|  | def tearDownModule(): | 
|  | Module.moduleTornDown += 1 | 
|  |  | 
|  | class Test(unittest.TestCase): | 
|  | def test_one(self): | 
|  | pass | 
|  | def test_two(self): | 
|  | pass | 
|  | Test.__module__ = 'Module' | 
|  | sys.modules['Module'] = Module | 
|  |  | 
|  | result = self.runTests(Test) | 
|  | self.assertEqual(Module.moduleTornDown, 1) | 
|  | self.assertEqual(result.testsRun, 2) | 
|  | self.assertEqual(len(result.errors), 0) | 
|  |  | 
|  | def test_error_in_teardown_module(self): | 
|  | class Module(object): | 
|  | moduleTornDown = 0 | 
|  | @staticmethod | 
|  | def tearDownModule(): | 
|  | Module.moduleTornDown += 1 | 
|  | raise TypeError('foo') | 
|  |  | 
|  | class Test(unittest.TestCase): | 
|  | classSetUp = False | 
|  | classTornDown = False | 
|  | @classmethod | 
|  | def setUpClass(cls): | 
|  | Test.classSetUp = True | 
|  | @classmethod | 
|  | def tearDownClass(cls): | 
|  | Test.classTornDown = True | 
|  | def test_one(self): | 
|  | pass | 
|  | def test_two(self): | 
|  | pass | 
|  |  | 
|  | class Test2(unittest.TestCase): | 
|  | def test_one(self): | 
|  | pass | 
|  | def test_two(self): | 
|  | pass | 
|  | Test.__module__ = 'Module' | 
|  | Test2.__module__ = 'Module' | 
|  | sys.modules['Module'] = Module | 
|  |  | 
|  | result = self.runTests(Test, Test2) | 
|  | self.assertEqual(Module.moduleTornDown, 1) | 
|  | self.assertEqual(result.testsRun, 4) | 
|  | self.assertTrue(Test.classSetUp) | 
|  | self.assertTrue(Test.classTornDown) | 
|  | self.assertEqual(len(result.errors), 1) | 
|  | error, _ = result.errors[0] | 
|  | self.assertEqual(str(error), 'tearDownModule (Module)') | 
|  |  | 
|  | def test_skiptest_in_setupclass(self): | 
|  | class Test(unittest.TestCase): | 
|  | @classmethod | 
|  | def setUpClass(cls): | 
|  | raise unittest.SkipTest('foo') | 
|  | def test_one(self): | 
|  | pass | 
|  | def test_two(self): | 
|  | pass | 
|  |  | 
|  | result = self.runTests(Test) | 
|  | self.assertEqual(result.testsRun, 0) | 
|  | self.assertEqual(len(result.errors), 0) | 
|  | self.assertEqual(len(result.skipped), 1) | 
|  | skipped = result.skipped[0][0] | 
|  | self.assertEqual(str(skipped), | 
|  | 'setUpClass (%s.%s)' % (__name__, Test.__qualname__)) | 
|  |  | 
|  | def test_skiptest_in_setupmodule(self): | 
|  | class Test(unittest.TestCase): | 
|  | def test_one(self): | 
|  | pass | 
|  | def test_two(self): | 
|  | pass | 
|  |  | 
|  | class Module(object): | 
|  | @staticmethod | 
|  | def setUpModule(): | 
|  | raise unittest.SkipTest('foo') | 
|  |  | 
|  | Test.__module__ = 'Module' | 
|  | sys.modules['Module'] = Module | 
|  |  | 
|  | result = self.runTests(Test) | 
|  | self.assertEqual(result.testsRun, 0) | 
|  | self.assertEqual(len(result.errors), 0) | 
|  | self.assertEqual(len(result.skipped), 1) | 
|  | skipped = result.skipped[0][0] | 
|  | self.assertEqual(str(skipped), 'setUpModule (Module)') | 
|  |  | 
|  | def test_suite_debug_executes_setups_and_teardowns(self): | 
|  | ordering = [] | 
|  |  | 
|  | class Module(object): | 
|  | @staticmethod | 
|  | def setUpModule(): | 
|  | ordering.append('setUpModule') | 
|  | @staticmethod | 
|  | def tearDownModule(): | 
|  | ordering.append('tearDownModule') | 
|  |  | 
|  | class Test(unittest.TestCase): | 
|  | @classmethod | 
|  | def setUpClass(cls): | 
|  | ordering.append('setUpClass') | 
|  | @classmethod | 
|  | def tearDownClass(cls): | 
|  | ordering.append('tearDownClass') | 
|  | def test_something(self): | 
|  | ordering.append('test_something') | 
|  |  | 
|  | Test.__module__ = 'Module' | 
|  | sys.modules['Module'] = Module | 
|  |  | 
|  | suite = unittest.defaultTestLoader.loadTestsFromTestCase(Test) | 
|  | suite.debug() | 
|  | expectedOrder = ['setUpModule', 'setUpClass', 'test_something', 'tearDownClass', 'tearDownModule'] | 
|  | self.assertEqual(ordering, expectedOrder) | 
|  |  | 
|  | def test_suite_debug_propagates_exceptions(self): | 
|  | class Module(object): | 
|  | @staticmethod | 
|  | def setUpModule(): | 
|  | if phase == 0: | 
|  | raise Exception('setUpModule') | 
|  | @staticmethod | 
|  | def tearDownModule(): | 
|  | if phase == 1: | 
|  | raise Exception('tearDownModule') | 
|  |  | 
|  | class Test(unittest.TestCase): | 
|  | @classmethod | 
|  | def setUpClass(cls): | 
|  | if phase == 2: | 
|  | raise Exception('setUpClass') | 
|  | @classmethod | 
|  | def tearDownClass(cls): | 
|  | if phase == 3: | 
|  | raise Exception('tearDownClass') | 
|  | def test_something(self): | 
|  | if phase == 4: | 
|  | raise Exception('test_something') | 
|  |  | 
|  | Test.__module__ = 'Module' | 
|  | sys.modules['Module'] = Module | 
|  |  | 
|  | messages = ('setUpModule', 'tearDownModule', 'setUpClass', 'tearDownClass', 'test_something') | 
|  | for phase, msg in enumerate(messages): | 
|  | _suite = unittest.defaultTestLoader.loadTestsFromTestCase(Test) | 
|  | suite = unittest.TestSuite([_suite]) | 
|  | with self.assertRaisesRegex(Exception, msg): | 
|  | suite.debug() | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | unittest.main() |