Skip to content

Commit

Permalink
pythonGH-113661: unittest runner: Don't exit 5 if tests were skipped (p…
Browse files Browse the repository at this point in the history
…ython#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.
  • Loading branch information
stefanor authored Jan 9, 2024
1 parent 0297418 commit 3a9096c
Show file tree
Hide file tree
Showing 5 changed files with 18 additions and 3 deletions.
2 changes: 1 addition & 1 deletion Doc/library/unittest.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2290,7 +2290,7 @@ Loading and running tests
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
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,
and defaults to :data:`defaultTestLoader`.
Expand Down
12 changes: 12 additions & 0 deletions Lib/test/test_unittest/test_program.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,18 @@ def test_ExitAsDefault(self):
'expected failures=1, unexpected successes=1)\n')
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):
stream = BufferedWriter()
with self.assertRaises(SystemExit) as cm:
Expand Down
2 changes: 1 addition & 1 deletion Lib/unittest/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ def runTests(self):
testRunner = self.testRunner
self.result = testRunner.run(self.test)
if self.exit:
if self.result.testsRun == 0:
if self.result.testsRun == 0 and len(self.result.skipped) == 0:
sys.exit(_NO_TESTS_EXITCODE)
elif self.result.wasSuccessful():
sys.exit(0)
Expand Down
2 changes: 1 addition & 1 deletion Lib/unittest/runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,7 @@ def run(self, test):
infos.append("failures=%d" % failed)
if errored:
infos.append("errors=%d" % errored)
elif run == 0:
elif run == 0 and not skipped:
self.stream.write("NO TESTS RAN")
else:
self.stream.write("OK")
Expand Down
Original file line number Diff line number Diff line change
@@ -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.

0 comments on commit 3a9096c

Please sign in to comment.