mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 02:15:10 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			507 lines
		
	
	
	
		
			16 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			507 lines
		
	
	
	
		
			16 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 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()
 | 
