blob: c8fedc7ad329bd5080857ab2764f3b1b5e6264ec [file] [log] [blame]
Victor Stinner98de5342015-09-26 09:43:45 +02001import argparse
Victor Stinner98de5342015-09-26 09:43:45 +02002import os
Steve Dower08ec6d92015-10-08 11:34:07 -07003import sys
Victor Stinner98de5342015-09-26 09:43:45 +02004from test import support
5
Victor Stinner3844fe52015-09-26 10:38:01 +02006
Victor Stinner98de5342015-09-26 09:43:45 +02007USAGE = """\
8python -m test [options] [test_name1 [test_name2 ...]]
9python path/to/Lib/test/regrtest.py [options] [test_name1 [test_name2 ...]]
10"""
11
12DESCRIPTION = """\
13Run Python regression tests.
14
15If no arguments or options are provided, finds all files matching
16the pattern "test_*" in the Lib/test subdirectory and runs
17them in alphabetical order (but see -M and -u, below, for exceptions).
18
19For more rigorous testing, it is useful to use the following
20command line:
21
22python -E -Wd -m test [options] [test_name1 ...]
23"""
24
25EPILOG = """\
26Additional option details:
27
Serhiy Storchaka4a7c03a2015-11-02 14:44:29 +020028-r randomizes test execution order. You can use --randseed=int to provide an
Victor Stinner98de5342015-09-26 09:43:45 +020029int seed value for the randomizer; this is useful for reproducing troublesome
30test orders.
31
32-s On the first invocation of regrtest using -s, the first test file found
33or the first test file given on the command line is run, and the name of
34the next test is recorded in a file named pynexttest. If run from the
35Python build directory, pynexttest is located in the 'build' subdirectory,
36otherwise it is located in tempfile.gettempdir(). On subsequent runs,
37the test in pynexttest is run, and the next test is written to pynexttest.
38When the last test has been run, pynexttest is deleted. In this way it
39is possible to single step through the test files. This is useful when
40doing memory analysis on the Python interpreter, which process tends to
41consume too many resources to run the full regression test non-stop.
42
43-S is used to continue running tests after an aborted run. It will
44maintain the order a standard run (ie, this assumes -r is not used).
45This is useful after the tests have prematurely stopped for some external
46reason and you want to start running from where you left off rather
47than starting from the beginning.
48
49-f reads the names of tests from the file given as f's argument, one
50or more test names per line. Whitespace is ignored. Blank lines and
51lines beginning with '#' are ignored. This is especially useful for
52whittling down failures involving interactions among tests.
53
54-L causes the leaks(1) command to be run just before exit if it exists.
55leaks(1) is available on Mac OS X and presumably on some other
56FreeBSD-derived systems.
57
58-R runs each test several times and examines sys.gettotalrefcount() to
59see if the test appears to be leaking references. The argument should
60be of the form stab:run:fname where 'stab' is the number of times the
61test is run to let gettotalrefcount settle down, 'run' is the number
62of times further it is run and 'fname' is the name of the file the
63reports are written to. These parameters all have defaults (5, 4 and
64"reflog.txt" respectively), and the minimal invocation is '-R :'.
65
66-M runs tests that require an exorbitant amount of memory. These tests
67typically try to ascertain containers keep working when containing more than
682 billion objects, which only works on 64-bit systems. There are also some
69tests that try to exhaust the address space of the process, which only makes
70sense on 32-bit systems with at least 2Gb of memory. The passed-in memlimit,
sth7108aab2018-12-31 06:41:39 +010071which is a string in the form of '2.5Gb', determines how much memory the
Victor Stinner98de5342015-09-26 09:43:45 +020072tests will limit themselves to (but they may go slightly over.) The number
73shouldn't be more memory than the machine has (including swap memory). You
74should also keep in mind that swap memory is generally much, much slower
75than RAM, and setting memlimit to all available RAM or higher will heavily
76tax the machine. On the other hand, it is no use running these tests with a
77limit of less than 2.5Gb, and many require more than 20Gb. Tests that expect
78to use more than memlimit memory will be skipped. The big-memory tests
79generally run very, very long.
80
81-u is used to specify which special resource intensive tests to run,
82such as those requiring large file support or network connectivity.
83The argument is a comma-separated list of words indicating the
84resources to test. Currently only the following are defined:
85
86 all - Enable all special resources.
87
88 none - Disable all special resources (this is the default).
89
90 audio - Tests that use the audio device. (There are known
91 cases of broken audio drivers that can crash Python or
92 even the Linux kernel.)
93
94 curses - Tests that use curses and will modify the terminal's
95 state and output modes.
96
97 largefile - It is okay to run some test that may create huge
98 files. These tests can take a long time and may
Victor Stinner8c663fd2017-11-08 14:44:44 -080099 consume >2 GiB of disk space temporarily.
Victor Stinner98de5342015-09-26 09:43:45 +0200100
101 network - It is okay to run tests that use external network
102 resource, e.g. testing SSL support for sockets.
103
104 decimal - Test the decimal module against a large suite that
105 verifies compliance with standards.
106
107 cpu - Used for certain CPU-heavy tests.
108
109 subprocess Run all tests for the subprocess module.
110
111 urlfetch - It is okay to download files required on testing.
112
113 gui - Run tests that require a running GUI.
114
Alexander Belopolsky5d0c5982016-07-22 18:47:04 -0400115 tzdata - Run tests that require timezone data.
116
Victor Stinner98de5342015-09-26 09:43:45 +0200117To enable all resources except one, use '-uall,-<resource>'. For
118example, to run all the tests except for the gui tests, give the
119option '-uall,-gui'.
Victor Stinneref8320c2017-06-09 10:18:48 +0200120
121--matchfile filters tests using a text file, one pattern per line.
122Pattern examples:
123
124- test method: test_stat_attributes
125- test class: FileTests
126- test identifier: test_os.FileTests.test_stat_attributes
Victor Stinner98de5342015-09-26 09:43:45 +0200127"""
128
129
Victor Stinner5b392bb2017-07-20 15:46:32 +0200130ALL_RESOURCES = ('audio', 'curses', 'largefile', 'network',
131 'decimal', 'cpu', 'subprocess', 'urlfetch', 'gui')
132
133# Other resources excluded from --use=all:
134#
135# - extralagefile (ex: test_zipfile64): really too slow to be enabled
136# "by default"
137# - tzdata: while needed to validate fully test_datetime, it makes
138# test_datetime too slow (15-20 min on some buildbots) and so is disabled by
139# default (see bpo-30822).
140RESOURCE_NAMES = ALL_RESOURCES + ('extralargefile', 'tzdata')
Victor Stinner98de5342015-09-26 09:43:45 +0200141
142class _ArgParser(argparse.ArgumentParser):
143
144 def error(self, message):
145 super().error(message + "\nPass -h or --help for complete help.")
146
147
148def _create_parser():
149 # Set prog to prevent the uninformative "__main__.py" from displaying in
150 # error messages when using "python -m test ...".
151 parser = _ArgParser(prog='regrtest.py',
152 usage=USAGE,
153 description=DESCRIPTION,
154 epilog=EPILOG,
155 add_help=False,
156 formatter_class=argparse.RawDescriptionHelpFormatter)
157
158 # Arguments with this clause added to its help are described further in
159 # the epilog's "Additional option details" section.
160 more_details = ' See the section at bottom for more details.'
161
162 group = parser.add_argument_group('General options')
163 # We add help explicitly to control what argument group it renders under.
164 group.add_argument('-h', '--help', action='help',
165 help='show this help message and exit')
166 group.add_argument('--timeout', metavar='TIMEOUT', type=float,
167 help='dump the traceback and exit if a test takes '
168 'more than TIMEOUT seconds; disabled if TIMEOUT '
169 'is negative or equals to zero')
170 group.add_argument('--wait', action='store_true',
171 help='wait for user input, e.g., allow a debugger '
172 'to be attached')
Victor Stinner012f5b92018-09-07 17:20:42 +0200173 group.add_argument('--worker-args', metavar='ARGS')
Victor Stinner98de5342015-09-26 09:43:45 +0200174 group.add_argument('-S', '--start', metavar='START',
175 help='the name of the test at which to start.' +
176 more_details)
177
178 group = parser.add_argument_group('Verbosity')
179 group.add_argument('-v', '--verbose', action='count',
180 help='run tests in verbose mode with output to stdout')
181 group.add_argument('-w', '--verbose2', action='store_true',
182 help='re-run failed tests in verbose mode')
183 group.add_argument('-W', '--verbose3', action='store_true',
184 help='display test output on failure')
185 group.add_argument('-q', '--quiet', action='store_true',
186 help='no output unless one or more tests fail')
Victor Stinner6c446192016-08-17 11:25:43 +0200187 group.add_argument('-o', '--slowest', action='store_true', dest='print_slow',
Victor Stinner98de5342015-09-26 09:43:45 +0200188 help='print the slowest 10 tests')
189 group.add_argument('--header', action='store_true',
190 help='print header with interpreter info')
191
192 group = parser.add_argument_group('Selecting tests')
193 group.add_argument('-r', '--randomize', action='store_true',
194 help='randomize test execution order.' + more_details)
195 group.add_argument('--randseed', metavar='SEED',
196 dest='random_seed', type=int,
197 help='pass a random seed to reproduce a previous '
198 'random run')
199 group.add_argument('-f', '--fromfile', metavar='FILE',
200 help='read names of tests to run from a file.' +
201 more_details)
202 group.add_argument('-x', '--exclude', action='store_true',
203 help='arguments are tests to *exclude*')
204 group.add_argument('-s', '--single', action='store_true',
205 help='single step through a set of tests.' +
206 more_details)
207 group.add_argument('-m', '--match', metavar='PAT',
Victor Stinneref8320c2017-06-09 10:18:48 +0200208 dest='match_tests', action='append',
Victor Stinner98de5342015-09-26 09:43:45 +0200209 help='match test cases and methods with glob pattern PAT')
Victor Stinneref8320c2017-06-09 10:18:48 +0200210 group.add_argument('--matchfile', metavar='FILENAME',
211 dest='match_filename',
212 help='similar to --match but get patterns from a '
213 'text file, one pattern per line')
Victor Stinner98de5342015-09-26 09:43:45 +0200214 group.add_argument('-G', '--failfast', action='store_true',
215 help='fail as soon as a test fails (only with -v or -W)')
216 group.add_argument('-u', '--use', metavar='RES1,RES2,...',
217 action='append', type=resources_list,
218 help='specify which special resource intensive tests '
219 'to run.' + more_details)
220 group.add_argument('-M', '--memlimit', metavar='LIMIT',
221 help='run very large memory-consuming tests.' +
222 more_details)
223 group.add_argument('--testdir', metavar='DIR',
224 type=relative_filename,
225 help='execute test files in the specified directory '
226 '(instead of the Python stdlib test suite)')
227
228 group = parser.add_argument_group('Special runs')
Victor Stinner75120d22019-04-26 09:28:53 +0200229 group.add_argument('-l', '--findleaks', action='store_const', const=2,
230 default=1,
231 help='deprecated alias to --fail-env-changed')
Victor Stinner98de5342015-09-26 09:43:45 +0200232 group.add_argument('-L', '--runleaks', action='store_true',
233 help='run the leaks(1) command just before exit.' +
234 more_details)
235 group.add_argument('-R', '--huntrleaks', metavar='RUNCOUNTS',
236 type=huntrleaks,
237 help='search for reference leaks (needs debug build, '
238 'very slow).' + more_details)
239 group.add_argument('-j', '--multiprocess', metavar='PROCESSES',
240 dest='use_mp', type=int,
241 help='run PROCESSES processes at once')
242 group.add_argument('-T', '--coverage', action='store_true',
243 dest='trace',
244 help='turn on code coverage tracing using the trace '
245 'module')
246 group.add_argument('-D', '--coverdir', metavar='DIR',
247 type=relative_filename,
248 help='directory where coverage files are put')
249 group.add_argument('-N', '--nocoverdir',
250 action='store_const', const=None, dest='coverdir',
251 help='put coverage files alongside modules')
252 group.add_argument('-t', '--threshold', metavar='THRESHOLD',
253 type=int,
254 help='call gc.set_threshold(THRESHOLD)')
255 group.add_argument('-n', '--nowindows', action='store_true',
256 help='suppress error message boxes on Windows')
257 group.add_argument('-F', '--forever', action='store_true',
258 help='run the specified tests in a loop, until an '
Victor Stinnerb0917df2019-05-13 19:17:54 +0200259 'error happens; imply --failfast')
Victor Stinner5f9d3ac2015-10-03 00:21:12 +0200260 group.add_argument('--list-tests', action='store_true',
261 help="only write the name of tests that will be run, "
262 "don't execute them")
mlouielua49c9352017-06-16 17:36:19 +0800263 group.add_argument('--list-cases', action='store_true',
264 help='only write the name of test cases that will be run'
265 ' , don\'t execute them')
Brett Cannon11faa212015-10-02 16:20:49 -0700266 group.add_argument('-P', '--pgo', dest='pgo', action='store_true',
Neil Schemenauer4e16a4a2019-07-22 12:54:25 -0700267 help='enable Profile Guided Optimization (PGO) training')
268 group.add_argument('--pgo-extended', action='store_true',
269 help='enable extended PGO training (slower training)')
Victor Stinner63f54c62017-06-26 18:33:19 +0200270 group.add_argument('--fail-env-changed', action='store_true',
271 help='if a test file alters the environment, mark '
272 'the test as failed')
Victor Stinner98de5342015-09-26 09:43:45 +0200273
Steve Dowerd0f49d22018-09-18 09:10:26 -0700274 group.add_argument('--junit-xml', dest='xmlpath', metavar='FILENAME',
275 help='writes JUnit-style XML results to the specified '
276 'file')
Victor Stinner47fbc4e2019-06-24 12:03:00 +0200277 group.add_argument('--tempdir', metavar='PATH',
Steve Dower38df97a2018-11-17 04:14:36 -0800278 help='override the working directory for the test run')
Victor Stinner47fbc4e2019-06-24 12:03:00 +0200279 group.add_argument('--cleanup', action='store_true',
280 help='remove old test_python_* directories')
Victor Stinner98de5342015-09-26 09:43:45 +0200281 return parser
282
283
284def relative_filename(string):
285 # CWD is replaced with a temporary dir before calling main(), so we
286 # join it with the saved CWD so it ends up where the user expects.
287 return os.path.join(support.SAVEDCWD, string)
288
289
290def huntrleaks(string):
291 args = string.split(':')
292 if len(args) not in (2, 3):
293 raise argparse.ArgumentTypeError(
294 'needs 2 or 3 colon-separated arguments')
295 nwarmup = int(args[0]) if args[0] else 5
296 ntracked = int(args[1]) if args[1] else 4
297 fname = args[2] if len(args) > 2 and args[2] else 'reflog.txt'
298 return nwarmup, ntracked, fname
299
300
301def resources_list(string):
302 u = [x.lower() for x in string.split(',')]
303 for r in u:
304 if r == 'all' or r == 'none':
305 continue
306 if r[0] == '-':
307 r = r[1:]
308 if r not in RESOURCE_NAMES:
309 raise argparse.ArgumentTypeError('invalid resource: ' + r)
310 return u
311
312
313def _parse_args(args, **kwargs):
314 # Defaults
315 ns = argparse.Namespace(testdir=None, verbose=0, quiet=False,
316 exclude=False, single=False, randomize=False, fromfile=None,
Victor Stinner75120d22019-04-26 09:28:53 +0200317 findleaks=1, use_resources=None, trace=False, coverdir='coverage',
Victor Stinner98de5342015-09-26 09:43:45 +0200318 runleaks=False, huntrleaks=False, verbose2=False, print_slow=False,
319 random_seed=None, use_mp=None, verbose3=False, forever=False,
Brett Cannon11faa212015-10-02 16:20:49 -0700320 header=False, failfast=False, match_tests=None, pgo=False)
Victor Stinner98de5342015-09-26 09:43:45 +0200321 for k, v in kwargs.items():
322 if not hasattr(ns, k):
323 raise TypeError('%r is an invalid keyword argument '
324 'for this function' % k)
325 setattr(ns, k, v)
326 if ns.use_resources is None:
327 ns.use_resources = []
328
329 parser = _create_parser()
Victor Stinnera506a932016-10-17 18:13:46 +0200330 # Issue #14191: argparse doesn't support "intermixed" positional and
331 # optional arguments. Use parse_known_args() as workaround.
332 ns.args = parser.parse_known_args(args=args, namespace=ns)[1]
333 for arg in ns.args:
334 if arg.startswith('-'):
335 parser.error("unrecognized arguments: %s" % arg)
336 sys.exit(1)
Victor Stinner98de5342015-09-26 09:43:45 +0200337
Victor Stinner75120d22019-04-26 09:28:53 +0200338 if ns.findleaks > 1:
339 # --findleaks implies --fail-env-changed
340 ns.fail_env_changed = True
Victor Stinner98de5342015-09-26 09:43:45 +0200341 if ns.single and ns.fromfile:
342 parser.error("-s and -f don't go together!")
Xiang Zhang772bf2e2016-12-19 22:00:22 +0800343 if ns.use_mp is not None and ns.trace:
Victor Stinner98de5342015-09-26 09:43:45 +0200344 parser.error("-T and -j don't go together!")
Victor Stinner98de5342015-09-26 09:43:45 +0200345 if ns.failfast and not (ns.verbose or ns.verbose3):
346 parser.error("-G/--failfast needs either -v or -W")
Brett Cannon11faa212015-10-02 16:20:49 -0700347 if ns.pgo and (ns.verbose or ns.verbose2 or ns.verbose3):
348 parser.error("--pgo/-v don't go together!")
Neil Schemenauer4e16a4a2019-07-22 12:54:25 -0700349 if ns.pgo_extended:
350 ns.pgo = True # pgo_extended implies pgo
Victor Stinner98de5342015-09-26 09:43:45 +0200351
Steve Dower12c29452015-10-08 09:05:36 -0700352 if ns.nowindows:
353 print("Warning: the --nowindows (-n) option is deprecated. "
354 "Use -vv to display assertions in stderr.", file=sys.stderr)
355
Victor Stinner98de5342015-09-26 09:43:45 +0200356 if ns.quiet:
357 ns.verbose = 0
358 if ns.timeout is not None:
Victor Stinner5f9d3ac2015-10-03 00:21:12 +0200359 if ns.timeout <= 0:
Victor Stinner98de5342015-09-26 09:43:45 +0200360 ns.timeout = None
361 if ns.use_mp is not None:
362 if ns.use_mp <= 0:
363 # Use all cores + extras for tests that like to sleep
364 ns.use_mp = 2 + (os.cpu_count() or 1)
Victor Stinner98de5342015-09-26 09:43:45 +0200365 if ns.use:
366 for a in ns.use:
367 for r in a:
368 if r == 'all':
Victor Stinner5b392bb2017-07-20 15:46:32 +0200369 ns.use_resources[:] = ALL_RESOURCES
Victor Stinner98de5342015-09-26 09:43:45 +0200370 continue
371 if r == 'none':
372 del ns.use_resources[:]
373 continue
374 remove = False
375 if r[0] == '-':
376 remove = True
377 r = r[1:]
378 if remove:
379 if r in ns.use_resources:
380 ns.use_resources.remove(r)
381 elif r not in ns.use_resources:
382 ns.use_resources.append(r)
383 if ns.random_seed is not None:
384 ns.randomize = True
Victor Stinner3d005682017-05-04 15:21:12 +0200385 if ns.verbose:
386 ns.header = True
Victor Stinnerfcdd9b62017-05-18 13:03:24 -0700387 if ns.huntrleaks and ns.verbose3:
388 ns.verbose3 = False
389 print("WARNING: Disable --verbose3 because it's incompatible with "
390 "--huntrleaks: see http://bugs.python.org/issue27103",
391 file=sys.stderr)
Victor Stinneref8320c2017-06-09 10:18:48 +0200392 if ns.match_filename:
393 if ns.match_tests is None:
394 ns.match_tests = []
Steve Dower38df97a2018-11-17 04:14:36 -0800395 with open(ns.match_filename) as fp:
Victor Stinneref8320c2017-06-09 10:18:48 +0200396 for line in fp:
397 ns.match_tests.append(line.strip())
Victor Stinnerb0917df2019-05-13 19:17:54 +0200398 if ns.forever:
399 # --forever implies --failfast
400 ns.failfast = True
Victor Stinner98de5342015-09-26 09:43:45 +0200401
402 return ns