123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507 |
- 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()
|