diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -30,7 +30,7 @@ Verbosity -v/--verbose -- run tests in verbose mode with output to stdout -w/--verbose2 -- re-run failed tests in verbose mode --W/--verbose3 -- re-run failed tests in verbose mode immediately +-W/--verbose3 -- display test output on failure -d/--debug -- print traceback for failed tests -q/--quiet -- no output unless one or more tests fail -S/--slow -- print the slowest 10 tests @@ -240,8 +240,8 @@ def usage(msg): def main(tests=None, testdir=None, verbose=0, quiet=False, exclude=False, single=False, randomize=False, fromfile=None, findleaks=False, use_resources=None, trace=False, coverdir='coverage', - runleaks=False, huntrleaks=False, verbose2=False, print_slow=False, - random_seed=None, use_mp=None, verbose3=False, forever=False, + runleaks=False, huntrleaks=False, rerun_later=False, print_slow=False, + random_seed=None, use_mp=None, rerun_immediatly=False, forever=False, header=False): """Execute a test suite. @@ -298,11 +298,11 @@ def main(tests=None, testdir=None, verbo elif o in ('-v', '--verbose'): verbose += 1 elif o in ('-w', '--verbose2'): - verbose2 = True + rerun_later = True elif o in ('-d', '--debug'): debug = True elif o in ('-W', '--verbose3'): - verbose3 = True + rerun_immediatly = True elif o in ('-q', '--quiet'): quiet = True; verbose = 0 @@ -580,7 +580,7 @@ def main(tests=None, testdir=None, verbo args_tuple = ( (test, verbose, quiet), dict(huntrleaks=huntrleaks, use_resources=use_resources, - debug=debug, rerun_failed=verbose3, timeout=timeout) + debug=debug, rerun_failed=rerun_immediatly, timeout=timeout) ) yield (test, args_tuple) pending = tests_and_args() @@ -665,7 +665,7 @@ def main(tests=None, testdir=None, verbo else: try: result = runtest(test, verbose, quiet, huntrleaks, debug, - rerun_failed=verbose3, timeout=timeout) + rerun_failed=rerun_immediatly, timeout=timeout) accumulate_result(test, result) except KeyboardInterrupt: interrupted = True @@ -729,7 +729,7 @@ def main(tests=None, testdir=None, verbo print("Ask someone to teach regrtest.py about which tests are") print("expected to get skipped on", plat + ".") - if verbose2 and bad: + if rerun_later and bad: print("Re-running failed tests in verbose mode") for test in bad: print("Re-running test %r in verbose mode" % test) @@ -831,20 +831,29 @@ def runtest(test, verbose, quiet, PASSED test passed """ - support.verbose = verbose # Tell tests to be moderately quiet if use_resources is not None: support.use_resources = use_resources use_timeout = (timeout is not None) if use_timeout: faulthandler.dump_tracebacks_later(timeout, exit=True) try: - result = runtest_inner(test, verbose, quiet, huntrleaks, debug) - if result[0] == FAILED and rerun_failed: - cleanup_test_droppings(test, verbose) - sys.stdout.flush() - sys.stderr.flush() - print("Re-running test {} in verbose mode".format(test)) - runtest(test, True, quiet, huntrleaks, debug, timeout=timeout) + if rerun_failed: + support.verbose = True + orig_stderr = sys.stderr + with support.captured_stdout() as stream: + try: + sys.stderr = stream + result = runtest_inner(test, verbose, quiet, huntrleaks, + debug, display_failure=False) + if result[0] == FAILED: + output = stream.getvalue() + orig_stderr.write(output) + orig_stderr.flush() + finally: + sys.stderr = orig_stderr + else: + support.verbose = verbose # Tell tests to be moderately quiet + result = runtest_inner(test, verbose, quiet, huntrleaks, debug) return result finally: if use_timeout: @@ -1020,7 +1029,7 @@ class saved_test_environment: return False -def runtest_inner(test, verbose, quiet, huntrleaks=False, debug=False): +def runtest_inner(test, verbose, quiet, huntrleaks=False, debug=False, display_failure=True): support.unload(test) test_time = 0.0 @@ -1058,7 +1067,10 @@ def runtest_inner(test, verbose, quiet, except KeyboardInterrupt: raise except support.TestFailed as msg: - print("test", test, "failed --", msg, file=sys.stderr) + if display_failure: + print("test", test, "failed --", msg, file=sys.stderr) + else: + print("test", test, "failed", file=sys.stderr) sys.stderr.flush() return FAILED, test_time except: