Commit b4f8bc56 authored by Victor Stinner's avatar Victor Stinner Committed by GitHub

bpo-33718: regrtest: use "xxx then yyy" result if re-run (GH-7521) (GH-7562)

If tests are re-run, use "xxx then yyy" result format (ex: "FAILURE
then SUCCESS") to show that some failing tests have been re-run.

Add also test_regrtest.test_rerun_fail() test.

(cherry picked from commit c45fc767)
parent 4e6bd247
...@@ -530,6 +530,7 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, ...@@ -530,6 +530,7 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
resource_denieds = [] resource_denieds = []
environment_changed = [] environment_changed = []
rerun = [] rerun = []
first_result = None
interrupted = False interrupted = False
if findleaks: if findleaks:
...@@ -907,7 +908,10 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, ...@@ -907,7 +908,10 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
if not result: if not result:
result.append("SUCCESS") result.append("SUCCESS")
return ', '.join(result) result = ', '.join(result)
if first_result:
result = '%s then %s' % (first_result, result)
return result
def display_result(): def display_result():
...@@ -974,6 +978,8 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, ...@@ -974,6 +978,8 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
display_result() display_result()
if verbose2 and bad: if verbose2 and bad:
first_result = get_tests_result()
print print
print "Re-running failed tests in verbose mode" print "Re-running failed tests in verbose mode"
rerun = bad[:] rerun = bad[:]
......
...@@ -92,6 +92,7 @@ class BaseTestCase(unittest.TestCase): ...@@ -92,6 +92,7 @@ class BaseTestCase(unittest.TestCase):
def check_executed_tests(self, output, tests, skipped=(), failed=(), def check_executed_tests(self, output, tests, skipped=(), failed=(),
env_changed=(), omitted=(), env_changed=(), omitted=(),
rerun=(),
randomize=False, interrupted=False, randomize=False, interrupted=False,
fail_env_changed=False): fail_env_changed=False):
if isinstance(tests, str): if isinstance(tests, str):
...@@ -104,6 +105,8 @@ class BaseTestCase(unittest.TestCase): ...@@ -104,6 +105,8 @@ class BaseTestCase(unittest.TestCase):
env_changed = [env_changed] env_changed = [env_changed]
if isinstance(omitted, str): if isinstance(omitted, str):
omitted = [omitted] omitted = [omitted]
if isinstance(rerun, str):
rerun = [rerun]
executed = self.parse_executed_tests(output) executed = self.parse_executed_tests(output)
if randomize: if randomize:
...@@ -138,6 +141,14 @@ class BaseTestCase(unittest.TestCase): ...@@ -138,6 +141,14 @@ class BaseTestCase(unittest.TestCase):
regex = list_regex('%s test%s omitted', omitted) regex = list_regex('%s test%s omitted', omitted)
self.check_line(output, regex) self.check_line(output, regex)
if rerun:
regex = list_regex('%s re-run test%s', rerun)
self.check_line(output, regex)
self.check_line(output, "Re-running failed tests in verbose mode")
for name in rerun:
regex = "Re-running test %r in verbose mode" % name
self.check_line(output, regex)
good = (len(tests) - len(skipped) - len(failed) good = (len(tests) - len(skipped) - len(failed)
- len(omitted) - len(env_changed)) - len(omitted) - len(env_changed))
if good: if good:
...@@ -149,14 +160,19 @@ class BaseTestCase(unittest.TestCase): ...@@ -149,14 +160,19 @@ class BaseTestCase(unittest.TestCase):
if interrupted: if interrupted:
self.check_line(output, 'Test suite interrupted by signal SIGINT.') self.check_line(output, 'Test suite interrupted by signal SIGINT.')
result = []
if failed: if failed:
result = 'FAILURE' result.append('FAILURE')
elif interrupted:
result = 'INTERRUPTED'
elif fail_env_changed and env_changed: elif fail_env_changed and env_changed:
result = 'ENV CHANGED' result.append('ENV CHANGED')
else: if interrupted:
result = 'SUCCESS' result.append('INTERRUPTED')
if not result:
result.append('SUCCESS')
result = ', '.join(result)
if rerun:
self.check_line(output, 'Tests result: %s' % result)
result = 'FAILURE then %s' % result
self.check_line(output, 'Tests result: %s' % result) self.check_line(output, 'Tests result: %s' % result)
def parse_random_seed(self, output): def parse_random_seed(self, output):
...@@ -648,6 +664,24 @@ class ArgsTestCase(BaseTestCase): ...@@ -648,6 +664,24 @@ 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) fail_env_changed=True)
def test_rerun_fail(self):
code = textwrap.dedent("""
import unittest
class Tests(unittest.TestCase):
def test_bug(self):
# test always fail
self.fail("bug")
def test_main():
support.run_unittest(Tests)
""")
testname = self.create_test(code=code)
output = self.run_tests("-w", testname, exitcode=2)
self.check_executed_tests(output, [testname],
failed=testname, rerun=testname)
def test_main(): def test_main():
support.run_unittest(ProgramsTestCase, ArgsTestCase) support.run_unittest(ProgramsTestCase, ArgsTestCase)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment