(merge 3.2) Issue #12400: runtest() reuses the same io.StringIO instance for
all calls * Don't force verbose to True with option -W * Rename rerun_failed variable to output_on_failure
This commit is contained in:
commit
d71bd9a9a4
|
@ -162,23 +162,24 @@ option '-uall,-gui'.
|
|||
"""
|
||||
|
||||
import builtins
|
||||
import errno
|
||||
import faulthandler
|
||||
import getopt
|
||||
import io
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import platform
|
||||
import random
|
||||
import re
|
||||
import sys
|
||||
import time
|
||||
import errno
|
||||
import traceback
|
||||
import warnings
|
||||
import unittest
|
||||
from inspect import isabstract
|
||||
import tempfile
|
||||
import platform
|
||||
import sysconfig
|
||||
import logging
|
||||
import tempfile
|
||||
import time
|
||||
import traceback
|
||||
import unittest
|
||||
import warnings
|
||||
from inspect import isabstract
|
||||
|
||||
|
||||
# Some times __path__ and __file__ are not absolute (e.g. while running from
|
||||
|
@ -579,7 +580,8 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
|
|||
args_tuple = (
|
||||
(test, verbose, quiet),
|
||||
dict(huntrleaks=huntrleaks, use_resources=use_resources,
|
||||
debug=debug, rerun_failed=verbose3, timeout=timeout)
|
||||
debug=debug, output_on_failure=verbose3,
|
||||
timeout=timeout)
|
||||
)
|
||||
yield (test, args_tuple)
|
||||
pending = tests_and_args()
|
||||
|
@ -664,7 +666,7 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
|
|||
else:
|
||||
try:
|
||||
result = runtest(test, verbose, quiet, huntrleaks, debug,
|
||||
rerun_failed=verbose3, timeout=timeout)
|
||||
output_on_failure=verbose3, timeout=timeout)
|
||||
accumulate_result(test, result)
|
||||
except KeyboardInterrupt:
|
||||
interrupted = True
|
||||
|
@ -808,7 +810,7 @@ def replace_stdout():
|
|||
|
||||
def runtest(test, verbose, quiet,
|
||||
huntrleaks=False, debug=False, use_resources=None,
|
||||
rerun_failed=False, timeout=None):
|
||||
output_on_failure=False, timeout=None):
|
||||
"""Run a single test.
|
||||
|
||||
test -- the name of the test
|
||||
|
@ -817,7 +819,7 @@ def runtest(test, verbose, quiet,
|
|||
test_times -- a list of (time, test_name) pairs
|
||||
huntrleaks -- run multiple times to test for leaks; requires a debug
|
||||
build; a triple corresponding to -R's three arguments
|
||||
rerun_failed -- if true, re-run in verbose mode when failed
|
||||
output_on_failure -- if true, display test output on failure
|
||||
timeout -- dump the traceback and exit if a test takes more than
|
||||
timeout seconds
|
||||
|
||||
|
@ -836,22 +838,29 @@ def runtest(test, verbose, quiet,
|
|||
if use_timeout:
|
||||
faulthandler.dump_tracebacks_later(timeout, exit=True)
|
||||
try:
|
||||
if rerun_failed:
|
||||
support.verbose = True
|
||||
support.verbose = verbose # Tell tests to be moderately quiet
|
||||
if output_on_failure:
|
||||
if runtest.stringio is None:
|
||||
# Reuse the same instance to all calls to runtest(). Some
|
||||
# tests keep a reference to sys.stdout or sys.stderr
|
||||
# (eg. test_argparse).
|
||||
runtest.stringio = io.StringIO()
|
||||
|
||||
orig_stdout = sys.stdout
|
||||
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
|
||||
try:
|
||||
sys.stdout = runtest.stringio
|
||||
sys.stderr = runtest.stringio
|
||||
result = runtest_inner(test, verbose, quiet, huntrleaks,
|
||||
debug, display_failure=False)
|
||||
if result[0] == FAILED:
|
||||
output = stringio.getvalue()
|
||||
orig_stderr.write(output)
|
||||
orig_stderr.flush()
|
||||
finally:
|
||||
sys.stdout = orig_stdout
|
||||
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
|
||||
|
@ -859,6 +868,7 @@ def runtest(test, verbose, quiet,
|
|||
if use_timeout:
|
||||
faulthandler.cancel_dump_tracebacks_later()
|
||||
cleanup_test_droppings(test, verbose)
|
||||
runtest.stringio = None
|
||||
|
||||
# Unit tests are supposed to leave the execution environment unchanged
|
||||
# once they complete. But sometimes tests have bugs, especially when
|
||||
|
|
Loading…
Reference in New Issue