10000 bpo-36725: regrtest: add TestResult type (GH-12960) · python/cpython@4d29983 · GitHub
[go: up one dir, main page]

Skip to content

Commit 4d29983

Browse files
authored
bpo-36725: regrtest: add TestResult type (GH-12960)
* Add TestResult and MultiprocessResult types to ensure that results always have the same fields. * runtest() now handles KeyboardInterrupt * accumulate_result() and format_test_result() now takes a TestResult * cleanup_test_droppings() is now called by runtest() and mark the test as ENV_CHANGED if the test leaks support.TESTFN file. * runtest() now includes code "around" the test in the test timing * Add print_warning() in test.libregrtest.utils to standardize how libregrtest logs warnings to ease parsing the test output. * support.unload() is now called with abstest rather than test_name * Rename 'test' variable/parameter to 'test_name' * dash_R(): remove unused the_module parameter * Remove unused imports
1 parent 9db0324 commit 4d29983

File tree

8 files changed

+286
-208
lines changed

8 files changed

+286
-208
lines changed

Lib/test/libregrtest/main.py

Lines changed: 45 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -105,26 +105,30 @@ def __init__(self):
105105
# used by --junit-xml
106106
self.testsuite_xml = None
107107

108-
def accumulate_result(self, test, result):
109-
ok, test_time, xml_data = result
108+
def accumulate_result(self, result):
109+
test_name = result.test_name
110+
ok = result.result
111+
110112
if ok not in (CHILD_ERROR, INTERRUPTED):
111-
self.test_times.append((test_time, test))
113+
self.test_times.append((result.test_time, test_name))
114+
112115
if ok == PASSED:
113-
self.good.append(test)
116+
self.good.append(test_name)
114117
elif ok in (FAILED, CHILD_ERROR):
115-
self.bad.append(test)
118+
self.bad.append(test_name)
116119
elif ok == ENV_CHANGED:
117-
self.environment_changed.append(test)
120+
self.environment_changed.append(test_name)
118121
elif ok == SKIPPED:
119-
self.skipped.append(test)
122+
self.skipped.append(test_name)
120123
elif ok == RESOURCE_DENIED:
121-
self.skipped.append(test)
122-
self.resource_denieds.append(test)
124+
self.skipped.append(test_name)
125+
self.resource_denieds.append(test_name)
123126
elif ok == TEST_DID_NOT_RUN:
124-
self.run_no_tests.append(test)
127+ self.run_no_tests.append(test_name)
125128
elif ok != INTERRUPTED:
126129
raise ValueError("invalid test result: %r" % ok)
127130

131+
xml_data = result.xml_data
128132
if xml_data:
129133
import xml.etree.ElementTree as ET
130134
for e in xml_data:
@@ -134,7 +138,7 @@ def accumulate_result(self, test, result):
134138
print(xml_data, file=sys.__stderr__)
135139
raise
136140

137-
def display_progress(self, test_index, test):
141+
def display_progress(self, test_index, text):
138142
if self.ns.quiet:
139143
return
140144

@@ -143,7 +147,7 @@ def display_progress(self, test_index, test):
143147
fails = len(self.bad) + len(self.environment_changed)
144148
if fails and not self.ns.pgo:
145149
line = f"{line}/{fails}"
146-
line = f"[{line}] {test}"
150+
line = f"[{line}] {text}"
147151

148152
# add the system load prefix: "load avg: 1.80 "
149153
if self.getloadavg:
@@ -275,13 +279,13 @@ def list_cases(self):
275279
support.verbose = False
276280
support.set_match_tests(self.ns.match_tests)
277281

278-
for test in self.selected:
279-
abstest = get_abs_module(self.ns, test)
282+
for test_name in self.selected:
283+
abstest = get_abs_module(self.ns, test_name)
280284
try:
281285
suite = unittest.defaultTestLoader.loadTestsFromName(abstest)
282286
self._list_cases(suite)
283287
except unittest.SkipTest:
284-
self.skipped.append(test)
288+
self.skipped.append(test_name)
285289

