https://github.com/python/cpython/commit/53d65c840e038ce9a5782fbd3da963c7aba90570
commit: 53d65c840e038ce9a5782fbd3da963c7aba90570
branch: main
author: Takuya UESHIN <[email protected]>
committer: gaogaotiantian <[email protected]>
date: 2025-11-14T16:59:51-08:00
summary:
gh-136442: Fix unittest to return exit code 5 when setUpClass raises an
exception (#136487)
files:
A Misc/NEWS.d/next/Tests/2025-07-09-21-45-51.gh-issue-136442.jlbklP.rst
M Lib/test/test_unittest/test_program.py
M Lib/unittest/main.py
diff --git a/Lib/test/test_unittest/test_program.py
b/Lib/test/test_unittest/test_program.py
index 6092ed292d8f60..8ed92373e5e984 100644
--- a/Lib/test/test_unittest/test_program.py
+++ b/Lib/test/test_unittest/test_program.py
@@ -75,6 +75,14 @@ def testUnexpectedSuccess(self):
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 @@ def test_ExitEmptySuite(self):
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
diff --git a/Lib/unittest/main.py b/Lib/unittest/main.py
index 6fd949581f3146..be99d93c78cca6 100644
--- a/Lib/unittest/main.py
+++ b/Lib/unittest/main.py
@@ -269,12 +269,12 @@ def runTests(self):
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
index 00000000000000..f87fb1113cad12
--- /dev/null
+++ b/Misc/NEWS.d/next/Tests/2025-07-09-21-45-51.gh-issue-136442.jlbklP.rst
@@ -0,0 +1 @@
+Use exitcode ``1`` instead of ``5`` if :func:`unittest.TestCase.setUpClass`
raises an exception
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]