From 216a3bc36d31df71544fd9a11b98fca4efeb8182 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Sat, 23 Jul 2011 22:33:39 +0200 Subject: Issue #12624: It is now possible to fail after the first failure when running in verbose mode (`-v` or `-W`), by using the `--failfast` (or `-G`) option to regrtest. This is useful with long test suites such as test_io or test_subprocess. --- Lib/test/regrtest.py | 21 +++++++++++++++------ Lib/test/support.py | 6 ++++-- Misc/NEWS | 5 +++++ 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py index 8ca7f6c..6fad78f 100755 --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -38,6 +38,7 @@ Selecting tests -f/--fromfile -- read names of tests to run from a file (see below) -x/--exclude -- arguments are tests to *exclude* -s/--single -- single step through a set of tests (see below) +-G/--failfast -- fail as soon as a test fails (only with -v or -W) -u/--use RES1,RES2,... -- specify which special resource intensive tests to run -M/--memlimit LIMIT @@ -241,7 +242,7 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, 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, - header=False): + header=False, failfast=False): """Execute a test suite. This also parses command-line options and modifies its behavior @@ -269,13 +270,13 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, support.record_original_stdout(sys.stdout) try: - opts, args = getopt.getopt(sys.argv[1:], 'hvqxsSrf:lu:t:TD:NLR:FwWM:nj:', + opts, args = getopt.getopt(sys.argv[1:], 'hvqxsSrf:lu:t:TD:NLR:FwWM:nj:G', ['help', 'verbose', 'verbose2', 'verbose3', 'quiet', 'exclude', 'single', 'slow', 'random', 'fromfile', 'findleaks', 'use=', 'threshold=', 'trace', 'coverdir=', 'nocoverdir', 'runleaks', 'huntrleaks=', 'memlimit=', 'randseed=', 'multiprocess=', 'coverage', 'slaveargs=', 'forever', 'debug', - 'start=', 'nowindows', 'header']) + 'start=', 'nowindows', 'header', 'failfast']) except getopt.error as msg: usage(msg) @@ -298,6 +299,8 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, debug = True elif o in ('-W', '--verbose3'): verbose3 = True + elif o in ('-G', '--failfast'): + failfast = True elif o in ('-q', '--quiet'): quiet = True; verbose = 0 @@ -406,6 +409,8 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, usage("-T and -j don't go together!") if use_mp and findleaks: usage("-l and -j don't go together!") + if failfast and not (verbose or verbose3): + usage("-G/--failfast needs either -v or -W") good = [] bad = [] @@ -545,7 +550,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, output_on_failure=verbose3) + debug=debug, output_on_failure=verbose3, + failfast=failfast) ) yield (test, args_tuple) pending = tests_and_args() @@ -623,7 +629,8 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, else: try: result = runtest(test, verbose, quiet, huntrleaks, debug, - output_on_failure=verbose3) + output_on_failure=verbose3, + failfast=failfast) accumulate_result(test, result) except KeyboardInterrupt: interrupted = True @@ -770,7 +777,7 @@ def replace_stdout(): def runtest(test, verbose, quiet, huntrleaks=False, debug=False, use_resources=None, - output_on_failure=False): + output_on_failure=False, failfast=False): """Run a single test. test -- the name of the test @@ -793,6 +800,8 @@ def runtest(test, verbose, quiet, if use_resources is not None: support.use_resources = use_resources try: + if failfast: + support.failfast = True if output_on_failure: support.verbose = True diff --git a/Lib/test/support.py b/Lib/test/support.py index 2827e8b..09846a8 100644 --- a/Lib/test/support.py +++ b/Lib/test/support.py @@ -52,7 +52,7 @@ __all__ = [ "reap_children", "cpython_only", "check_impl_detail", "get_attribute", "swap_item", "swap_attr", "requires_IEEE_754", "TestHandler", "Matcher", "can_symlink", "skip_unless_symlink", - "import_fresh_module" + "import_fresh_module", "failfast", ] class Error(Exception): @@ -176,6 +176,7 @@ use_resources = None # Flag set to [] by regrtest.py max_memuse = 0 # Disable bigmem tests (they will still be run with # small sizes, to make sure they work.) real_max_memuse = 0 +failfast = False # _original_stdout is meant to hold stdout at the time regrtest began. # This may be "the real" stdout, or IDLE's emulation of stdout, or whatever. @@ -1186,7 +1187,8 @@ def check_impl_detail(**guards): def _run_suite(suite): """Run tests from a unittest.TestSuite-derived class.""" if verbose: - runner = unittest.TextTestRunner(sys.stdout, verbosity=2) + runner = unittest.TextTestRunner(sys.stdout, verbosity=2, + failfast=failfast) else: runner = BasicTestRunner() diff --git a/Misc/NEWS b/Misc/NEWS index f6a222d..c7e917e 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -104,6 +104,11 @@ C-API Tests ----- +- Issue #12624: It is now possible to fail after the first failure when + running in verbose mode (``-v`` or ``-W``), by using the ``--failfast`` + (or ``-G``) option to regrtest. This is useful with long test suites + such as test_io or test_subprocess. + - Issue #12587: Correct faulty test file and reference in test_tokenize. (Patch by Robert Xiao) -- cgit v0.12