[3.12] GH-113661: unittest runner: Don't exit 5 if tests were skipped (GH-113856) (#113875)

GH-113661: unittest runner: Don't exit 5 if tests were skipped (GH-113856)

The intention of exiting 5 was to detect issues where the test suite
wasn't discovered at all. If we skipped tests, it was correctly
discovered.
(cherry picked from commit 3a9096c337)

Co-authored-by: Stefano Rivera <stefano@rivera.za.net>
This commit is contained in:
Miss Islington (bot) 2024-01-09 22:34:38 +01:00 committed by GitHub
parent 85cf360d29
commit 159e3db1f7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 18 additions and 3 deletions

View file

@ -2282,7 +2282,7 @@ Loading and running tests
The *testRunner* argument can either be a test runner class or an already The *testRunner* argument can either be a test runner class or an already
created instance of it. By default ``main`` calls :func:`sys.exit` with created instance of it. By default ``main`` calls :func:`sys.exit` with
an exit code indicating success (0) or failure (1) of the tests run. an exit code indicating success (0) or failure (1) of the tests run.
An exit code of 5 indicates that no tests were run. An exit code of 5 indicates that no tests were run or skipped.
The *testLoader* argument has to be a :class:`TestLoader` instance, The *testLoader* argument has to be a :class:`TestLoader` instance,
and defaults to :data:`defaultTestLoader`. and defaults to :data:`defaultTestLoader`.

View file

@ -167,6 +167,18 @@ class Test_TestProgram(unittest.TestCase):
'expected failures=1, unexpected successes=1)\n') 'expected failures=1, unexpected successes=1)\n')
self.assertTrue(out.endswith(expected)) self.assertTrue(out.endswith(expected))
def test_ExitSkippedSuite(self):
stream = BufferedWriter()
with self.assertRaises(SystemExit) as cm:
unittest.main(
argv=["foobar", "-k", "testSkipped"],
testRunner=unittest.TextTestRunner(stream=stream),
testLoader=self.TestLoader(self.FooBar))
self.assertEqual(cm.exception.code, 0)
out = stream.getvalue()
expected = '\n\nOK (skipped=1)\n'
self.assertTrue(out.endswith(expected))
def test_ExitEmptySuite(self): def test_ExitEmptySuite(self):
stream = BufferedWriter() stream = BufferedWriter()
with self.assertRaises(SystemExit) as cm: with self.assertRaises(SystemExit) as cm:

View file

@ -280,7 +280,7 @@ class TestProgram(object):
testRunner = self.testRunner testRunner = self.testRunner
self.result = testRunner.run(self.test) self.result = testRunner.run(self.test)
if self.exit: if self.exit:
if self.result.testsRun == 0: if self.result.testsRun == 0 and len(self.result.skipped) == 0:
sys.exit(_NO_TESTS_EXITCODE) sys.exit(_NO_TESTS_EXITCODE)
elif self.result.wasSuccessful(): elif self.result.wasSuccessful():
sys.exit(0) sys.exit(0)

View file

@ -274,7 +274,7 @@ class TextTestRunner(object):
infos.append("failures=%d" % failed) infos.append("failures=%d" % failed)
if errored: if errored:
infos.append("errors=%d" % errored) infos.append("errors=%d" % errored)
elif run == 0: elif run == 0 and not skipped:
self.stream.write("NO TESTS RAN") self.stream.write("NO TESTS RAN")
else: else:
self.stream.write("OK") self.stream.write("OK")

View file

@ -0,0 +1,3 @@
unittest runner: Don't exit 5 if tests were skipped. The intention of
exiting 5 was to detect issues where the test suite wasn't discovered at
all. If we skipped tests, it was correctly discovered.