summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorJeffrey Yasskin <jyasskin@gmail.com>2008-03-18 05:45:40 (GMT)
committerJeffrey Yasskin <jyasskin@gmail.com>2008-03-18 05:45:40 (GMT)
commit36dbcb9e98ef9f3fdc731f42670b7dfd1154c6d8 (patch)
tree9ec89729681b5b023afd990ce211f5a9128b2304 /Lib
parent08811dde5d797716009acd32c1604a41540d6dc9 (diff)
downloadcpython-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.
Diffstat (limited to 'Lib')
-rwxr-xr-xLib/test/regrtest.py54
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: