blob: 13e740c2e798d51eb6ea7e6a387a2912bc15be7f [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
Tim Petersa0a62222001-09-09 06:12:01 +000088 import difflib, test_support
89 test_support.run_doctest(difflib)
Tim Petersf5f6c432001-05-23 07:46:36 +000090
91If the test is successful, nothing is written to stdout (so you should not
92create a corresponding output/test_difflib file), but running regrtest
Tim Petersa0a62222001-09-09 06:12:01 +000093with -v will give a detailed report, the same as if passing -v to doctest.
94
95A second argument can be passed to run_doctest to tell doctest to search
96sys.argv for -v instead of using test_support's idea of verbosity. This
97is useful for writing doctest-based tests that aren't simply running a
98doctest'ed Lib module, but contain the doctests themselves. Then at
99times you may want to run such a test directly as a doctest, independent
100of the regrtest framework. The tail end of test_descrtut.py is a good
101example:
102
103 def test_main(verbose=None):
104 import test_support, test.test_descrtut
105 test_support.run_doctest(test.test_descrtut, verbose)
106
107 if __name__ == "__main__":
108 test_main(1)
109
110If run via regrtest, test_main() is called (by regrtest) without specifying
Tim Petersbea3fb82001-09-10 01:39:21 +0000111verbose, and then test_support's idea of verbosity is used. But when
Tim Petersa0a62222001-09-09 06:12:01 +0000112run directly, test_main(1) is called, and then doctest's idea of verbosity
113is used.
Fred Drakea6daad22001-05-23 04:57:49 +0000114
115See the documentation for the doctest module for information on
116writing tests using the doctest framework.
117
Tim Petersf5f6c432001-05-23 07:46:36 +0000118
Fred Drakea6daad22001-05-23 04:57:49 +0000119"traditional" Python test modules
120
121The mechanics of how the "traditional" test system operates are fairly
122straightforward. When a test case is run, the output is compared with the
123expected output that is stored in .../Lib/test/output. If the test runs to
124completion and the actual and expected outputs match, the test succeeds, if
125not, it fails. If an ImportError or test_support.TestSkipped error is
126raised, the test is not run.
127
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000128
129Executing Test Cases
130
131If you are writing test cases for module spam, you need to create a file
Tim Petersf5f6c432001-05-23 07:46:36 +0000132in .../Lib/test named test_spam.py. In addition, if the tests are expected
133to write to stdout during a successful run, you also need to create an
134expected output file in .../Lib/test/output named test_spam ("..."
135represents the top-level directory in the Python source tree, the directory
136containing the configure script). If needed, generate the initial version
137of the test output file by executing:
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000138
139 ./python Lib/test/regrtest.py -g test_spam.py
140
Tim Petersf5f6c432001-05-23 07:46:36 +0000141from the top-level directory.
Fred Drakea6daad22001-05-23 04:57:49 +0000142
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000143Any time you modify test_spam.py you need to generate a new expected
Skip Montanaro47c60ec2000-06-30 06:08:35 +0000144output file. Don't forget to desk check the generated output to make sure
Tim Petersf5f6c432001-05-23 07:46:36 +0000145it's really what you expected to find! All in all it's usually better
146not to have an expected-out file (note that doctest- and unittest-based
147tests do not).
148
149To run a single test after modifying a module, simply run regrtest.py
150without the -g flag:
Skip Montanaro47c60ec2000-06-30 06:08:35 +0000151
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000152 ./python Lib/test/regrtest.py test_spam.py
153
154While debugging a regression test, you can of course execute it
155independently of the regression testing framework and see what it prints:
156
157 ./python Lib/test/test_spam.py
Skip Montanaro47c60ec2000-06-30 06:08:35 +0000158
Tim Petersf5f6c432001-05-23 07:46:36 +0000159To run the entire test suite:
160
161[UNIX, + other platforms where "make" works] Make the "test" target at the
162top level:
Skip Montanaro47c60ec2000-06-30 06:08:35 +0000163
Skip Montanaro47c60ec2000-06-30 06:08:35 +0000164 make test
165
Barry Warsaw5ca53742002-04-23 21:39:00 +0000166[WINDOWS] Run rt.bat from your PCBuild directory. Read the comments at
Tim Petersf5f6c432001-05-23 07:46:36 +0000167the top of rt.bat for the use of special -d, -O and -q options processed
168by rt.bat.
169
170[OTHER] You can simply execute the two runs of regrtest (optimized and
171non-optimized) directly:
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000172
173 ./python Lib/test/regrtest.py
174 ./python -O Lib/test/regrtest.py
175
Tim Petersf5f6c432001-05-23 07:46:36 +0000176But note that this way picks up whatever .pyc and .pyo files happen to be
177around. The makefile and rt.bat ways run the tests twice, the first time
178removing all .pyc and .pyo files from the subtree rooted at Lib/.
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000179
180Test cases generate output based upon values computed by the test code.
181When executed, regrtest.py compares the actual output generated by executing
182the test case with the expected output and reports success or failure. It
183stands to reason that if the actual and expected outputs are to match, they
184must not contain any machine dependencies. This means your test cases
185should not print out absolute machine addresses (e.g. the return value of
186the id() builtin function) or floating point numbers with large numbers of
187significant digits (unless you understand what you are doing!).
188
189
190Test Case Writing Tips
Skip Montanaro47c60ec2000-06-30 06:08:35 +0000191
192Writing good test cases is a skilled task and is too complex to discuss in
193detail in this short document. Many books have been written on the subject.
194I'll show my age by suggesting that Glenford Myers' "The Art of Software
195Testing", published in 1979, is still the best introduction to the subject
196available. It is short (177 pages), easy to read, and discusses the major
197elements of software testing, though its publication predates the
198object-oriented software revolution, so doesn't cover that subject at all.
199Unfortunately, it is very expensive (about $100 new). If you can borrow it
200or find it used (around $20), I strongly urge you to pick up a copy.
201
Skip Montanaro47c60ec2000-06-30 06:08:35 +0000202The most important goal when writing test cases is to break things. A test
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000203case that doesn't uncover a bug is much less valuable than one that does.
204In designing test cases you should pay attention to the following:
Skip Montanaro47c60ec2000-06-30 06:08:35 +0000205
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000206 * Your test cases should exercise all the functions and objects defined
207 in the module, not just the ones meant to be called by users of your
208 module. This may require you to write test code that uses the module
209 in ways you don't expect (explicitly calling internal functions, for
210 example - see test_atexit.py).
Skip Montanaro47c60ec2000-06-30 06:08:35 +0000211
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000212 * You should consider any boundary values that may tickle exceptional
213 conditions (e.g. if you were writing regression tests for division,
214 you might well want to generate tests with numerators and denominators
215 at the limits of floating point and integer numbers on the machine
216 performing the tests as well as a denominator of zero).
Skip Montanaro47c60ec2000-06-30 06:08:35 +0000217
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000218 * You should exercise as many paths through the code as possible. This
219 may not always be possible, but is a goal to strive for. In
220 particular, when considering if statements (or their equivalent), you
221 want to create test cases that exercise both the true and false
222 branches. For loops, you should create test cases that exercise the
223 loop zero, one and multiple times.
224
225 * You should test with obviously invalid input. If you know that a
226 function requires an integer input, try calling it with other types of
227 objects to see how it responds.
228
229 * You should test with obviously out-of-range input. If the domain of a
230 function is only defined for positive integers, try calling it with a
231 negative integer.
232
233 * If you are going to fix a bug that wasn't uncovered by an existing
234 test, try to write a test case that exposes the bug (preferably before
235 fixing it).
236
Fred Drake44b6bd22000-10-23 16:37:14 +0000237 * If you need to create a temporary file, you can use the filename in
238 test_support.TESTFN to do so. It is important to remove the file
239 when done; other tests should be able to use the name without cleaning
240 up after your test.
241
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000242
243Regression Test Writing Rules
244
245Each test case is different. There is no "standard" form for a Python
Tim Petersf5f6c432001-05-23 07:46:36 +0000246regression test case, though there are some general rules (note that
247these mostly apply only to the "classic" tests; unittest- and doctest-
248based tests should follow the conventions natural to those frameworks):
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000249
250 * If your test case detects a failure, raise TestFailed (found in
Barry Warsaw04f357c2002-07-23 19:04:11 +0000251 test.test_support).
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000252
253 * Import everything you'll need as early as possible.
254
255 * If you'll be importing objects from a module that is at least
256 partially platform-dependent, only import those objects you need for
257 the current test case to avoid spurious ImportError exceptions that
258 prevent the test from running to completion.
259
260 * Print all your test case results using the print statement. For
261 non-fatal errors, print an error message (or omit a successful
262 completion print) to indicate the failure, but proceed instead of
263 raising TestFailed.
264
Tim Petersa48b5262000-08-23 05:28:45 +0000265 * Use "assert" sparingly, if at all. It's usually better to just print
266 what you got, and rely on regrtest's got-vs-expected comparison to
267 catch deviations from what you expect. assert statements aren't
268 executed at all when regrtest is run in -O mode; and, because they
269 cause the test to stop immediately, can lead to a long & tedious
270 test-fix, test-fix, test-fix, ... cycle when things are badly broken
271 (and note that "badly broken" often includes running the test suite
272 for the first time on new platforms or under new implementations of
273 the language).
274
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000275
276Miscellaneous
277
Barry Warsaw04f357c2002-07-23 19:04:11 +0000278There is a test_support module in the test package you can import from
279your test case. Import this module using either
280
281 import test.test_support
282
283or
284
285 from test import test_support
286
287test_support provides the following useful objects:
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000288
289 * TestFailed - raise this exception when your regression test detects a
290 failure.
291
Fred Drake62c53dd2000-08-21 16:55:57 +0000292 * TestSkipped - raise this if the test could not be run because the
293 platform doesn't offer all the required facilities (like large
294 file support), even if all the required modules are available.
295
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000296 * verbose - you can use this variable to control print output. Many
297 modules use it. Search for "verbose" in the test_*.py files to see
298 lots of examples.
299
Tim Petersf5f6c432001-05-23 07:46:36 +0000300 * verify(condition, reason='test failed'). Use this instead of
301
302 assert condition[, reason]
303
304 verify() has two advantages over assert: it works even in -O mode,
305 and it raises TestFailed on failure instead of AssertionError.
306
307 * TESTFN - a string that should always be used as the filename when you
308 need to create a temp file. Also use try/finally to ensure that your
309 temp files are deleted before your test completes. Note that you
310 cannot unlink an open file on all operating systems, so also be sure
311 to close temp files before trying to unlink them.
312
313 * sortdict(dict) - acts like repr(dict.items()), but sorts the items
314 first. This is important when printing a dict value, because the
315 order of items produced by dict.items() is not defined by the
316 language.
317
318 * findfile(file) - you can call this function to locate a file somewhere
319 along sys.path or in the Lib/test tree - see test_linuxaudiodev.py for
320 an example of its use.
321
Tim Petersa48b5262000-08-23 05:28:45 +0000322 * use_large_resources - true iff tests requiring large time or space
323 should be run.
324
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000325 * fcmp(x,y) - you can call this function to compare two floating point
326 numbers when you expect them to only be approximately equal withing a
327 fuzz factor (test_support.FUZZ, which defaults to 1e-6).
328
Tim Petersa48b5262000-08-23 05:28:45 +0000329
Skip Montanaroe9e5dcd2000-07-19 17:19:49 +0000330Python and C statement coverage results are currently available at
331
332 http://www.musi-cal.com/~skip/python/Python/dist/src/
333
334As of this writing (July, 2000) these results are being generated nightly.
335You can refer to the summaries and the test coverage output files to see
336where coverage is adequate or lacking and write test cases to beef up the
337coverage.
Tim Petersf5f6c432001-05-23 07:46:36 +0000338
339
340Some Non-Obvious regrtest Features
341
342 * Automagic test detection: When you create a new test file
343 test_spam.py, you do not need to modify regrtest (or anything else)
344 to advertise its existence. regrtest searches for and runs all
345 modules in the test directory with names of the form test_xxx.py.
346
347 * Miranda output: If, when running test_spam.py, regrtest does not
348 find an expected-output file test/output/test_spam, regrtest
349 pretends that it did find one, containing the single line
350
351 test_spam
352
353 This allows new tests that don't expect to print anything to stdout
354 to not bother creating expected-output files.
355
356 * Two-stage testing: To run test_spam.py, regrtest imports test_spam
357 as a module. Most tests run to completion as a side-effect of
358 getting imported. After importing test_spam, regrtest also executes
359 test_spam.test_main(), if test_spam has a "test_main" attribute.
Fred Drakeb2ad1c82001-09-28 20:05:25 +0000360 This is rarely required with the "traditional" Python tests, and
361 you shouldn't create a module global with name test_main unless
362 you're specifically exploiting this gimmick. This usage does
363 prove useful with PyUnit-based tests as well, however; defining
364 a test_main() which is run by regrtest and a script-stub in the
365 test module ("if __name__ == '__main__': test_main()") allows
366 the test to be used like any other Python test and also work
367 with the unittest.py-as-a-script approach, allowing a developer
368 to run specific tests from the command line.