gh-136442: Fix unittest to return exit code 5 when setUpClass raises an exception (#136487)

This commit is contained in:
Takuya UESHIN 2025-11-14 16:59:51 -08:00 committed by GitHub
parent 453d886f85
commit 53d65c840e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 26 additions and 5 deletions

View 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

View 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:
sys.exit(_NO_TESTS_EXITCODE)
elif self.result.wasSuccessful():
sys.exit(0)
else:
if not self.result.wasSuccessful():
sys.exit(1)
elif self.result.testsRun == 0 and len(self.result.skipped) == 0:
sys.exit(_NO_TESTS_EXITCODE)
else:
sys.exit(0)
main = TestProgram

View file

@ -0,0 +1 @@
Use exitcode ``1`` instead of ``5`` if :func:`unittest.TestCase.setUpClass` raises an exception