diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py index 968b59df5a8..62d869c41a4 100755 --- 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 @@ -831,20 +831,30 @@ 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, + display_failure=not verbose) return result finally: if use_timeout: @@ -1020,7 +1030,8 @@ 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 +1069,10 @@ def runtest_inner(test, verbose, quiet, huntrleaks=False, debug=False): 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: diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 13dc337e3e5..e075a6b3fc3 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -40,6 +40,7 @@ class FileTests(unittest.TestCase): tearDown = setUp def test_access(self): + self.assertEqual(1,2) f = os.open(support.TESTFN, os.O_CREAT|os.O_RDWR) os.close(f) self.assertTrue(os.access(support.TESTFN, os.W_OK)) diff --git a/Misc/NEWS b/Misc/NEWS index 282dc5ac0c6..ce31628c52f 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -924,6 +924,10 @@ Extension Modules Tests ----- +- Issue #12400: regrtest -W doesn't rerun the tests twice anymore, but captures + the output and displays it on failure instead. regrtest -v doesn't print the + error twice anymore if there is only one error. + - Issue #12141: Install copies of template C module file so that test_build_ext of test_distutils and test_command_build_ext of test_packaging are no longer silently skipped when