diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2022-11-22 19:02:56 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-22 19:02:56 +0200 |
commit | 9a7899b279b9eca2918925157e4a0b572579b081 (patch) | |
tree | 5e184d340d252e40570a05e7291179a82f55021c | |
parent | gh-93937: Document PyFrame_Check and PyFrame_Type (GH-99695) (diff) | |
download | cpython-9a7899b279b9eca2918925157e4a0b572579b081.tar.gz cpython-9a7899b279b9eca2918925157e4a0b572579b081.tar.bz2 cpython-9a7899b279b9eca2918925157e4a0b572579b081.zip |
[3.11] gh-99645: Fix a bug in handling class cleanups in unittest.TestCase (GH-99646) (GH-99698)
Now addClassCleanup() uses separate lists for different TestCase subclasses,
and doClassCleanups() only cleans up the particular class.
(cherry picked from commit c2102136be569e6fc8ed90181f229b46d07142f8)
-rw-r--r-- | Lib/unittest/case.py | 10 | ||||
-rw-r--r-- | Lib/unittest/test/test_runner.py | 27 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2022-11-21-13-49-03.gh-issue-99645.9w1QKq.rst | 3 |
3 files changed, 35 insertions, 5 deletions
diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py index 8633f383760..c4aa2d77219 100644 --- a/Lib/unittest/case.py +++ b/Lib/unittest/case.py @@ -384,11 +384,11 @@ class TestCase(object): # of difflib. See #11763. _diffThreshold = 2**16 - # Attribute used by TestSuite for classSetUp - - _classSetupFailed = False - - _class_cleanups = [] + def __init_subclass__(cls, *args, **kwargs): + # Attribute used by TestSuite for classSetUp + cls._classSetupFailed = False + cls._class_cleanups = [] + super().__init_subclass__(*args, **kwargs) def __init__(self, methodName='runTest'): """Create an instance of the class that will use the named test diff --git a/Lib/unittest/test/test_runner.py b/Lib/unittest/test/test_runner.py index e6936d30c56..e02b2dadc8f 100644 --- a/Lib/unittest/test/test_runner.py +++ b/Lib/unittest/test/test_runner.py @@ -547,6 +547,33 @@ class TestClassCleanup(unittest.TestCase): 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): def test_add_and_do_ModuleCleanup(self): diff --git a/Misc/NEWS.d/next/Library/2022-11-21-13-49-03.gh-issue-99645.9w1QKq.rst b/Misc/NEWS.d/next/Library/2022-11-21-13-49-03.gh-issue-99645.9w1QKq.rst new file mode 100644 index 00000000000..f6ee449891d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-11-21-13-49-03.gh-issue-99645.9w1QKq.rst @@ -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. |