]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-136442: Fix unittest to return exit code 5 when setUpClass raises an except...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sat, 15 Nov 2025 01:23:03 +0000 (02:23 +0100)
committerGitHub <noreply@github.com>
Sat, 15 Nov 2025 01:23:03 +0000 (01:23 +0000)
gh-136442: Fix unittest to return exit code 5 when setUpClass raises an exception (GH-136487)
(cherry picked from commit 53d65c840e038ce9a5782fbd3da963c7aba90570)

Co-authored-by: Takuya UESHIN <ueshin@happy-camper.st>
Lib/test/test_unittest/test_program.py
Lib/unittest/main.py
Misc/NEWS.d/next/Tests/2025-07-09-21-45-51.gh-issue-136442.jlbklP.rst [new file with mode: 0644]

index aa7e8b712fd7639358b1e9a6f45d3ec709775f87..d0432eb731179f42a8afa23878e5f3fd1dc07827 100644 (file)
@@ -75,6 +75,14 @@ class Test_TestProgram(unittest.TestCase):
     class Empty(unittest.TestCase):
         pass
 
+    class SetUpClassFailure(unittest.TestCase):
+        @classmethod
+        def setUpClass(cls):
+            super().setUpClass()
+            raise Exception
+        def testPass(self):
+            pass
+
     class TestLoader(unittest.TestLoader):
         """Test loader that returns a suite containing the supplied testcase."""
 
@@ -191,6 +199,18 @@ class Test_TestProgram(unittest.TestCase):
         out = stream.getvalue()
         self.assertIn('\nNO TESTS RAN\n', out)
 
+    def test_ExitSetUpClassFailureSuite(self):
+        stream = BufferedWriter()
+        with self.assertRaises(SystemExit) as cm:
+            unittest.main(
+                argv=["setup_class_failure"],
+                testRunner=unittest.TextTestRunner(stream=stream),
+                testLoader=self.TestLoader(self.SetUpClassFailure))
+        self.assertEqual(cm.exception.code, 1)
+        out = stream.getvalue()
+        self.assertIn("ERROR: setUpClass", out)
+        self.assertIn("SetUpClassFailure", out)
+
 
 class InitialisableProgram(unittest.TestProgram):
     exit = False
index c3869de3f6f18e111585a776b961d9a9986a1161..a0cd8a9f7ea4c7c74d43ee5cdec6b6a766b4eb8b 100644 (file)
@@ -269,12 +269,12 @@ class TestProgram(object):
             testRunner = self.testRunner
         self.result = testRunner.run(self.test)
         if self.exit:
-            if self.result.testsRun == 0 and len(self.result.skipped) == 0:
+            if not self.result.wasSuccessful():
+                sys.exit(1)
+            elif self.result.testsRun == 0 and len(self.result.skipped) == 0:
                 sys.exit(_NO_TESTS_EXITCODE)
-            elif self.result.wasSuccessful():
-                sys.exit(0)
             else:
-                sys.exit(1)
+                sys.exit(0)
 
 
 main = TestProgram
diff --git a/Misc/NEWS.d/next/Tests/2025-07-09-21-45-51.gh-issue-136442.jlbklP.rst b/Misc/NEWS.d/next/Tests/2025-07-09-21-45-51.gh-issue-136442.jlbklP.rst
new file mode 100644 (file)
index 0000000..f87fb11
--- /dev/null
@@ -0,0 +1 @@
+Use exitcode ``1`` instead of ``5`` if :func:`unittest.TestCase.setUpClass` raises an exception