From f8e91d0104b58badcc45e39b12375a6092866db5 Mon Sep 17 00:00:00 2001 From: Shubham Singh Date: Fri, 12 Sep 2025 14:32:35 -0500 Subject: [PATCH] [6.0.x] Fixed #36491 -- Fixed crash in ParallelTestRunner with --buffer. Thanks Javier Buzzi and Adam Johnson for reviews. Co-authored-by: Simon Charette Backport of be581ff473e8ade6365975db2df602f295a4cb4b from main. --- django/test/runner.py | 3 +++ tests/test_runner/test_parallel.py | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/django/test/runner.py b/django/test/runner.py index 8902dea3e0..25089a6db1 100644 --- a/django/test/runner.py +++ b/django/test/runner.py @@ -566,6 +566,9 @@ class ParallelTestSuite(unittest.TestSuite): (self.runner_class, index, subsuite, self.failfast, self.buffer) for index, subsuite in enumerate(self.subsuites) ] + # Don't buffer in the main process to avoid error propagation issues. + result.buffer = False + test_results = pool.imap_unordered(self.run_subsuite.__func__, args) while True: diff --git a/tests/test_runner/test_parallel.py b/tests/test_runner/test_parallel.py index f344f1a2db..d4558018b0 100644 --- a/tests/test_runner/test_parallel.py +++ b/tests/test_runner/test_parallel.py @@ -282,3 +282,27 @@ class ParallelTestSuiteTest(SimpleTestCase): self.assertEqual(len(result.errors), 0) self.assertEqual(len(result.failures), 0) + + def test_buffer_mode_reports_setupclass_failure(self): + test = SampleErrorTest("dummy_test") + remote_result = RemoteTestResult() + suite = TestSuite([test]) + suite.run(remote_result) + + pts = ParallelTestSuite([suite], processes=2, buffer=True) + pts.serialized_aliases = set() + test_result = TestResult() + test_result.buffer = True + + with unittest.mock.patch("multiprocessing.Pool") as mock_pool: + + def fake_next(*args, **kwargs): + test_result.shouldStop = True + return (0, remote_result.events) + + mock_pool.return_value.imap_unordered.return_value = unittest.mock.Mock( + next=fake_next + ) + pts.run(test_result) + + self.assertIn("ValueError: woops", test_result.errors[0][1])