Add a -S/--slow flag to regrtest to have it print the 10 slowest tests with
their times.
This commit is contained in:
parent
08811dde5d
commit
36dbcb9e98
|
@ -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 getopt
|
||||
import random
|
||||
import warnings
|
||||
import re
|
||||
import cStringIO
|
||||
import getopt
|
||||
import os
|
||||
import random
|
||||
import re
|
||||
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:
|
||||
|
|
Loading…
Reference in New Issue