https://github.com/python/cpython/commit/3a9096c337c16c9335e0d4eba8d1d4196258af72
commit: 3a9096c337c16c9335e0d4eba8d1d4196258af72
branch: main
author: Stefano Rivera <[email protected]>
committer: gpshead <[email protected]>
date: 2024-01-09T19:50:01Z
summary:
GH-113661: unittest runner: Don't exit 5 if tests were skipped (#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.
files:
A Misc/NEWS.d/next/Library/2024-01-09-08-59-43.gh-issue-113661.asvXSx.rst
M Doc/library/unittest.rst
M Lib/test/test_unittest/test_program.py
M Lib/unittest/main.py
M Lib/unittest/runner.py
diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst
index 70b4c84c05f818..491009769f5aa6 100644
--- a/Doc/library/unittest.rst
+++ b/Doc/library/unittest.rst
@@ -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`.
diff --git a/Lib/test/test_unittest/test_program.py
b/Lib/test/test_unittest/test_program.py
index f6d52f93e4a25f..d8f5d3692a5088 100644
--- a/Lib/test/test_unittest/test_program.py
+++ b/Lib/test/test_unittest/test_program.py
@@ -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:
diff --git a/Lib/unittest/main.py b/Lib/unittest/main.py
index d29a9f91fcca42..c3869de3f6f18e 100644
--- a/Lib/unittest/main.py
+++ b/Lib/unittest/main.py
@@ -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)
diff --git a/Lib/unittest/runner.py b/Lib/unittest/runner.py
index e3c020e0ace96d..2bcadf0c998bd9 100644
--- a/Lib/unittest/runner.py
+++ b/Lib/unittest/runner.py
@@ -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")
diff --git
a/Misc/NEWS.d/next/Library/2024-01-09-08-59-43.gh-issue-113661.asvXSx.rst
b/Misc/NEWS.d/next/Library/2024-01-09-08-59-43.gh-issue-113661.asvXSx.rst
new file mode 100644
index 00000000000000..f4a4f1a9841d1a
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-01-09-08-59-43.gh-issue-113661.asvXSx.rst
@@ -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.
_______________________________________________
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]