[Python-checkins] cpython (3.2): Issue #12400: runtest() reuses the same io.StringIO instance for all calls

victor.stinner python-checkins at python.org
Wed Jun 29 15:26:01 CEST 2011


http://hg.python.org/cpython/rev/6c54c334ea7a
changeset:   71068:6c54c334ea7a
branch:      3.2
parent:      71066:74c6afbb524a
user:        Victor Stinner <victor.stinner at haypocalc.com>
date:        Wed Jun 29 15:22:26 2011 +0200
summary:
  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

files:
  Lib/test/regrtest.py |  57 ++++++++++++++++++-------------
  1 files changed, 33 insertions(+), 24 deletions(-)


diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py
--- a/Lib/test/regrtest.py
+++ b/Lib/test/regrtest.py
@@ -154,22 +154,23 @@
 """
 
 import builtins
+import errno
 import getopt
+import io
 import json
+import logging
 import os
+import platform
 import random
 import re
 import sys
+import sysconfig
+import tempfile
 import time
-import errno
 import traceback
+import unittest
 import warnings
-import unittest
 from inspect import isabstract
-import tempfile
-import platform
-import sysconfig
-import logging
 
 
 # Some times __path__ and __file__ are not absolute (e.g. while running from
@@ -535,7 +536,7 @@
                 args_tuple = (
                     (test, verbose, quiet),
                     dict(huntrleaks=huntrleaks, use_resources=use_resources,
-                         debug=debug, rerun_failed=verbose3)
+                         debug=debug, output_on_failure=verbose3)
                 )
                 yield (test, args_tuple)
         pending = tests_and_args()
@@ -613,7 +614,7 @@
             else:
                 try:
                     result = runtest(test, verbose, quiet, huntrleaks, debug,
-                                     rerun_failed=verbose3)
+                                     output_on_failure=verbose3)
                     accumulate_result(test, result)
                 except KeyboardInterrupt:
                     interrupted = True
@@ -760,7 +761,7 @@
 
 def runtest(test, verbose, quiet,
             huntrleaks=False, debug=False, use_resources=None,
-            rerun_failed=False):
+            output_on_failure=False):
     """Run a single test.
 
     test -- the name of the test
@@ -769,7 +770,7 @@
     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
 
     Returns one of the test result constants:
         INTERRUPTED      KeyboardInterrupt when run under -j
@@ -783,27 +784,35 @@
     if use_resources is not None:
         support.use_resources = use_resources
     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
     finally:
         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

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list