diff options
author | Jeffrey Yasskin <jyasskin@gmail.com> | 2008-03-18 05:45:40 (GMT) |
---|---|---|
committer | Jeffrey Yasskin <jyasskin@gmail.com> | 2008-03-18 05:45:40 (GMT) |
commit | 36dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8 (patch) | |
tree | 9ec89729681b5b023afd990ce211f5a9128b2304 | |
parent | 08811dde5d797716009acd32c1604a41540d6dc9 (diff) | |
download | cpython-36dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8.zip cpython-36dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8.tar.gz cpython-36dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8.tar.bz2 |
Add a -S/--slow flag to regrtest to have it print the 10 slowest tests with
their times.
-rwxr-xr-x | Lib/test/regrtest.py | 54 |
1 files changed, 35 insertions, 19 deletions
diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py index 0211abb..ff132fb 100755 --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -13,6 +13,7 @@ Command line options: -q: quiet -- don't print anything except if a test fails -x: exclude -- arguments are tests to *exclude* -s: single -- run only a single test (see below) +-S: slow -- print the slowest 10 tests -r: random -- randomize test execution order -f: fromfile -- read names of tests to run from a file (see below) -l: findleaks -- if GC is available detect tests that leak memory @@ -120,14 +121,15 @@ example, to run all the tests except for the bsddb tests, give the option '-uall,-bsddb'. """ -import os -import sys +import cStringIO import getopt +import os import random -import warnings import re -import cStringIO +import sys +import time import traceback +import warnings from inspect import isabstract # I see no other way to suppress these warnings; @@ -179,7 +181,7 @@ def usage(code, msg=''): def main(tests=None, testdir=None, verbose=0, quiet=False, generate=False, exclude=False, single=False, randomize=False, fromfile=None, findleaks=False, use_resources=None, trace=False, coverdir='coverage', - runleaks=False, huntrleaks=False, verbose2=False): + runleaks=False, huntrleaks=False, verbose2=False, print_slow=False): """Execute a test suite. This also parses command-line options and modifies its behavior @@ -196,17 +198,17 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, generate=False, command-line will be used. If that's empty, too, then all *.py files beginning with test_ will be used. - The other default arguments (verbose, quiet, generate, exclude, single, - randomize, findleaks, use_resources, trace and coverdir) allow programmers - calling main() directly to set the values that would normally be set by - flags on the command line. + The other default arguments (verbose, quiet, generate, exclude, + single, randomize, findleaks, use_resources, trace, coverdir, and + print_slow) allow programmers calling main() directly to set the + values that would normally be set by flags on the command line. """ test_support.record_original_stdout(sys.stdout) try: - opts, args = getopt.getopt(sys.argv[1:], 'hvgqxsrf:lu:t:TD:NLR:wM:', + opts, args = getopt.getopt(sys.argv[1:], 'hvgqxsSrf:lu:t:TD:NLR:wM:', ['help', 'verbose', 'quiet', 'exclude', - 'single', 'random', 'fromfile', + 'single', 'slow', 'random', 'fromfile', 'findleaks', 'use=', 'threshold=', 'trace', 'coverdir=', 'nocoverdir', 'runleaks', 'huntrleaks=', 'verbose2', 'memlimit=', @@ -231,6 +233,8 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, generate=False, exclude = True elif o in ('-s', '--single'): single = True + elif o in ('-S', '--slow'): + print_slow = True elif o in ('-r', '--randomize'): randomize = True elif o in ('-f', '--fromfile'): @@ -346,6 +350,7 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, generate=False, import trace tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix], trace=False, count=True) + test_times = [] test_support.verbose = verbose # Tell tests to be moderately quiet test_support.use_resources = use_resources save_modules = sys.modules.keys() @@ -356,12 +361,13 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, generate=False, if trace: # If we're tracing code coverage, then we don't exit with status # if on a false return value from main. - tracer.runctx('runtest(test, generate, verbose, quiet, testdir)', + tracer.runctx('runtest(test, generate, verbose, quiet,' + ' test_times, testdir)', globals=globals(), locals=vars()) else: try: - ok = runtest(test, generate, verbose, quiet, testdir, - huntrleaks) + ok = runtest(test, generate, verbose, quiet, test_times, + testdir, huntrleaks) except KeyboardInterrupt: # print a newline separate from the ^C print @@ -399,6 +405,11 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, generate=False, if not bad and not skipped and len(good) > 1: print "All", print count(len(good), "test"), "OK." + if print_slow: + test_times.sort(reverse=True) + print "10 slowest tests:" + for time, test in test_times[:10]: + print "%s: %.1fs" % (test, time) if bad: print count(len(bad), "test"), "failed:" printlist(bad) @@ -492,12 +503,14 @@ def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS): tests.sort() return stdtests + tests -def runtest(test, generate, verbose, quiet, testdir=None, huntrleaks=False): +def runtest(test, generate, verbose, quiet, test_times, + testdir=None, huntrleaks=False): """Run a single test. test -- the name of the test verbose -- if true, print more messages quiet -- if true, don't print 'skipped' messages (probably redundant) + test_times -- a list of (time, test_name) pairs testdir -- test directory huntrleaks -- run multiple times to test for leaks; requires a debug build; a triple corresponding to -R's three arguments @@ -509,13 +522,13 @@ def runtest(test, generate, verbose, quiet, testdir=None, huntrleaks=False): """ try: - return runtest_inner(test, generate, verbose, quiet, testdir, - huntrleaks) + return runtest_inner(test, generate, verbose, quiet, test_times, + testdir, huntrleaks) finally: cleanup_test_droppings(test, verbose) -def runtest_inner(test, generate, verbose, quiet, - testdir=None, huntrleaks=False): +def runtest_inner(test, generate, verbose, quiet, test_times, + testdir=None, huntrleaks=False): test_support.unload(test) if not testdir: testdir = findtestdir() @@ -535,6 +548,7 @@ def runtest_inner(test, generate, verbose, quiet, else: # Always import it from the test package abstest = 'test.' + test + start_time = time.time() the_package = __import__(abstest, globals(), locals(), []) the_module = getattr(the_package, test) # Old tests run to completion simply as a side-effect of @@ -545,6 +559,8 @@ def runtest_inner(test, generate, verbose, quiet, indirect_test() if huntrleaks: dash_R(the_module, test, indirect_test, huntrleaks) + test_time = time.time() - start_time + test_times.append((test_time, test)) finally: sys.stdout = save_stdout except test_support.ResourceDenied, msg: |