5 This will find all modules whose name is "test_*" in the test
6 directory, and run them. Various command line options provide
11 -v: verbose -- run tests in verbose mode with output to stdout
12 -q: quiet -- don't print anything except if a test fails
13 -g: generate -- write the output file for a test instead of comparing it
14 -x: exclude -- arguments are tests to *exclude*
15 -s: single -- run only a single test (see below)
16 -r: random -- randomize test execution order
17 -f: fromfile -- read names of tests to run from a file (see below)
18 -l: findleaks -- if GC is available detect tests that leak memory
19 -u: use -- specify which special resource intensive tests to run
20 -h: help -- print this text and exit
21 -t: threshold -- call gc.set_threshold(N)
22 -T: coverage -- turn on code coverage using the trace module
23 -D: coverdir -- Directory where coverage files are put
24 -N: nocoverdir -- Put coverage files alongside modules
25 -L: runleaks -- run the leaks(1) command just before exit
26 -R: huntrleaks -- search for reference leaks (needs debug build, v. slow)
28 If non-option arguments are present, they are names for tests to run,
29 unless -x is given, in which case they are names for tests not to run.
30 If no test names are given, all tests are run.
32 -v is incompatible with -g and does not compare test output files.
34 -T turns on code coverage tracing with the trace module.
36 -D specifies the directory where coverage files are put.
38 -N Put coverage files alongside modules.
40 -s means to run only a single test and exit. This is useful when
41 doing memory analysis on the Python interpreter (which tend to consume
42 too many resources to run the full regression test non-stop). The
43 file /tmp/pynexttest is read to find the next test to run. If this
44 file is missing, the first test_*.py file in testdir or on the command
45 line is used. (actually tempfile.gettempdir() is used instead of
48 -f reads the names of tests from the file given as f's argument, one
49 or more test names per line. Whitespace is ignored. Blank lines and
50 lines beginning with '#' are ignored. This is especially useful for
51 whittling down failures involving interactions among tests.
53 -L causes the leaks(1) command to be run just before exit if it exists.
54 leaks(1) is available on Mac OS X and presumably on some other
55 FreeBSD-derived systems.
57 -R runs each test several times and examines sys.gettotalrefcount() to
58 see if the test appears to be leaking references. The argument should
59 be of the form stab:run:fname where 'stab' is the number of times the
60 test is run to let gettotalrefcount settle down, 'run' is the number
61 of times further it is run and 'fname' is the name of the file the
62 reports are written to. These parameters all have defaults (5, 4 and
63 "reflog.txt" respectively), so the minimal invocation is '-R ::'.
65 -u is used to specify which special resource intensive tests to run,
66 such as those requiring large file support or network connectivity.
67 The argument is a comma-separated list of words indicating the
68 resources to test. Currently only the following are defined:
70 all - Enable all special resources.
72 audio - Tests that use the audio device. (There are known
73 cases of broken audio drivers that can crash Python or
74 even the Linux kernel.)
76 curses - Tests that use curses and will modify the terminal's
77 state and output modes.
79 largefile - It is okay to run some test that may create huge
80 files. These tests can take a long time and may
81 consume >2GB of disk space temporarily.
83 network - It is okay to run tests that use external network
84 resource, e.g. testing SSL support for sockets.
86 bsddb - It is okay to run the bsddb testsuite, which takes
87 a long time to complete.
89 decimal - Test the decimal module against a large suite that
90 verifies compliance with standards.
92 compiler - Test the compiler package by compiling all the source
93 in the standard library and test suite. This takes
94 a long time. Enabling this resource also allows
95 test_tokenize to verify round-trip lexing on every
96 file in the test library.
98 subprocess Run all tests for the subprocess module.
100 urlfetch - It is okay to download files required on testing.
102 To enable all resources except one, use '-uall,-<resource>'. For
103 example, to run all the tests except for the bsddb tests, give the
104 option '-uall,-bsddb'.
116 # I see no other way to suppress these warnings;
117 # putting them in test_grammar.py has no effect:
118 warnings
.filterwarnings("ignore", "hex/oct constants", FutureWarning
,
119 ".*test.test_grammar$")
120 if sys
.maxint
> 0x7fffffff:
121 # Also suppress them in <string>, because for 64-bit platforms,
122 # that's where test_grammar.py hides them.
123 warnings
.filterwarnings("ignore", "hex/oct constants", FutureWarning
,
126 # MacOSX (a.k.a. Darwin) has a default stack size that is too small
127 # for deeply recursive regular expressions. We see this as crashes in
128 # the Python test suite when running test_re.py and test_sre.py. The
129 # fix is to set the stack limit to 2048.
130 # This approach may also be useful for other Unixy platforms that
131 # suffer from small default stack limits.
132 if sys
.platform
== 'darwin':
138 soft
, hard
= resource
.getrlimit(resource
.RLIMIT_STACK
)
139 newsoft
= min(hard
, max(soft
, 1024*2048))
140 resource
.setrlimit(resource
.RLIMIT_STACK
, (newsoft
, hard
))
142 from test
import test_support
144 RESOURCE_NAMES
= ('audio', 'curses', 'largefile', 'network', 'bsddb',
145 'decimal', 'compiler', 'subprocess', 'urlfetch')
148 def usage(code
, msg
=''):
154 def main(tests
=None, testdir
=None, verbose
=0, quiet
=False, generate
=False,
155 exclude
=False, single
=False, randomize
=False, fromfile
=None,
156 findleaks
=False, use_resources
=None, trace
=False, coverdir
='coverage',
157 runleaks
=False, huntrleaks
=False):
158 """Execute a test suite.
160 This also parses command-line options and modifies its behavior
163 tests -- a list of strings containing test names (optional)
164 testdir -- the directory in which to look for tests (optional)
166 Users other than the Python test suite will certainly want to
167 specify testdir; if it's omitted, the directory containing the
168 Python test suite is searched for.
170 If the tests argument is omitted, the tests listed on the
171 command-line will be used. If that's empty, too, then all *.py
172 files beginning with test_ will be used.
174 The other default arguments (verbose, quiet, generate, exclude, single,
175 randomize, findleaks, use_resources, trace and coverdir) allow programmers
176 calling main() directly to set the values that would normally be set by
177 flags on the command line.
180 test_support
.record_original_stdout(sys
.stdout
)
182 opts
, args
= getopt
.getopt(sys
.argv
[1:], 'hvgqxsrf:lu:t:TD:NLR:',
183 ['help', 'verbose', 'quiet', 'generate',
184 'exclude', 'single', 'random', 'fromfile',
185 'findleaks', 'use=', 'threshold=', 'trace',
186 'coverdir=', 'nocoverdir', 'runleaks',
189 except getopt
.error
, msg
:
193 if use_resources
is None:
196 if o
in ('-h', '--help'):
198 elif o
in ('-v', '--verbose'):
200 elif o
in ('-q', '--quiet'):
203 elif o
in ('-g', '--generate'):
205 elif o
in ('-x', '--exclude'):
207 elif o
in ('-s', '--single'):
209 elif o
in ('-r', '--randomize'):
211 elif o
in ('-f', '--fromfile'):
213 elif o
in ('-l', '--findleaks'):
215 elif o
in ('-L', '--runleaks'):
217 elif o
in ('-t', '--threshold'):
219 gc
.set_threshold(int(a
))
220 elif o
in ('-T', '--coverage'):
222 elif o
in ('-D', '--coverdir'):
223 coverdir
= os
.path
.join(os
.getcwd(), a
)
224 elif o
in ('-N', '--nocoverdir'):
226 elif o
in ('-R', '--huntrleaks'):
227 huntrleaks
= a
.split(':')
228 if len(huntrleaks
) != 3:
230 usage(2, '-R takes three colon-separated arguments')
231 if len(huntrleaks
[0]) == 0:
234 huntrleaks
[0] = int(huntrleaks
[0])
235 if len(huntrleaks
[1]) == 0:
238 huntrleaks
[1] = int(huntrleaks
[1])
239 if len(huntrleaks
[2]) == 0:
240 huntrleaks
[2] = "reflog.txt"
241 elif o
in ('-u', '--use'):
242 u
= [x
.lower() for x
in a
.split(',')]
245 use_resources
[:] = RESOURCE_NAMES
251 if r
not in RESOURCE_NAMES
:
252 usage(1, 'Invalid -u/--use option: ' + a
)
254 if r
in use_resources
:
255 use_resources
.remove(r
)
256 elif r
not in use_resources
:
257 use_resources
.append(r
)
258 if generate
and verbose
:
259 usage(2, "-g and -v don't go together!")
260 if single
and fromfile
:
261 usage(2, "-s and -f don't go together!")
266 resource_denieds
= []
272 print 'No GC available, disabling findleaks.'
275 # Uncomment the line below to report garbage that is not
276 # freeable by reference counting alone. By default only
277 # garbage that is not collectable by the GC is reported.
278 #gc.set_debug(gc.DEBUG_SAVEALL)
282 from tempfile
import gettempdir
283 filename
= os
.path
.join(gettempdir(), 'pynexttest')
285 fp
= open(filename
, 'r')
286 next
= fp
.read().strip()
296 guts
= line
.split() # assuming no test has whitespace in its name
297 if guts
and not guts
[0].startswith('#'):
301 # Strip .py extensions.
303 args
= map(removepy
, args
)
305 tests
= map(removepy
, tests
)
307 stdtests
= STDTESTS
[:]
308 nottests
= NOTTESTS
[:]
315 tests
= tests
or args
or findtests(testdir
, stdtests
, nottests
)
319 random
.shuffle(tests
)
322 tracer
= trace
.Trace(ignoredirs
=[sys
.prefix
, sys
.exec_prefix
],
323 trace
=False, count
=True)
324 test_support
.verbose
= verbose
# Tell tests to be moderately quiet
325 test_support
.use_resources
= use_resources
326 save_modules
= sys
.modules
.keys()
332 # If we're tracing code coverage, then we don't exit with status
333 # if on a false return value from main.
334 tracer
.runctx('runtest(test, generate, verbose, quiet, testdir)',
335 globals=globals(), locals=vars())
337 ok
= runtest(test
, generate
, verbose
, quiet
, testdir
, huntrleaks
)
345 resource_denieds
.append(test
)
349 print "Warning: test created", len(gc
.garbage
),
350 print "uncollectable object(s)."
351 # move the uncollectable objects somewhere so we don't see
353 found_garbage
.extend(gc
.garbage
)
355 # Unload the newly imported modules (best effort finalization)
356 for module
in sys
.modules
.keys():
357 if module
not in save_modules
and module
.startswith("test."):
358 test_support
.unload(module
)
360 # The lists won't be sorted if running with -r
365 if good
and not quiet
:
366 if not bad
and not skipped
and len(good
) > 1:
368 print count(len(good
), "test"), "OK."
370 print "CAUTION: stdout isn't compared in verbose mode:"
371 print "a test that passes in verbose mode may fail without it."
373 print count(len(bad
), "test"), "failed:"
375 if skipped
and not quiet
:
376 print count(len(skipped
), "test"), "skipped:"
382 surprise
= set(skipped
) - e
.getexpected() - set(resource_denieds
)
384 print count(len(surprise
), "skip"), \
385 "unexpected on", plat
+ ":"
388 print "Those skips are all expected on", plat
+ "."
390 print "Ask someone to teach regrtest.py about which tests are"
391 print "expected to get skipped on", plat
+ "."
394 alltests
= findtests(testdir
, stdtests
, nottests
)
395 for i
in range(len(alltests
)):
396 if tests
[0] == alltests
[i
]:
397 if i
== len(alltests
) - 1:
400 fp
= open(filename
, 'w')
401 fp
.write(alltests
[i
+1] + '\n')
409 r
.write_results(show_missing
=True, summary
=True, coverdir
=coverdir
)
412 os
.system("leaks %d" % os
.getpid())
414 sys
.exit(len(bad
) > 0)
433 def findtests(testdir
=None, stdtests
=STDTESTS
, nottests
=NOTTESTS
):
434 """Return a list of all applicable test modules."""
435 if not testdir
: testdir
= findtestdir()
436 names
= os
.listdir(testdir
)
439 if name
[:5] == "test_" and name
[-3:] == os
.extsep
+"py":
441 if modname
not in stdtests
and modname
not in nottests
:
442 tests
.append(modname
)
444 return stdtests
+ tests
446 def runtest(test
, generate
, verbose
, quiet
, testdir
=None, huntrleaks
=False):
447 """Run a single test.
448 test -- the name of the test
449 generate -- if true, generate output, instead of running the test
450 and comparing it to a previously created output file
451 verbose -- if true, print more messages
452 quiet -- if true, don't print 'skipped' messages (probably redundant)
453 testdir -- test directory
455 test_support
.unload(test
)
457 testdir
= findtestdir()
458 outputdir
= os
.path
.join(testdir
, "output")
459 outputfile
= os
.path
.join(outputdir
, test
)
463 cfp
= cStringIO
.StringIO()
465 refrep
= open(huntrleaks
[2], "a")
467 save_stdout
= sys
.stdout
471 print test
# Output file starts with test name
472 if test
.startswith('test.'):
475 # Always import it from the test package
476 abstest
= 'test.' + test
477 the_package
= __import__(abstest
, globals(), locals(), [])
478 the_module
= getattr(the_package
, test
)
479 # Most tests run to completion simply as a side-effect of
480 # being imported. For the benefit of tests that can't run
481 # that way (like test_threaded_import), explicitly invoke
482 # their test_main() function (if it exists).
483 indirect_test
= getattr(the_module
, "test_main", None)
484 if indirect_test
is not None:
487 # This code *is* hackish and inelegant, yes.
488 # But it seems to do the job.
490 fs
= warnings
.filters
[:]
491 ps
= copy_reg
.dispatch_table
.copy()
492 pic
= sys
.path_importer_cache
.copy()
495 import _strptime
, linecache
, warnings
, dircache
496 import urlparse
, urllib
, urllib2
497 from distutils
.dir_util
import _path_created
498 _path_created
.clear()
499 warnings
.filters
[:] = fs
502 _strptime
._regex
_cache
.clear()
503 urlparse
.clear_cache()
505 urllib2
.install_opener(None)
506 copy_reg
.dispatch_table
.clear()
507 copy_reg
.dispatch_table
.update(ps
)
508 sys
.path_importer_cache
.clear()
509 sys
.path_importer_cache
.update(pic
)
511 linecache
.clearcache()
519 repcount
= huntrleaks
[0] + huntrleaks
[1]
520 print >> sys
.stderr
, "beginning", repcount
, "repetitions"
521 print >> sys
.stderr
, \
522 ("1234567890"*(repcount
//10 + 1))[:repcount
]
523 for i
in range(repcount
):
524 rc
= sys
.gettotalrefcount()
526 sys
.stderr
.write('.')
528 deltas
.append(sys
.gettotalrefcount() - rc
- 2)
530 if max(map(abs, deltas
[-huntrleaks
[1]:])) > 0:
531 print >>sys
.stderr
, test
, 'leaked', \
532 deltas
[-huntrleaks
[1]:], 'references'
533 print >>refrep
, test
, 'leaked', \
534 deltas
[-huntrleaks
[1]:], 'references'
535 # The end of the huntrleaks hackishness.
537 sys
.stdout
= save_stdout
538 except test_support
.ResourceDenied
, msg
:
540 print test
, "skipped --", msg
543 except (ImportError, test_support
.TestSkipped
), msg
:
545 print test
, "skipped --", msg
548 except KeyboardInterrupt:
550 except test_support
.TestFailed
, msg
:
551 print "test", test
, "failed --", msg
555 type, value
= sys
.exc_info()[:2]
556 print "test", test
, "crashed --", str(type) + ":", value
559 traceback
.print_exc(file=sys
.stdout
)
565 output
= cfp
.getvalue()
567 if output
== test
+ "\n":
568 if os
.path
.exists(outputfile
):
569 # Write it since it already exists (and the contents
570 # may have changed), but let the user know it isn't
572 print "output file", outputfile
, \
573 "is no longer needed; consider removing it"
575 # We don't need it, so don't create it.
577 fp
= open(outputfile
, "w")
581 if os
.path
.exists(outputfile
):
582 fp
= open(outputfile
, "r")
586 expected
= test
+ "\n"
587 if output
== expected
or huntrleaks
:
589 print "test", test
, "produced unexpected output:"
591 reportdiff(expected
, output
)
595 def reportdiff(expected
, output
):
598 a
= expected
.splitlines(1)
599 b
= output
.splitlines(1)
600 sm
= difflib
.SequenceMatcher(a
=a
, b
=b
)
601 tuples
= sm
.get_opcodes()
604 # x0:x1 are 0-based slice indices; convert to 1-based line indices.
607 return "line " + str(x0
)
609 return "lines %d-%d" % (x0
, x1
)
611 for op
, a0
, a1
, b0
, b1
in tuples
:
616 print "***", pair(a0
, a1
), "of expected output missing:"
617 for line
in a
[a0
:a1
]:
620 elif op
== 'replace':
621 print "*** mismatch between", pair(a0
, a1
), "of expected", \
622 "output and", pair(b0
, b1
), "of actual output:"
623 for line
in difflib
.ndiff(a
[a0
:a1
], b
[b0
:b1
]):
627 print "***", pair(b0
, b1
), "of actual output doesn't appear", \
628 "in expected output after line", str(a1
)+":"
629 for line
in b
[b0
:b1
]:
633 print "get_opcodes() returned bad tuple?!?!", (op
, a0
, a1
, b0
, b1
)
638 if __name__
== '__main__':
642 testdir
= os
.path
.dirname(file) or os
.curdir
646 if name
.endswith(os
.extsep
+ "py"):
652 return "%d %s" % (n
, word
)
654 return "%d %ss" % (n
, word
)
656 def printlist(x
, width
=70, indent
=4):
657 """Print the elements of iterable x to stdout.
659 Optional arg width (default 70) is the maximum line length.
660 Optional arg indent (default 4) is the number of blanks with which to
664 from textwrap
import fill
665 blanks
= ' ' * indent
666 print fill(' '.join(map(str, x
)), width
,
667 initial_indent
=blanks
, subsequent_indent
=blanks
)
669 # Map sys.platform to a string containing the basenames of tests
670 # expected to be skipped on that platform.
674 # The _ExpectedSkips constructor adds this to the set of expected
675 # skips if not os.path.supports_unicode_filenames.
677 # Controlled by test_socket_ssl.skip_expected. Requires the network
678 # resource, and a socket module with ssl support.
680 # Controlled by test_timeout.skip_expected. Requires the network
681 # resource and a socket module.
853 test_threadedtempfile
893 test_threadedtempfile
1097 _expectations
['freebsd5'] = _expectations
['freebsd4']
1098 _expectations
['freebsd6'] = _expectations
['freebsd4']
1099 _expectations
['freebsd7'] = _expectations
['freebsd4']
1101 class _ExpectedSkips
:
1104 from test
import test_socket_ssl
1105 from test
import test_timeout
1108 if sys
.platform
in _expectations
:
1109 s
= _expectations
[sys
.platform
]
1110 self
.expected
= set(s
.split())
1112 # this isn't a regularly run unit test, it is always skipped
1113 self
.expected
.add('test_hashlib_speed')
1115 if not os
.path
.supports_unicode_filenames
:
1116 self
.expected
.add('test_pep277')
1118 if test_socket_ssl
.skip_expected
:
1119 self
.expected
.add('test_socket_ssl')
1121 if test_timeout
.skip_expected
:
1122 self
.expected
.add('test_timeout')
1124 if sys
.maxint
== 9223372036854775807L:
1125 self
.expected
.add('test_rgbimg')
1126 self
.expected
.add('test_imageop')
1128 if not sys
.platform
in ("mac", "darwin"):
1129 MAC_ONLY
= ["test_macostools", "test_macfs", "test_aepack",
1130 "test_plistlib", "test_scriptpackages"]
1131 for skip
in MAC_ONLY
:
1132 self
.expected
.add(skip
)
1134 if sys
.platform
!= "win32":
1135 WIN_ONLY
= ["test_unicode_file", "test_winreg",
1137 for skip
in WIN_ONLY
:
1138 self
.expected
.add(skip
)
1143 "Return true iff _ExpectedSkips knows about the current platform."
1146 def getexpected(self
):
1147 """Return set of test names we expect to skip on current platform.
1149 self.isvalid() must be true.
1152 assert self
.isvalid()
1153 return self
.expected
1155 if __name__
== '__main__':
1156 # Remove regrtest.py's own directory from the module search path. This
1157 # prevents relative imports from working, and relative imports will screw
1158 # up the testing framework. E.g. if both test.test_support and
1159 # test_support are imported, they will not contain the same globals, and
1160 # much of the testing framework relies on the globals in the
1161 # test.test_support module.
1162 mydir
= os
.path
.abspath(os
.path
.normpath(os
.path
.dirname(sys
.argv
[0])))
1163 i
= pathlen
= len(sys
.path
)
1166 if os
.path
.abspath(os
.path
.normpath(sys
.path
[i
])) == mydir
:
1168 if len(sys
.path
) == pathlen
:
1169 print 'Could not find %r in sys.path to remove it' % mydir