mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	gh-99645: Fix a bug in handling class cleanups in unittest.TestCase (GH-99646)
Now addClassCleanup() uses separate lists for different TestCase subclasses, and doClassCleanups() only cleans up the particular class.
This commit is contained in:
		
							parent
							
								
									d15b9f19ac
								
							
						
					
					
						commit
						c2102136be
					
				
					 3 changed files with 35 additions and 5 deletions
				
			
		|  | @ -547,6 +547,33 @@ def testNothing(self): | ||||||
| 
 | 
 | ||||||
|         self.assertEqual(TestableTest._class_cleanups, []) |         self.assertEqual(TestableTest._class_cleanups, []) | ||||||
| 
 | 
 | ||||||
|  |     def test_run_nested_test(self): | ||||||
|  |         ordering = [] | ||||||
|  | 
 | ||||||
|  |         class InnerTest(unittest.TestCase): | ||||||
|  |             @classmethod | ||||||
|  |             def setUpClass(cls): | ||||||
|  |                 ordering.append('inner setup') | ||||||
|  |                 cls.addClassCleanup(ordering.append, 'inner cleanup') | ||||||
|  |             def test(self): | ||||||
|  |                 ordering.append('inner test') | ||||||
|  | 
 | ||||||
|  |         class OuterTest(unittest.TestCase): | ||||||
|  |             @classmethod | ||||||
|  |             def setUpClass(cls): | ||||||
|  |                 ordering.append('outer setup') | ||||||
|  |                 cls.addClassCleanup(ordering.append, 'outer cleanup') | ||||||
|  |             def test(self): | ||||||
|  |                 ordering.append('start outer test') | ||||||
|  |                 runTests(InnerTest) | ||||||
|  |                 ordering.append('end outer test') | ||||||
|  | 
 | ||||||
|  |         runTests(OuterTest) | ||||||
|  |         self.assertEqual(ordering, [ | ||||||
|  |                 'outer setup', 'start outer test', | ||||||
|  |                 'inner setup', 'inner test', 'inner cleanup', | ||||||
|  |                 'end outer test', 'outer cleanup']) | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| class TestModuleCleanUp(unittest.TestCase): | class TestModuleCleanUp(unittest.TestCase): | ||||||
|     def test_add_and_do_ModuleCleanup(self): |     def test_add_and_do_ModuleCleanup(self): | ||||||
|  |  | ||||||
|  | @ -384,11 +384,11 @@ class TestCase(object): | ||||||
|     # of difflib.  See #11763. |     # of difflib.  See #11763. | ||||||
|     _diffThreshold = 2**16 |     _diffThreshold = 2**16 | ||||||
| 
 | 
 | ||||||
|  |     def __init_subclass__(cls, *args, **kwargs): | ||||||
|         # Attribute used by TestSuite for classSetUp |         # Attribute used by TestSuite for classSetUp | ||||||
| 
 |         cls._classSetupFailed = False | ||||||
|     _classSetupFailed = False |         cls._class_cleanups = [] | ||||||
| 
 |         super().__init_subclass__(*args, **kwargs) | ||||||
|     _class_cleanups = [] |  | ||||||
| 
 | 
 | ||||||
|     def __init__(self, methodName='runTest'): |     def __init__(self, methodName='runTest'): | ||||||
|         """Create an instance of the class that will use the named test |         """Create an instance of the class that will use the named test | ||||||
|  |  | ||||||
|  | @ -0,0 +1,3 @@ | ||||||
|  | Fix a bug in handling class cleanups in :class:`unittest.TestCase`.  Now | ||||||
|  | ``addClassCleanup()`` uses separate lists for different ``TestCase`` | ||||||
|  | subclasses, and ``doClassCleanups()`` only cleans up the particular class. | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Serhiy Storchaka
						Serhiy Storchaka