blob: 9a3244f621205d74998603aeafc6a3612bdd26be [file] [log] [blame]
Guido van Rossum54a069f2001-05-23 13:24:30 +00001 Writing Python Regression Tests
2 -------------------------------
3 Skip Montanaro
4 (skip@mojam.com)
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +00005
6
7Introduction
Skip Montanaro47c60ec2000-06-30 06:08:35 +00008
9If you add a new module to Python or modify the functionality of an existing
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +000010module, you should write one or more test cases to exercise that new
Fred Drakea6daad22001-05-23 04:57:49 +000011functionality. There are different ways to do this within the regression
12testing facility provided with Python; any particular test should use only
13one of these options. Each option requires writing a test module using the
14conventions of the the selected option:
Skip Montanaro47c60ec2000-06-30 06:08:35 +000015
Fred Drakea6daad22001-05-23 04:57:49 +000016 - PyUnit based tests
17 - doctest based tests
18 - "traditional" Python test modules
19
20Regardless of the mechanics of the testing approach you choose,
21you will be writing unit tests (isolated tests of functions and objects
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +000022defined by the module) using white box techniques. Unlike black box
23testing, where you only have the external interfaces to guide your test case
24writing, in white box testing you can see the code being tested and tailor
25your test cases to exercise it more completely. In particular, you will be
26able to refer to the C and Python code in the CVS repository when writing
27your regression test cases.
Skip Montanaro47c60ec2000-06-30 06:08:35 +000028
Tim Petersf5f6c432001-05-23 07:46:36 +000029
Fred Drakea6daad22001-05-23 04:57:49 +000030PyUnit based tests
31
32The PyUnit framework is based on the ideas of unit testing as espoused
33by Kent Beck and the Extreme Programming (XP) movement. The specific
34interface provided by the framework is tightly based on the JUnit
35Java implementation of Beck's original SmallTalk test framework. Please
36see the documentation of the unittest module for detailed information on
37the interface and general guidelines on writing PyUnit based tests.
38
Fred Drakeb2ad1c82001-09-28 20:05:25 +000039The test_support helper module provides a two functions for use by
Fred Drakea6daad22001-05-23 04:57:49 +000040PyUnit based tests in the Python regression testing framework:
41run_unittest() takes a unittest.TestCase derived class as a parameter
Fred Drakeb2ad1c82001-09-28 20:05:25 +000042and runs the tests defined in that class, and run_suite() takes a
Barry Warsaw5ca53742002-04-23 21:39:00 +000043populated TestSuite instance and runs the tests. run_suite() is
44preferred because unittest files typically grow multiple test classes,
45and you might as well be prepared.
46
47All test methods in the Python regression framework have names that
48start with "test_" and use lower-case names with words separated with
49underscores.
Fred Drakeb2ad1c82001-09-28 20:05:25 +000050
51All PyUnit-based tests in the Python test suite use boilerplate that
52looks like this:
53
54 import unittest
Barry Warsaw04f357c2002-07-23 19:04:11 +000055 from test import test_support
Fred Drakeb2ad1c82001-09-28 20:05:25 +000056
Barry Warsaw5ca53742002-04-23 21:39:00 +000057 class MyTestCase1(unittest.TestCase):
Fred Drakeb2ad1c82001-09-28 20:05:25 +000058 # define test methods here...
59
Barry Warsaw5ca53742002-04-23 21:39:00 +000060 class MyTestCase2(unittest.TestCase):
61 # define more test methods here...
62
Fred Drakeb2ad1c82001-09-28 20:05:25 +000063 def test_main():
Barry Warsaw5ca53742002-04-23 21:39:00 +000064 suite = unittest.TestSuite()
65 suite.addTest(unittest.makeSuite(MyTestCase1))
66 suite.addTest(unittest.makeSuite(MyTestCase2))
67 test_support.run_suite(suite)
Fred Drakeb2ad1c82001-09-28 20:05:25 +000068
69 if __name__ == "__main__":
70 test_main()
71
72This has the advantage that it allows the unittest module to be used
73as a script to run individual tests as well as working well with the
74regrtest framework.
Fred Drakea6daad22001-05-23 04:57:49 +000075
Tim Petersf5f6c432001-05-23 07:46:36 +000076
Fred Drakea6daad22001-05-23 04:57:49 +000077doctest based tests
78
79Tests written to use doctest are actually part of the docstrings for
80the module being tested. Each test is written as a display of an
81interactive session, including the Python prompts, statements that would
82be typed by the user, and the output of those statements (including
Tim Petersf5f6c432001-05-23 07:46:36 +000083tracebacks, although only the exception msg needs to be retained then).
84The module in the test package is simply a wrapper that causes doctest
85to run over the tests in the module. The test for the difflib module
86provides a convenient example:
Fred Drakea6daad22001-05-23 04:57:49 +000087
Barry Warsaw1bfab7b2002-07-23 19:13:45 +000088 import difflib
89 from test import test_support
Tim Petersa0a62222001-09-09 06:12:01 +000090 test_support.run_doctest(difflib)
Tim Petersf5f6c432001-05-23 07:46:36 +000091
92If the test is successful, nothing is written to stdout (so you should not
93create a corresponding output/test_difflib file), but running regrtest
Tim Petersa0a62222001-09-09 06:12:01 +000094with -v will give a detailed report, the same as if passing -v to doctest.
95
96A second argument can be passed to run_doctest to tell doctest to search
97sys.argv for -v instead of using test_support's idea of verbosity. This
98is useful for writing doctest-based tests that aren't simply running a
99doctest'ed Lib module, but contain the doctests themselves. Then at
100times you may want to run such a test directly as a doctest, independent
101of the regrtest framework. The tail end of test_descrtut.py is a good
102example:
103
104 def test_main(verbose=None):
Barry Warsaw1bfab7b2002-07-23 19:13:45 +0000105 from test import test_support, test_descrtut
106 test_support.run_doctest(test_descrtut, verbose)
Tim Petersa0a62222001-09-09 06:12:01 +0000107
108 if __name__ == "__main__":
109 test_main(1)
110
111If run via regrtest, test_main() is called (by regrtest) without specifying
Tim Petersbea3fb82001-09-10 01:39:21 +0000112verbose, and then test_support's idea of verbosity is used. But when
Tim Petersa0a62222001-09-09 06:12:01 +0000113run directly, test_main(1) is called, and then doctest's idea of verbosity
114is used.
Fred Drakea6daad22001-05-23 04:57:49 +0000115
116See the documentation for the doctest module for information on
117writing tests using the doctest framework.
118
Tim Petersf5f6c432001-05-23 07:46:36 +0000119
Fred Drakea6daad22001-05-23 04:57:49 +0000120"traditional" Python test modules
121
122The mechanics of how the "traditional" test system operates are fairly
123straightforward. When a test case is run, the output is compared with the
124expected output that is stored in .../Lib/test/output. If the test runs to
125completion and the actual and expected outputs match, the test succeeds, if
126not, it fails. If an ImportError or test_support.TestSkipped error is
127raised, the test is not run.
128
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000129
130Executing Test Cases
131
132If you are writing test cases for module spam, you need to create a file
Tim Petersf5f6c432001-05-23 07:46:36 +0000133in .../Lib/test named test_spam.py. In addition, if the tests are expected
134to write to stdout during a successful run, you also need to create an
135expected output file in .../Lib/test/output named test_spam ("..."
136represents the top-level directory in the Python source tree, the directory
137containing the configure script). If needed, generate the initial version
138of the test output file by executing:
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000139
140 ./python Lib/test/regrtest.py -g test_spam.py
141
Tim Petersf5f6c432001-05-23 07:46:36 +0000142from the top-level directory.
Fred Drakea6daad22001-05-23 04:57:49 +0000143
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000144Any time you modify test_spam.py you need to generate a new expected
Skip Montanaro47c60ec2000-06-30 06:08:35 +0000145output file. Don't forget to desk check the generated output to make sure
Tim Petersf5f6c432001-05-23 07:46:36 +0000146it's really what you expected to find! All in all it's usually better
147not to have an expected-out file (note that doctest- and unittest-based
148tests do not).
149
150To run a single test after modifying a module, simply run regrtest.py
151without the -g flag:
Skip Montanaro47c60ec2000-06-30 06:08:35 +0000152
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000153 ./python Lib/test/regrtest.py test_spam.py
154
155While debugging a regression test, you can of course execute it
156independently of the regression testing framework and see what it prints:
157
158 ./python Lib/test/test_spam.py
Skip Montanaro47c60ec2000-06-30 06:08:35 +0000159
Tim Petersf5f6c432001-05-23 07:46:36 +0000160To run the entire test suite:
161
162[UNIX, + other platforms where "make" works] Make the "test" target at the
163top level:
Skip Montanaro47c60ec2000-06-30 06:08:35 +0000164
Skip Montanaro47c60ec2000-06-30 06:08:35 +0000165 make test
166
Barry Warsaw5ca53742002-04-23 21:39:00 +0000167[WINDOWS] Run rt.bat from your PCBuild directory. Read the comments at
Tim Petersf5f6c432001-05-23 07:46:36 +0000168the top of rt.bat for the use of special -d, -O and -q options processed
169by rt.bat.
170
171[OTHER] You can simply execute the two runs of regrtest (optimized and
172non-optimized) directly:
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000173
174 ./python Lib/test/regrtest.py
175 ./python -O Lib/test/regrtest.py
176
Tim Petersf5f6c432001-05-23 07:46:36 +0000177But note that this way picks up whatever .pyc and .pyo files happen to be
178around. The makefile and rt.bat ways run the tests twice, the first time
179removing all .pyc and .pyo files from the subtree rooted at Lib/.
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000180
181Test cases generate output based upon values computed by the test code.
182When executed, regrtest.py compares the actual output generated by executing
183the test case with the expected output and reports success or failure. It
184stands to reason that if the actual and expected outputs are to match, they
185must not contain any machine dependencies. This means your test cases
186should not print out absolute machine addresses (e.g. the return value of
187the id() builtin function) or floating point numbers with large numbers of
188significant digits (unless you understand what you are doing!).
189
190
191Test Case Writing Tips
Skip Montanaro47c60ec2000-06-30 06:08:35 +0000192
193Writing good test cases is a skilled task and is too complex to discuss in
194detail in this short document. Many books have been written on the subject.
195I'll show my age by suggesting that Glenford Myers' "The Art of Software
196Testing", published in 1979, is still the best introduction to the subject
197available. It is short (177 pages), easy to read, and discusses the major
198elements of software testing, though its publication predates the
199object-oriented software revolution, so doesn't cover that subject at all.
200Unfortunately, it is very expensive (about $100 new). If you can borrow it
201or find it used (around $20), I strongly urge you to pick up a copy.
202
Skip Montanaro47c60ec2000-06-30 06:08:35 +0000203The most important goal when writing test cases is to break things. A test
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000204case that doesn't uncover a bug is much less valuable than one that does.
205In designing test cases you should pay attention to the following:
Skip Montanaro47c60ec2000-06-30 06:08:35 +0000206
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000207 * Your test cases should exercise all the functions and objects defined
208 in the module, not just the ones meant to be called by users of your
209 module. This may require you to write test code that uses the module
210 in ways you don't expect (explicitly calling internal functions, for
211 example - see test_atexit.py).
Skip Montanaro47c60ec2000-06-30 06:08:35 +0000212
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000213 * You should consider any boundary values that may tickle exceptional
214 conditions (e.g. if you were writing regression tests for division,
215 you might well want to generate tests with numerators and denominators
216 at the limits of floating point and integer numbers on the machine
217 performing the tests as well as a denominator of zero).
Skip Montanaro47c60ec2000-06-30 06:08:35 +0000218
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000219 * You should exercise as many paths through the code as possible. This
220 may not always be possible, but is a goal to strive for. In
221 particular, when considering if statements (or their equivalent), you
222 want to create test cases that exercise both the true and false
223 branches. For loops, you should create test cases that exercise the
224 loop zero, one and multiple times.
225
226 * You should test with obviously invalid input. If you know that a
227 function requires an integer input, try calling it with other types of
228 objects to see how it responds.
229
230 * You should test with obviously out-of-range input. If the domain of a
231 function is only defined for positive integers, try calling it with a
232 negative integer.
233
234 * If you are going to fix a bug that wasn't uncovered by an existing
235 test, try to write a test case that exposes the bug (preferably before
236 fixing it).
237
Fred Drake44b6bd22000-10-23 16:37:14 +0000238 * If you need to create a temporary file, you can use the filename in
239 test_support.TESTFN to do so. It is important to remove the file
240 when done; other tests should be able to use the name without cleaning
241 up after your test.
242
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000243
244Regression Test Writing Rules
245
246Each test case is different. There is no "standard" form for a Python
Tim Petersf5f6c432001-05-23 07:46:36 +0000247regression test case, though there are some general rules (note that
248these mostly apply only to the "classic" tests; unittest- and doctest-
249based tests should follow the conventions natural to those frameworks):
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000250
251 * If your test case detects a failure, raise TestFailed (found in
Barry Warsaw04f357c2002-07-23 19:04:11 +0000252 test.test_support).
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000253
254 * Import everything you'll need as early as possible.
255
256 * If you'll be importing objects from a module that is at least
257 partially platform-dependent, only import those objects you need for
258 the current test case to avoid spurious ImportError exceptions that
259 prevent the test from running to completion.
260
261 * Print all your test case results using the print statement. For
262 non-fatal errors, print an error message (or omit a successful
263 completion print) to indicate the failure, but proceed instead of
264 raising TestFailed.
265
Tim Petersa48b5262000-08-23 05:28:45 +0000266 * Use "assert" sparingly, if at all. It's usually better to just print
267 what you got, and rely on regrtest's got-vs-expected comparison to
268 catch deviations from what you expect. assert statements aren't
269 executed at all when regrtest is run in -O mode; and, because they
270 cause the test to stop immediately, can lead to a long & tedious
271 test-fix, test-fix, test-fix, ... cycle when things are badly broken
272 (and note that "badly broken" often includes running the test suite
273 for the first time on new platforms or under new implementations of
274 the language).
275
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000276
277Miscellaneous
278
Barry Warsaw1bfab7b2002-07-23 19:13:45 +0000279There is a test_support module in the test package you can import for
Barry Warsaw04f357c2002-07-23 19:04:11 +0000280your test case. Import this module using either
281
282 import test.test_support
283
284or
285
286 from test import test_support
287
288test_support provides the following useful objects:
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000289
290 * TestFailed - raise this exception when your regression test detects a
291 failure.
292
Fred Drake62c53dd2000-08-21 16:55:57 +0000293 * TestSkipped - raise this if the test could not be run because the
294 platform doesn't offer all the required facilities (like large
295 file support), even if all the required modules are available.
296
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000297 * verbose - you can use this variable to control print output. Many
298 modules use it. Search for "verbose" in the test_*.py files to see
299 lots of examples.
300
Tim Petersf5f6c432001-05-23 07:46:36 +0000301 * verify(condition, reason='test failed'). Use this instead of
302
303 assert condition[, reason]
304
305 verify() has two advantages over assert: it works even in -O mode,
306 and it raises TestFailed on failure instead of AssertionError.
307
308 * TESTFN - a string that should always be used as the filename when you
309 need to create a temp file. Also use try/finally to ensure that your
310 temp files are deleted before your test completes. Note that you
311 cannot unlink an open file on all operating systems, so also be sure
312 to close temp files before trying to unlink them.
313
314 * sortdict(dict) - acts like repr(dict.items()), but sorts the items
315 first. This is important when printing a dict value, because the
316 order of items produced by dict.items() is not defined by the
317 language.
318
319 * findfile(file) - you can call this function to locate a file somewhere
320 along sys.path or in the Lib/test tree - see test_linuxaudiodev.py for
321 an example of its use.
322
Tim Petersa48b5262000-08-23 05:28:45 +0000323 * use_large_resources - true iff tests requiring large time or space
324 should be run.
325
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000326 * fcmp(x,y) - you can call this function to compare two floating point
327 numbers when you expect them to only be approximately equal withing a
328 fuzz factor (test_support.FUZZ, which defaults to 1e-6).
329
Tim Petersa48b5262000-08-23 05:28:45 +0000330
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000331Python and C statement coverage results are currently available at
332
333 http://www.musi-cal.com/~skip/python/Python/dist/src/
334
335As of this writing (July, 2000) these results are being generated nightly.
336You can refer to the summaries and the test coverage output files to see
337where coverage is adequate or lacking and write test cases to beef up the
338coverage.
Tim Petersf5f6c432001-05-23 07:46:36 +0000339
340
341Some Non-Obvious regrtest Features
342
343 * Automagic test detection: When you create a new test file
344 test_spam.py, you do not need to modify regrtest (or anything else)
345 to advertise its existence. regrtest searches for and runs all
346 modules in the test directory with names of the form test_xxx.py.
347
348 * Miranda output: If, when running test_spam.py, regrtest does not
349 find an expected-output file test/output/test_spam, regrtest
350 pretends that it did find one, containing the single line
351
352 test_spam
353
354 This allows new tests that don't expect to print anything to stdout
355 to not bother creating expected-output files.
356
357 * Two-stage testing: To run test_spam.py, regrtest imports test_spam
358 as a module. Most tests run to completion as a side-effect of
359 getting imported. After importing test_spam, regrtest also executes
360 test_spam.test_main(), if test_spam has a "test_main" attribute.
Fred Drakeb2ad1c82001-09-28 20:05:25 +0000361 This is rarely required with the "traditional" Python tests, and
362 you shouldn't create a module global with name test_main unless
363 you're specifically exploiting this gimmick. This usage does
364 prove useful with PyUnit-based tests as well, however; defining
365 a test_main() which is run by regrtest and a script-stub in the
366 test module ("if __name__ == '__main__': test_main()") allows
367 the test to be used like any other Python test and also work
368 with the unittest.py-as-a-script approach, allowing a developer
369 to run specific tests from the command line.