]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] gh-106584: Fix exit code for unittest in Python 3.12 (GH-106588) (#109725)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Mon, 2 Oct 2023 15:18:41 +0000 (08:18 -0700)
committerGitHub <noreply@github.com>
Mon, 2 Oct 2023 15:18:41 +0000 (17:18 +0200)
gh-106584: Fix exit code for unittest in Python 3.12 (GH-106588)
(cherry picked from commit 8fc071345b50dd3de61ebeeaa287ccef21d061b2)

Co-authored-by: EliseevEgor <egor.eliseev@jetbrains.com>
Co-authored-by: sunmy2019 <59365878+sunmy2019@users.noreply.github.com>
Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
Lib/test/test_unittest/test_discovery.py
Lib/test/test_unittest/test_skipping.py
Lib/unittest/case.py
Lib/unittest/result.py
Misc/NEWS.d/next/Library/2023-07-11-08-56-40.gh-issue-106584.g-SBtC.rst [new file with mode: 0644]

index 004898ed43183485e2eb649ce3a94721e200a67d..dcb72d73efceabb8a0027d9fc81af96f5066467d 100644 (file)
@@ -571,7 +571,7 @@ class TestDiscovery(unittest.TestCase):
         result = unittest.TestResult()
         suite.run(result)
         self.assertEqual(len(result.skipped), 1)
-        self.assertEqual(result.testsRun, 1)
+        self.assertEqual(result.testsRun, 0)
         self.assertEqual(import_calls, ['my_package'])
 
         # Check picklability
index f146dcac18ecc092a51a8cb4c97e36d7b87bf90e..1a6af06d32b4339e0b91693aa2a0c2484d30e9fd 100644 (file)
@@ -103,16 +103,16 @@ class Test_TestSkipping(unittest.TestCase):
             result = LoggingResult(events)
             self.assertIs(suite.run(result), result)
             self.assertEqual(len(result.skipped), 1)
-            expected = ['startTest', 'addSkip', 'stopTest',
-                        'startTest', 'addSuccess', 'stopTest']
+            expected = ['addSkip', 'stopTest', 'startTest',
+                        'addSuccess', 'stopTest']
             self.assertEqual(events, expected)
-            self.assertEqual(result.testsRun, 2)
+            self.assertEqual(result.testsRun, 1)
             self.assertEqual(result.skipped, [(test_do_skip, "testing")])
             self.assertTrue(result.wasSuccessful())
 
             events = []
             result = test_do_skip.run()
-            self.assertEqual(events, ['startTestRun', 'startTest', 'addSkip',
+            self.assertEqual(events, ['startTestRun', 'addSkip',
                                       'stopTest', 'stopTestRun'])
             self.assertEqual(result.skipped, [(test_do_skip, "testing")])
 
@@ -135,13 +135,13 @@ class Test_TestSkipping(unittest.TestCase):
         test = Foo("test_1")
         suite = unittest.TestSuite([test])
         self.assertIs(suite.run(result), result)
-        self.assertEqual(events, ['startTest', 'addSkip', 'stopTest'])
+        self.assertEqual(events, ['addSkip', 'stopTest'])
         self.assertEqual(result.skipped, [(test, "testing")])
         self.assertEqual(record, [])
 
         events = []
         result = test.run()
-        self.assertEqual(events, ['startTestRun', 'startTest', 'addSkip',
+        self.assertEqual(events, ['startTestRun', 'addSkip',
                                   'stopTest', 'stopTestRun'])
         self.assertEqual(result.skipped, [(test, "testing")])
         self.assertEqual(record, [])
index 001b640dc43ad69aa4ea7d304c5a667424d031f8..811557498bb30eda9271b767518cbedbbb723b8e 100644 (file)
@@ -606,7 +606,6 @@ class TestCase(object):
         else:
             stopTestRun = None
 
-        result.startTest(self)
         try:
             testMethod = getattr(self, self._testMethodName)
             if (getattr(self.__class__, "__unittest_skip__", False) or
@@ -617,6 +616,9 @@ class TestCase(object):
                 _addSkip(result, self, skip_why)
                 return result
 
+            # Increase the number of tests only if it hasn't been skipped
+            result.startTest(self)
+
             expecting_failure = (
                 getattr(self, "__unittest_expecting_failure__", False) or
                 getattr(testMethod, "__unittest_expecting_failure__", False)
index 3ace0a5b7bf2efb209630c5a7f9f6b7aafc1ef7d..9e56f658027f4de20168a67cfcbcbe89057d1d69 100644 (file)
@@ -97,10 +97,12 @@ class TestResult(object):
 
             sys.stdout = self._original_stdout
             sys.stderr = self._original_stderr
-            self._stdout_buffer.seek(0)
-            self._stdout_buffer.truncate()
-            self._stderr_buffer.seek(0)
-            self._stderr_buffer.truncate()
+            if self._stdout_buffer is not None:
+                self._stdout_buffer.seek(0)
+                self._stdout_buffer.truncate()
+            if self._stderr_buffer is not None:
+                self._stderr_buffer.seek(0)
+                self._stderr_buffer.truncate()
 
     def stopTestRun(self):
         """Called once after all tests are executed.
diff --git a/Misc/NEWS.d/next/Library/2023-07-11-08-56-40.gh-issue-106584.g-SBtC.rst b/Misc/NEWS.d/next/Library/2023-07-11-08-56-40.gh-issue-106584.g-SBtC.rst
new file mode 100644 (file)
index 0000000..a13b61b
--- /dev/null
@@ -0,0 +1,2 @@
+Fix exit code for ``unittest`` if all tests are skipped.\r
+Patch by Egor Eliseev.\r