mirror of
https://github.com/python/cpython.git
synced 2024-12-14 20:34:12 +08:00
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:
parent
64ab9f7d5c
commit
72fb39c965
@ -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)
|
||||||
|
|
||||||
|
@ -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("""
|
||||||
|
@ -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.
|
Loading…
Reference in New Issue
Block a user