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)
23 If non-option arguments are present, they are names for tests to run,
24 unless -x is given, in which case they are names for tests not to run.
25 If no test names are given, all tests are run.
27 -v is incompatible with -g and does not compare test output files.
29 -s means to run only a single test and exit. This is useful when
30 doing memory analysis on the Python interpreter (which tend to consume
31 too many resources to run the full regression test non-stop). The
32 file /tmp/pynexttest is read to find the next test to run. If this
33 file is missing, the first test_*.py file in testdir or on the command
34 line is used. (actually tempfile.gettempdir() is used instead of
37 -f reads the names of tests from the file given as f's argument, one
38 or more test names per line. Whitespace is ignored. Blank lines and
39 lines beginning with '#' are ignored. This is especially useful for
40 whittling down failures involving interactions among tests.
42 -u is used to specify which special resource intensive tests to run,
43 such as those requiring large file support or network connectivity.
44 The argument is a comma-separated list of words indicating the
45 resources to test. Currently only the following are defined:
47 all - Enable all special resources.
49 curses - Tests that use curses and will modify the terminal's
50 state and output modes.
52 largefile - It is okay to run some test that may create huge
53 files. These tests can take a long time and may
54 consume >2GB of disk space temporarily.
56 network - It is okay to run tests that use external network
57 resource, e.g. testing SSL support for sockets.
69 # I see no other way to suppress these warnings;
70 # putting them in test_grammar.py has no effect:
71 warnings
.filterwarnings("ignore", "hex/oct constants", FutureWarning
,
72 ".*test.test_grammar$")
73 if sys
.maxint
> 0x7fffffff:
74 # Also suppress them in <string>, because for 64-bit platforms,
75 # that's where test_grammar.py hides them.
76 warnings
.filterwarnings("ignore", "hex/oct constants", FutureWarning
,
79 from test
import test_support
81 RESOURCE_NAMES
= ('curses', 'largefile', 'network')
84 def usage(code
, msg
=''):
90 def main(tests
=None, testdir
=None, verbose
=0, quiet
=0, generate
=0,
91 exclude
=0, single
=0, randomize
=0, fromfile
=None, findleaks
=0,
93 """Execute a test suite.
95 This also parses command-line options and modifies its behavior
98 tests -- a list of strings containing test names (optional)
99 testdir -- the directory in which to look for tests (optional)
101 Users other than the Python test suite will certainly want to
102 specify testdir; if it's omitted, the directory containing the
103 Python test suite is searched for.
105 If the tests argument is omitted, the tests listed on the
106 command-line will be used. If that's empty, too, then all *.py
107 files beginning with test_ will be used.
109 The other default arguments (verbose, quiet, generate, exclude,
110 single, randomize, findleaks, and use_resources) allow programmers
111 calling main() directly to set the values that would normally be
112 set by flags on the command line.
116 test_support
.record_original_stdout(sys
.stdout
)
118 opts
, args
= getopt
.getopt(sys
.argv
[1:], 'hvgqxsrf:lu:t:',
119 ['help', 'verbose', 'quiet', 'generate',
120 'exclude', 'single', 'random', 'fromfile',
121 'findleaks', 'use=', 'threshold='])
122 except getopt
.error
, msg
:
126 if use_resources
is None:
129 if o
in ('-h', '--help'):
131 elif o
in ('-v', '--verbose'):
133 elif o
in ('-q', '--quiet'):
136 elif o
in ('-g', '--generate'):
138 elif o
in ('-x', '--exclude'):
140 elif o
in ('-s', '--single'):
142 elif o
in ('-r', '--randomize'):
144 elif o
in ('-f', '--fromfile'):
146 elif o
in ('-l', '--findleaks'):
148 elif o
in ('-t', '--threshold'):
150 gc
.set_threshold(int(a
))
151 elif o
in ('-u', '--use'):
152 u
= [x
.lower() for x
in a
.split(',')]
155 use_resources
= RESOURCE_NAMES
157 if r
not in RESOURCE_NAMES
:
158 usage(1, 'Invalid -u/--use option: ' + a
)
159 if r
not in use_resources
:
160 use_resources
.append(r
)
161 if generate
and verbose
:
162 usage(2, "-g and -v don't go together!")
163 if single
and fromfile
:
164 usage(2, "-s and -f don't go together!")
174 print 'No GC available, disabling findleaks.'
177 # Uncomment the line below to report garbage that is not
178 # freeable by reference counting alone. By default only
179 # garbage that is not collectable by the GC is reported.
180 #gc.set_debug(gc.DEBUG_SAVEALL)
184 from tempfile
import gettempdir
185 filename
= os
.path
.join(gettempdir(), 'pynexttest')
187 fp
= open(filename
, 'r')
188 next
= fp
.read().strip()
198 guts
= line
.split() # assuming no test has whitespace in its name
199 if guts
and not guts
[0].startswith('#'):
203 # Strip .py extensions.
205 args
= map(removepy
, args
)
207 tests
= map(removepy
, tests
)
209 stdtests
= STDTESTS
[:]
210 nottests
= NOTTESTS
[:]
217 tests
= tests
or args
or findtests(testdir
, stdtests
, nottests
)
221 random
.shuffle(tests
)
222 test_support
.verbose
= verbose
# Tell tests to be moderately quiet
223 test_support
.use_resources
= use_resources
224 save_modules
= sys
.modules
.keys()
229 ok
= runtest(test
, generate
, verbose
, quiet
, testdir
)
239 print "Warning: test created", len(gc
.garbage
),
240 print "uncollectable object(s)."
241 # move the uncollectable objects somewhere so we don't see
243 found_garbage
.extend(gc
.garbage
)
245 # Unload the newly imported modules (best effort finalization)
246 for module
in sys
.modules
.keys():
247 if module
not in save_modules
and module
.startswith("test."):
248 test_support
.unload(module
)
250 # The lists won't be sorted if running with -r
255 if good
and not quiet
:
256 if not bad
and not skipped
and len(good
) > 1:
258 print count(len(good
), "test"), "OK."
260 print "CAUTION: stdout isn't compared in verbose mode:"
261 print "a test that passes in verbose mode may fail without it."
263 print count(len(bad
), "test"), "failed:"
265 if skipped
and not quiet
:
266 print count(len(skipped
), "test"), "skipped:"
272 surprise
= Set(skipped
) - e
.getexpected()
274 print count(len(surprise
), "skip"), \
275 "unexpected on", plat
+ ":"
278 print "Those skips are all expected on", plat
+ "."
280 print "Ask someone to teach regrtest.py about which tests are"
281 print "expected to get skipped on", plat
+ "."
284 alltests
= findtests(testdir
, stdtests
, nottests
)
285 for i
in range(len(alltests
)):
286 if tests
[0] == alltests
[i
]:
287 if i
== len(alltests
) - 1:
290 fp
= open(filename
, 'w')
291 fp
.write(alltests
[i
+1] + '\n')
297 sys
.exit(len(bad
) > 0)
318 def findtests(testdir
=None, stdtests
=STDTESTS
, nottests
=NOTTESTS
):
319 """Return a list of all applicable test modules."""
320 if not testdir
: testdir
= findtestdir()
321 names
= os
.listdir(testdir
)
324 if name
[:5] == "test_" and name
[-3:] == os
.extsep
+"py":
326 if modname
not in stdtests
and modname
not in nottests
:
327 tests
.append(modname
)
329 return stdtests
+ tests
331 def runtest(test
, generate
, verbose
, quiet
, testdir
= None):
332 """Run a single test.
333 test -- the name of the test
334 generate -- if true, generate output, instead of running the test
335 and comparing it to a previously created output file
336 verbose -- if true, print more messages
337 quiet -- if true, don't print 'skipped' messages (probably redundant)
338 testdir -- test directory
340 test_support
.unload(test
)
341 if not testdir
: testdir
= findtestdir()
342 outputdir
= os
.path
.join(testdir
, "output")
343 outputfile
= os
.path
.join(outputdir
, test
)
347 cfp
= StringIO
.StringIO()
349 save_stdout
= sys
.stdout
353 print test
# Output file starts with test name
354 if test
.startswith('test.'):
357 # Always import it from the test package
358 abstest
= 'test.' + test
359 the_package
= __import__(abstest
, globals(), locals(), [])
360 the_module
= getattr(the_package
, test
)
361 # Most tests run to completion simply as a side-effect of
362 # being imported. For the benefit of tests that can't run
363 # that way (like test_threaded_import), explicitly invoke
364 # their test_main() function (if it exists).
365 indirect_test
= getattr(the_module
, "test_main", None)
366 if indirect_test
is not None:
369 sys
.stdout
= save_stdout
370 except (ImportError, test_support
.TestSkipped
), msg
:
372 print "test", test
, "skipped --", msg
375 except KeyboardInterrupt:
377 except test_support
.TestFailed
, msg
:
378 print "test", test
, "failed --", msg
382 type, value
= sys
.exc_info()[:2]
383 print "test", test
, "crashed --", str(type) + ":", value
386 traceback
.print_exc(file=sys
.stdout
)
392 output
= cfp
.getvalue()
394 if output
== test
+ "\n":
395 if os
.path
.exists(outputfile
):
396 # Write it since it already exists (and the contents
397 # may have changed), but let the user know it isn't
399 print "output file", outputfile
, \
400 "is no longer needed; consider removing it"
402 # We don't need it, so don't create it.
404 fp
= open(outputfile
, "w")
408 if os
.path
.exists(outputfile
):
409 fp
= open(outputfile
, "r")
413 expected
= test
+ "\n"
414 if output
== expected
:
416 print "test", test
, "produced unexpected output:"
418 reportdiff(expected
, output
)
422 def reportdiff(expected
, output
):
425 a
= expected
.splitlines(1)
426 b
= output
.splitlines(1)
427 sm
= difflib
.SequenceMatcher(a
=a
, b
=b
)
428 tuples
= sm
.get_opcodes()
431 # x0:x1 are 0-based slice indices; convert to 1-based line indices.
434 return "line " + str(x0
)
436 return "lines %d-%d" % (x0
, x1
)
438 for op
, a0
, a1
, b0
, b1
in tuples
:
443 print "***", pair(a0
, a1
), "of expected output missing:"
444 for line
in a
[a0
:a1
]:
447 elif op
== 'replace':
448 print "*** mismatch between", pair(a0
, a1
), "of expected", \
449 "output and", pair(b0
, b1
), "of actual output:"
450 for line
in difflib
.ndiff(a
[a0
:a1
], b
[b0
:b1
]):
454 print "***", pair(b0
, b1
), "of actual output doesn't appear", \
455 "in expected output after line", str(a1
)+":"
456 for line
in b
[b0
:b1
]:
460 print "get_opcodes() returned bad tuple?!?!", (op
, a0
, a1
, b0
, b1
)
465 if __name__
== '__main__':
469 testdir
= os
.path
.dirname(file) or os
.curdir
473 if name
.endswith(os
.extsep
+ "py"):
479 return "%d %s" % (n
, word
)
481 return "%d %ss" % (n
, word
)
483 def printlist(x
, width
=70, indent
=4):
484 """Print the elements of iterable x to stdout.
486 Optional arg width (default 70) is the maximum line length.
487 Optional arg indent (default 4) is the number of blanks with which to
491 from textwrap
import fill
492 blanks
= ' ' * indent
493 print fill(' '.join(map(str, x
)), width
,
494 initial_indent
=blanks
, subsequent_indent
=blanks
)
496 # Map sys.platform to a string containing the basenames of tests
497 # expected to be skipped on that platform.
501 # The _ExpectedSkips constructor adds this to the set of expected
502 # skips if not os.path.supports_unicode_filenames.
670 test_threadedtempfile
711 test_threadedtempfile
824 class _ExpectedSkips
:
828 if sys
.platform
in _expectations
:
829 s
= _expectations
[sys
.platform
]
830 self
.expected
= Set(s
.split())
831 if not os
.path
.supports_unicode_filenames
:
832 self
.expected
.add('test_pep277')
836 "Return true iff _ExpectedSkips knows about the current platform."
839 def getexpected(self
):
840 """Return set of test names we expect to skip on current platform.
842 self.isvalid() must be true.
845 assert self
.isvalid()
848 if __name__
== '__main__':
849 # Remove regrtest.py's own directory from the module search path. This
850 # prevents relative imports from working, and relative imports will screw
851 # up the testing framework. E.g. if both test.test_support and
852 # test_support are imported, they will not contain the same globals, and
853 # much of the testing framework relies on the globals in the
854 # test.test_support module.
855 mydir
= os
.path
.abspath(os
.path
.normpath(os
.path
.dirname(sys
.argv
[0])))
856 i
= pathlen
= len(sys
.path
)
859 if os
.path
.abspath(os
.path
.normpath(sys
.path
[i
])) == mydir
:
861 if len(sys
.path
) == pathlen
:
862 print 'Could not find %r in sys.path to remove it' % mydir