Skip to content

Commit 3cde440

Browse files
authored
bpo-36725: Refactor regrtest multiprocessing code (GH-12961)
Rewrite run_tests_multiprocess() function as a new MultiprocessRunner class with multiple methods to better report errors and stop immediately when needed. Changes: * Worker processes are now killed immediately if tests are interrupted or if a test does crash (CHILD_ERROR): worker processes are killed. * Rewrite how errors in a worker thread are reported to the main thread. No longer ignore BaseException or parsing errors silently. * Remove 'finished' variable: use worker.is_alive() instead * Always compute omitted tests. Add Regrtest.get_executed() method.
1 parent 87d23a0 commit 3cde440

File tree

5 files changed

+205
-152
lines changed

5 files changed

+205
-152
lines changed

Lib/test/libregrtest/main.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@ def __init__(self):
7979
self.skipped = []
8080
self.resource_denieds = []
8181
self.environment_changed = []
82-
self.rerun = []
8382
self.run_no_tests = []
83+
self.rerun = []
8484
self.first_result = None
8585
self.interrupted = False
8686

@@ -105,6 +105,11 @@ def __init__(self):
105105
# used by --junit-xml
106106
self.testsuite_xml = None
107107

108+
def get_executed(self):
109+
return (set(self.good) | set(self.bad) | set(self.skipped)
110+
| set(self.resource_denieds) | set(self.environment_changed)
111+
| set(self.run_no_tests))
112+
108113
def accumulate_result(self, result):
109114
test_name = result.test_name
110115
ok = result.result
@@ -311,8 +316,6 @@ def rerun_failed_tests(self):
311316
self.bad.remove(test_name)
312317

313318
if ok.result == INTERRUPTED:
314-
# print a newline separate from the ^C
315-
print()
316319
self.interrupted = True
317320
break
318321
else:
@@ -331,11 +334,11 @@ def display_result(self):
331334
print("== Tests result: %s ==" % self.get_tests_result())
332335

333336
if self.interrupted:
334-
print()
335-
# print a newline after ^C
336337
print("Test suite interrupted by signal SIGINT.")
337-
executed = set(self.good) | set(self.bad) | set(self.skipped)
338-
omitted = set(self.selected) - executed
338+
339+
omitted = set(self.selected) - self.get_executed()
340+
if omitted:
341+
print()
339342
print(count(len(omitted), "test"), "omitted:")
340343
printlist(omitted)
341344

Lib/test/libregrtest/runtest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ def _runtest_inner(ns, test_name, display_failure=True):
275275
except support.TestDidNotRun:
276276
return TEST_DID_NOT_RUN
277277
except KeyboardInterrupt:
278+
print()
278279
return INTERRUPTED
279280
except:
280281
if not ns.pgo:

0 commit comments

Comments
 (0)