gh-109276: regrtest re-runs "env changed" tests (#109831)

When a test fails with "env changed" and --rerun option is used, the
test is now re-run in verbose mode in a fresh process.
This commit is contained in:
Victor Stinner 2023-09-25 16:21:01 +02:00 committed by GitHub
parent 64ab9f7d5c
commit 72fb39c965
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 7 deletions

View File

@ -25,7 +25,7 @@ class TestResults:
self.env_changed: TestList = [] self.env_changed: TestList = []
self.run_no_tests: TestList = [] self.run_no_tests: TestList = []
self.rerun: TestList = [] self.rerun: TestList = []
self.bad_results: list[TestResult] = [] self.rerun_results: list[TestResult] = []
self.interrupted: bool = False self.interrupted: bool = False
self.test_times: list[tuple[float, TestName]] = [] self.test_times: list[tuple[float, TestName]] = []
@ -87,6 +87,7 @@ class TestResults:
self.good.append(test_name) self.good.append(test_name)
case State.ENV_CHANGED: case State.ENV_CHANGED:
self.env_changed.append(test_name) self.env_changed.append(test_name)
self.rerun_results.append(result)
case State.SKIPPED: case State.SKIPPED:
self.skipped.append(test_name) self.skipped.append(test_name)
case State.RESOURCE_DENIED: case State.RESOURCE_DENIED:
@ -98,7 +99,7 @@ class TestResults:
case _: case _:
if result.is_failed(fail_env_changed): if result.is_failed(fail_env_changed):
self.bad.append(test_name) self.bad.append(test_name)
self.bad_results.append(result) self.rerun_results.append(result)
else: else:
raise ValueError(f"invalid test state: {result.state!r}") raise ValueError(f"invalid test state: {result.state!r}")
@ -114,12 +115,12 @@ class TestResults:
self.add_junit(xml_data) self.add_junit(xml_data)
def need_rerun(self): def need_rerun(self):
return bool(self.bad_results) return bool(self.rerun_results)
def prepare_rerun(self) -> tuple[TestTuple, FilterDict]: def prepare_rerun(self) -> tuple[TestTuple, FilterDict]:
tests: TestList = [] tests: TestList = []
match_tests_dict = {} match_tests_dict = {}
for result in self.bad_results: for result in self.rerun_results:
tests.append(result.test_name) tests.append(result.test_name)
match_tests = result.get_rerun_match_tests() match_tests = result.get_rerun_match_tests()
@ -130,7 +131,8 @@ class TestResults:
# Clear previously failed tests # Clear previously failed tests
self.rerun_bad.extend(self.bad) self.rerun_bad.extend(self.bad)
self.bad.clear() self.bad.clear()
self.bad_results.clear() self.env_changed.clear()
self.rerun_results.clear()
return (tuple(tests), match_tests_dict) return (tuple(tests), match_tests_dict)

View File

@ -463,7 +463,7 @@ class BaseTestCase(unittest.TestCase):
randomize = True randomize = True
rerun_failed = [] rerun_failed = []
if rerun is not None: if rerun is not None and not env_changed:
failed = [rerun.name] failed = [rerun.name]
if not rerun.success: if not rerun.success:
rerun_failed.append(rerun.name) rerun_failed.append(rerun.name)
@ -591,7 +591,7 @@ class BaseTestCase(unittest.TestCase):
state = ', '.join(state) state = ', '.join(state)
if rerun is not None: if rerun is not None:
new_state = 'SUCCESS' if rerun.success else 'FAILURE' new_state = 'SUCCESS' if rerun.success else 'FAILURE'
state = 'FAILURE then ' + new_state state = f'{state} then {new_state}'
self.check_line(output, f'Result: {state}', full=True) self.check_line(output, f'Result: {state}', full=True)
def parse_random_seed(self, output): def parse_random_seed(self, output):
@ -1229,6 +1229,15 @@ class ArgsTestCase(BaseTestCase):
self.check_executed_tests(output, [testname], env_changed=testname, self.check_executed_tests(output, [testname], env_changed=testname,
fail_env_changed=True, stats=1) fail_env_changed=True, stats=1)
# rerun
output = self.run_tests("--rerun", testname)
self.check_executed_tests(output, [testname],
env_changed=testname,
rerun=Rerun(testname,
match=None,
success=True),
stats=2)
def test_rerun_fail(self): def test_rerun_fail(self):
# FAILURE then FAILURE # FAILURE then FAILURE
code = textwrap.dedent(""" code = textwrap.dedent("""

View File

@ -0,0 +1,3 @@
regrtest: When a test fails with "env changed" and the --rerun option is
used, the test is now re-run in verbose mode in a fresh process. Patch by
Victor Stinner.