8000 bpo-36719: Fix regrtest re-run (GH-12964) · python/cpython@837acc1 · GitHub
[go: up one dir, main page]

Skip to content

Commit 837acc1

Browse files
authored
bpo-36719: Fix regrtest re-run (GH-12964)
Properly handle a test which fail but then pass. Add test_rerun_success() unit test.
1 parent 75120d2 commit 837acc1

File tree

3 files changed

+35
-14
lines changed

3 files changed

+35
-14
lines changed

Lib/test/libregrtest/main.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -103,17 +103,18 @@ def get_executed(self):
103103
| set(self.resource_denieds) | set(self.environment_changed)
104104
| set(self.run_no_tests))
105105

106-
def accumulate_result(self, result):
106+
def accumulate_result(self, result, rerun=False):
107107
test_name = result.test_name
108108
ok = result.result
109109

110-
if ok not in (CHILD_ERROR, INTERRUPTED):
110+
if ok not in (CHILD_ERROR, INTERRUPTED) and not rerun:
111111
self.test_times.append((result.test_time, test_name))
112112

113113
if ok == PASSED:
114114
self.good.append(test_name)
115115
elif ok in (FAILED, CHILD_ERROR):
116-
self.bad.append(test_name)
116+
if not rerun:
117+
self.bad.append(test_name)
117118
elif ok == ENV_CHANGED:
118119
self.environment_changed.append(test_name)
119120
elif ok == SKIPPED:
@@ -123,9 +124,14 @@ def accumulate_result(self, result):
123124
self.resource_denieds.append(test_name)
124125
elif ok == TEST_DID_NOT_RUN:
125126
self.run_no_tests.append(test_name)
126-
elif ok != INTERRUPTED:
127+
elif ok == INTERRUPTED:
128+
self.interrupted = True
129+
else:
127130
raise ValueError("invalid test result: %r" % ok)
128131

132+
if rerun and ok not in {FAILED, CHILD_ERROR, INTERRUPTED}:
133+
self.bad.remove(test_name)
134+
129135
xml_data = result.xml_data
130136
if xml_data:
131137
import xml.etree.ElementTree as ET
@@ -287,13 +293,11 @@ def rerun_failed_tests(self):
287293
for test_name in self.rerun:
288294
print(f"Re-running {test_name} in verbose mode", flush=True)
289295
self.ns.verbose = True
290-
ok = runtest(self.ns, test_name)
296+
result = runtest(self.ns, test_name)
291297

292-
if ok[0] in {PASSED, ENV_CHANGED, SKIPPED, RESOURCE_DENIED}:
293-
self.bad.remove(test_name)
298+
self.accumulate_result(result, rerun=True)
294299

295-
if ok.result == INTERRUPTED:
296-
self.interrupted = True
300+
if result.result == INTERRUPTED:
297301
break
298302

299303
if self.bad:
@@ -392,7 +396,6 @@ def run_tests_sequential(self):
392396
self.accumulate_result(result)
393397

394398
if result.result == INTERRUPTED:
395-
self.interrupted = True
396399
break
397400

398401
previous_test = format_test_result(result)

Lib/test/libregrtest/runtest_mp.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -255,9 +255,6 @@ def _process_result(self, item):
255255
if mp_result.stderr and not self.ns.pgo:
256256
print(mp_result.stderr, file=sys.stderr, flush=True)
257257

258-
if mp_result.result.result == INTERRUPTED:
259-
self.regrtest.interrupted = True
260-
261258
if must_stop(mp_result.result):
262259
return True
263260

Lib/test/test_regrtest.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,7 @@ def list_regex(line_format, tests):
484484
result.append('SUCCESS')
485485
result = ', '.join(result)
486486
if rerun:
487-
self.check_line(output, 'Tests result: %s' % result)
487+
self.check_line(output, 'Tests result: FAILURE')
488488
result = 'FAILURE then %s' % result
489489

490490
self.check_line(output, 'Tests result: %s' % result)
@@ -989,6 +989,7 @@ def test_env_changed(self):
989989
fail_env_changed=True)
990990

991991
def test_rerun_fail(self):
992+
# FAILURE then FAILURE
992993
code = textwrap.dedent("""
993994
import unittest
994995
@@ -1003,6 +1004,26 @@ def test_bug(self):
10031004
self.check_executed_tests(output, [testname],
10041005
failed=testname, rerun=testname)
10051006

1007+
def test_rerun_success(self):
1008+
# FAILURE then SUCCESS
1009+
67F4 code = textwrap.dedent("""
1010+
import builtins
1011+
import unittest
1012+
1013+
class Tests(unittest.TestCase):
1014+
failed = False
1015+
1016+
def test_fail_once(self):
1017+
if not hasattr(builtins, '_test_failed'):
1018+
builtins._test_failed = True
1019+
self.fail("bug")
1020+
""")
1021+
testname = self.create_test(code=code)
1022+
1023+
output = self.run_tests("-w", testname, exitcode=0)
1024+
self.check_executed_tests(output, [testname],
1025+
rerun=testname)
1026+
10061027
def 4379 test_no_tests_ran(self):
10071028
code = textwrap.dedent("""
10081029
import unittest

0 commit comments

Comments
 (0)
0