286290
if self.skipped:
287291
print(file=sys.stderr)
@@ -298,19 +302,19 @@ def rerun_failed_tests(self):
298302
print()
299303
print("Re-running failed tests in verbose mode")
300304
self.rerun = self.bad[:]
301-
for test in self.rerun:
302-
print("Re-running test %r in verbose mode" % test, flush=True)
303-
try:
304-
self.ns.verbose = True
305-
ok = runtest(self.ns, test)
306-
except KeyboardInterrupt:
307-
self.interrupted = True
305+
for test_name in self.rerun:
306+
print("Re-running test %r in verbose mode" % test_name, flush=True)
307+
self.ns.verbose = True
308+
ok = runtest(self.ns, test_name)
309+
310+
if ok[0] in {PASSED, ENV_CHANGED, SKIPPED, RESOURCE_DENIED}:
311+
self.bad.remove(test_name)
312+
313+
if ok.result == INTERRUPTED:
308314
# print a newline separate from the ^C
309315
print()
316+
self.interrupted = True
310317
break
311-
else:
312-
if ok[0] in {PASSED, ENV_CHANGED, SKIPPED, RESOURCE_DENIED}:
313-
self.bad.remove(test)
314318
else:
315319
if self.bad:
316320
print(count(len(self.bad), 'test'), "failed again:")
@@ -348,8 +352,8 @@ def display_result(self):
348352
self.test_times.sort(reverse=True)
349353
print()
350354
print("10 slowest tests:")
351-
for time, test in self.test_times[:10]:
352-
print("- %s: %s" % (test, format_duration(time)))
355+
for test_time, test in self.test_times[:10]:
356+
print("- %s: %s" % (test, format_duration(test_time)))
353357

354358
if self.bad:
355359
print()
@@ -387,33 +391,31 @@ def run_tests_sequential(self):
387391
print("Run tests sequentially")
388392

389393
previous_test = None
390-
for test_index, test in enumerate(self.tests, 1):
394+
for test_index, test_name in enumerate(self.tests, 1):
391395
start_time = time.monotonic()
392396

393-
text = test
397+
text = test_name
394398
if previous_test:
395399
text = '%s -- %s' % (text, previous_test)
396400
self.display_progress(test_index, text)
397401

398402
if self.tracer:
399403
# If we're tracing code coverage, then we don't exit with status
400404
# if on a false return value from main.
401-
cmd = ('result = runtest(self.ns, test); '
402-
'self.accumulate_result(test, result)')
405+
cmd = ('result = runtest(self.ns, test_name); '
406+
'self.accumulate_result(result)')
403407
ns = dict(locals())
404408
self.tracer.runctx(cmd, globals=globals(), locals=ns)
405409
result = ns['result']
406410
else:
407-
try:
408-
result = runtest(self.ns, test)
409-
except KeyboardInterrupt:
410-
self.interrupted = True
411-
self.accumulate_result(test, (INTERRUPTED, None, None))
412-
break
413-
else:
414-
self.accumulate_result(test, result)
415-
416-
previous_test = format_test_result(test, result[0])
411+
result = runtest(self.ns, test_name)
412+
self.accumulate_result(result)
413+
414+
if result.result == INTERRUPTED:
415+
self.interrupted = True
416+
break
417+
418+
previous_test = format_test_result(result)
417419
test_time = time.monotonic() - start_time
418420
if test_time >= PROGRESS_MIN_TIME:
419421
previous_test = "%s in %s" % (previous_test, format_duration(test_time))
@@ -441,8 +443,8 @@ def run_tests_sequential(self):
441443

442444
def _test_forever(self, tests):
443445
while True:
444-
for test in tests:
445-
yield test
446+
for test_name in tests:
447+
yield test_name
446448
if self.bad:
447449
return
448450
if self.ns.fail_env_changed and self.environment_changed:

Lib/test/libregrtest/refleak.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import errno
21
import os
32
import re
43
import sys
@@ -18,7 +17,7 @@ def _get_dump(cls):
1817
cls._abc_negative_cache, cls._abc_negative_cache_version)
1918

2019

21-
def dash_R(ns, the_module, test_name, test_func):
20+
def dash_R(ns, test_name, test_func):
2221
"""Run a test multiple times, looking for reference leaks.
2322
2423
Returns:

0 commit comments

Comments
 (0)
0