symbian-qemu-0.9.1-12/python-2.6.1/Lib/test/README
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 +++++++++++++++++++++++++++++++
       
     2 Writing Python Regression Tests
       
     3 +++++++++++++++++++++++++++++++
       
     4 
       
     5 :Author: Skip Montanaro
       
     6 :Contact: skip@pobox.com
       
     7 
       
     8 Introduction
       
     9 ============
       
    10 
       
    11 If you add a new module to Python or modify the functionality of an existing
       
    12 module, you should write one or more test cases to exercise that new
       
    13 functionality.  There are different ways to do this within the regression
       
    14 testing facility provided with Python; any particular test should use only
       
    15 one of these options.  Each option requires writing a test module using the
       
    16 conventions of the selected option:
       
    17 
       
    18     - unittest_ based tests
       
    19     - doctest_ based tests
       
    20     - "traditional" Python test modules
       
    21 
       
    22 Regardless of the mechanics of the testing approach you choose,
       
    23 you will be writing unit tests (isolated tests of functions and objects
       
    24 defined by the module) using white box techniques.  Unlike black box
       
    25 testing, where you only have the external interfaces to guide your test case
       
    26 writing, in white box testing you can see the code being tested and tailor
       
    27 your test cases to exercise it more completely.  In particular, you will be
       
    28 able to refer to the C and Python code in the CVS repository when writing
       
    29 your regression test cases.
       
    30 
       
    31 .. _unittest: http://www.python.org/doc/current/lib/module-unittest.html
       
    32 .. _doctest: http://www.python.org/doc/current/lib/module-doctest.html
       
    33 
       
    34 unittest-based tests
       
    35 ------------------
       
    36 The unittest_ framework is based on the ideas of unit testing as espoused
       
    37 by Kent Beck and the `Extreme Programming`_ (XP) movement.  The specific
       
    38 interface provided by the framework is tightly based on the JUnit_
       
    39 Java implementation of Beck's original SmallTalk test framework.  Please
       
    40 see the documentation of the unittest_ module for detailed information on
       
    41 the interface and general guidelines on writing unittest-based tests.
       
    42 
       
    43 The test_support helper module provides a function for use by
       
    44 unittest-based tests in the Python regression testing framework,
       
    45 ``run_unittest()``. This is the primary way of running tests in the
       
    46 standard library. You can pass it any number of the following:
       
    47 
       
    48 - classes derived from or instances of ``unittest.TestCase`` or
       
    49   ``unittest.TestSuite``. These will be handed off to unittest for
       
    50   converting into a proper TestSuite instance.
       
    51 
       
    52 - a string; this must be a key in sys.modules. The module associated with
       
    53   that string will be scanned by ``unittest.TestLoader.loadTestsFromModule``.
       
    54   This is usually seen as ``test_support.run_unittest(__name__)`` in a test
       
    55   module's ``test_main()`` function. This has the advantage of picking up
       
    56   new tests automatically, without you having to add each new test case
       
    57   manually.
       
    58    
       
    59 All test methods in the Python regression framework have names that
       
    60 start with "``test_``" and use lower-case names with words separated with
       
    61 underscores.
       
    62 
       
    63 Test methods should *not* have docstrings!  The unittest module prints
       
    64 the docstring if there is one, but otherwise prints the function name
       
    65 and the full class name.  When there's a problem with a test, the
       
    66 latter information makes it easier to find the source for the test
       
    67 than the docstring.
       
    68 
       
    69 All unittest-based tests in the Python test suite use boilerplate that
       
    70 looks like this (with minor variations)::
       
    71 
       
    72     import unittest
       
    73     from test import test_support
       
    74 
       
    75     class MyTestCase1(unittest.TestCase):
       
    76 
       
    77         # Define setUp and tearDown only if needed
       
    78 
       
    79         def setUp(self):
       
    80             unittest.TestCase.setUp(self)
       
    81             ... additional initialization...
       
    82 
       
    83         def tearDown(self):
       
    84             ... additional finalization...
       
    85             unittest.TestCase.tearDown(self)
       
    86 
       
    87         def test_feature_one(self):
       
    88             # Testing feature one
       
    89             ...unit test for feature one...
       
    90 
       
    91         def test_feature_two(self):
       
    92             # Testing feature two
       
    93             ...unit test for feature two...
       
    94 
       
    95         ...etc...
       
    96 
       
    97     class MyTestCase2(unittest.TestCase):
       
    98         ...same structure as MyTestCase1...
       
    99 
       
   100     ...etc...
       
   101 
       
   102     def test_main():
       
   103         test_support.run_unittest(__name__)
       
   104 
       
   105     if __name__ == "__main__":
       
   106         test_main()
       
   107 
       
   108 This has the advantage that it allows the unittest module to be used
       
   109 as a script to run individual tests as well as working well with the
       
   110 regrtest framework.
       
   111 
       
   112 .. _Extreme Programming: http://www.extremeprogramming.org/
       
   113 .. _JUnit: http://www.junit.org/
       
   114 
       
   115 doctest based tests
       
   116 -------------------
       
   117 Tests written to use doctest_ are actually part of the docstrings for
       
   118 the module being tested.  Each test is written as a display of an
       
   119 interactive session, including the Python prompts, statements that would
       
   120 be typed by the user, and the output of those statements (including
       
   121 tracebacks, although only the exception msg needs to be retained then).
       
   122 The module in the test package is simply a wrapper that causes doctest
       
   123 to run over the tests in the module.  The test for the difflib module
       
   124 provides a convenient example::
       
   125 
       
   126     import difflib
       
   127     from test import test_support
       
   128     test_support.run_doctest(difflib)
       
   129 
       
   130 If the test is successful, nothing is written to stdout (so you should not
       
   131 create a corresponding output/test_difflib file), but running regrtest
       
   132 with -v will give a detailed report, the same as if passing -v to doctest.
       
   133 
       
   134 A second argument can be passed to run_doctest to tell doctest to search
       
   135 ``sys.argv`` for -v instead of using test_support's idea of verbosity.  This
       
   136 is useful for writing doctest-based tests that aren't simply running a
       
   137 doctest'ed Lib module, but contain the doctests themselves.  Then at
       
   138 times you may want to run such a test directly as a doctest, independent
       
   139 of the regrtest framework.  The tail end of test_descrtut.py is a good
       
   140 example::
       
   141 
       
   142     def test_main(verbose=None):
       
   143         from test import test_support, test_descrtut
       
   144         test_support.run_doctest(test_descrtut, verbose)
       
   145 
       
   146     if __name__ == "__main__":
       
   147         test_main(1)
       
   148 
       
   149 If run via regrtest, ``test_main()`` is called (by regrtest) without
       
   150 specifying verbose, and then test_support's idea of verbosity is used.  But
       
   151 when run directly, ``test_main(1)`` is called, and then doctest's idea of
       
   152 verbosity is used.
       
   153 
       
   154 See the documentation for the doctest module for information on
       
   155 writing tests using the doctest framework.
       
   156 
       
   157 "traditional" Python test modules
       
   158 ---------------------------------
       
   159 The mechanics of how the "traditional" test system operates are fairly
       
   160 straightforward.  When a test case is run, the output is compared with the
       
   161 expected output that is stored in .../Lib/test/output.  If the test runs to
       
   162 completion and the actual and expected outputs match, the test succeeds, if
       
   163 not, it fails.  If an ``ImportError`` or ``test_support.TestSkipped`` error
       
   164 is raised, the test is not run.
       
   165 
       
   166 Executing Test Cases
       
   167 ====================
       
   168 If you are writing test cases for module spam, you need to create a file
       
   169 in .../Lib/test named test_spam.py.  In addition, if the tests are expected
       
   170 to write to stdout during a successful run, you also need to create an
       
   171 expected output file in .../Lib/test/output named test_spam ("..."
       
   172 represents the top-level directory in the Python source tree, the directory
       
   173 containing the configure script).  If needed, generate the initial version
       
   174 of the test output file by executing::
       
   175 
       
   176     ./python Lib/test/regrtest.py -g test_spam.py
       
   177 
       
   178 from the top-level directory.
       
   179 
       
   180 Any time you modify test_spam.py you need to generate a new expected
       
   181 output file.  Don't forget to desk check the generated output to make sure
       
   182 it's really what you expected to find!  All in all it's usually better
       
   183 not to have an expected-out file (note that doctest- and unittest-based
       
   184 tests do not).
       
   185 
       
   186 To run a single test after modifying a module, simply run regrtest.py
       
   187 without the -g flag::
       
   188 
       
   189     ./python Lib/test/regrtest.py test_spam.py
       
   190 
       
   191 While debugging a regression test, you can of course execute it
       
   192 independently of the regression testing framework and see what it prints::
       
   193 
       
   194     ./python Lib/test/test_spam.py
       
   195 
       
   196 To run the entire test suite:
       
   197 
       
   198 - [UNIX, + other platforms where "make" works] Make the "test" target at the
       
   199   top level::
       
   200 
       
   201     make test
       
   202 
       
   203 - [WINDOWS] Run rt.bat from your PCBuild directory.  Read the comments at
       
   204   the top of rt.bat for the use of special -d, -O and -q options processed
       
   205   by rt.bat.
       
   206 
       
   207 - [OTHER] You can simply execute the two runs of regrtest (optimized and
       
   208   non-optimized) directly::
       
   209 
       
   210     ./python Lib/test/regrtest.py
       
   211     ./python -O Lib/test/regrtest.py
       
   212 
       
   213 But note that this way picks up whatever .pyc and .pyo files happen to be
       
   214 around.  The makefile and rt.bat ways run the tests twice, the first time
       
   215 removing all .pyc and .pyo files from the subtree rooted at Lib/.
       
   216 
       
   217 Test cases generate output based upon values computed by the test code.
       
   218 When executed, regrtest.py compares the actual output generated by executing
       
   219 the test case with the expected output and reports success or failure.  It
       
   220 stands to reason that if the actual and expected outputs are to match, they
       
   221 must not contain any machine dependencies.  This means your test cases
       
   222 should not print out absolute machine addresses (e.g. the return value of
       
   223 the id() builtin function) or floating point numbers with large numbers of
       
   224 significant digits (unless you understand what you are doing!).
       
   225 
       
   226 
       
   227 Test Case Writing Tips
       
   228 ======================
       
   229 Writing good test cases is a skilled task and is too complex to discuss in
       
   230 detail in this short document.  Many books have been written on the subject.
       
   231 I'll show my age by suggesting that Glenford Myers' `"The Art of Software
       
   232 Testing"`_, published in 1979, is still the best introduction to the subject
       
   233 available.  It is short (177 pages), easy to read, and discusses the major
       
   234 elements of software testing, though its publication predates the
       
   235 object-oriented software revolution, so doesn't cover that subject at all.
       
   236 Unfortunately, it is very expensive (about $100 new).  If you can borrow it
       
   237 or find it used (around $20), I strongly urge you to pick up a copy.
       
   238 
       
   239 The most important goal when writing test cases is to break things.  A test
       
   240 case that doesn't uncover a bug is much less valuable than one that does.
       
   241 In designing test cases you should pay attention to the following:
       
   242 
       
   243     * Your test cases should exercise all the functions and objects defined
       
   244       in the module, not just the ones meant to be called by users of your
       
   245       module.  This may require you to write test code that uses the module
       
   246       in ways you don't expect (explicitly calling internal functions, for
       
   247       example - see test_atexit.py).
       
   248 
       
   249     * You should consider any boundary values that may tickle exceptional
       
   250       conditions (e.g. if you were writing regression tests for division,
       
   251       you might well want to generate tests with numerators and denominators
       
   252       at the limits of floating point and integer numbers on the machine
       
   253       performing the tests as well as a denominator of zero).
       
   254 
       
   255     * You should exercise as many paths through the code as possible.  This
       
   256       may not always be possible, but is a goal to strive for.  In
       
   257       particular, when considering if statements (or their equivalent), you
       
   258       want to create test cases that exercise both the true and false
       
   259       branches.  For loops, you should create test cases that exercise the
       
   260       loop zero, one and multiple times.
       
   261 
       
   262     * You should test with obviously invalid input.  If you know that a
       
   263       function requires an integer input, try calling it with other types of
       
   264       objects to see how it responds.
       
   265 
       
   266     * You should test with obviously out-of-range input.  If the domain of a
       
   267       function is only defined for positive integers, try calling it with a
       
   268       negative integer.
       
   269 
       
   270     * If you are going to fix a bug that wasn't uncovered by an existing
       
   271       test, try to write a test case that exposes the bug (preferably before
       
   272       fixing it).
       
   273 
       
   274     * If you need to create a temporary file, you can use the filename in
       
   275       ``test_support.TESTFN`` to do so.  It is important to remove the file
       
   276       when done; other tests should be able to use the name without cleaning
       
   277       up after your test.
       
   278 
       
   279 .. _"The Art of Software Testing": 
       
   280         http://www.amazon.com/exec/obidos/ISBN=0471043281
       
   281 
       
   282 Regression Test Writing Rules
       
   283 =============================
       
   284 Each test case is different.  There is no "standard" form for a Python
       
   285 regression test case, though there are some general rules (note that
       
   286 these mostly apply only to the "classic" tests; unittest_- and doctest_-
       
   287 based tests should follow the conventions natural to those frameworks)::
       
   288 
       
   289     * If your test case detects a failure, raise ``TestFailed`` (found in
       
   290       ``test.test_support``).
       
   291 
       
   292     * Import everything you'll need as early as possible.
       
   293 
       
   294     * If you'll be importing objects from a module that is at least
       
   295       partially platform-dependent, only import those objects you need for
       
   296       the current test case to avoid spurious ``ImportError`` exceptions
       
   297       that prevent the test from running to completion.
       
   298 
       
   299     * Print all your test case results using the ``print`` statement.  For
       
   300       non-fatal errors, print an error message (or omit a successful
       
   301       completion print) to indicate the failure, but proceed instead of
       
   302       raising ``TestFailed``.
       
   303 
       
   304     * Use ``assert`` sparingly, if at all.  It's usually better to just print
       
   305       what you got, and rely on regrtest's got-vs-expected comparison to
       
   306       catch deviations from what you expect.  ``assert`` statements aren't
       
   307       executed at all when regrtest is run in -O mode; and, because they
       
   308       cause the test to stop immediately, can lead to a long & tedious
       
   309       test-fix, test-fix, test-fix, ... cycle when things are badly broken
       
   310       (and note that "badly broken" often includes running the test suite
       
   311       for the first time on new platforms or under new implementations of
       
   312       the language).
       
   313 
       
   314 Miscellaneous
       
   315 =============
       
   316 There is a test_support module in the test package you can import for
       
   317 your test case.  Import this module using either::
       
   318 
       
   319     import test.test_support
       
   320 
       
   321 or::
       
   322 
       
   323     from test import test_support
       
   324 
       
   325 test_support provides the following useful objects:
       
   326 
       
   327     * ``TestFailed`` - raise this exception when your regression test detects
       
   328       a failure.
       
   329 
       
   330     * ``TestSkipped`` - raise this if the test could not be run because the
       
   331       platform doesn't offer all the required facilities (like large
       
   332       file support), even if all the required modules are available.
       
   333 
       
   334     * ``ResourceDenied`` - this is raised when a test requires a resource that
       
   335       is not available.  Primarily used by 'requires'.
       
   336 
       
   337     * ``verbose`` - you can use this variable to control print output.  Many
       
   338       modules use it.  Search for "verbose" in the test_*.py files to see
       
   339       lots of examples.
       
   340 
       
   341     * ``forget(module_name)`` - attempts to cause Python to "forget" that it
       
   342       loaded a module and erase any PYC files.
       
   343 
       
   344     * ``is_resource_enabled(resource)`` - Returns a boolean based on whether
       
   345       the resource is enabled or not.
       
   346 
       
   347     * ``requires(resource [, msg])`` - if the required resource is not
       
   348       available the ResourceDenied exception is raised.
       
   349     
       
   350     * ``verify(condition, reason='test failed')``.  Use this instead of::
       
   351 
       
   352           assert condition[, reason]
       
   353 
       
   354       ``verify()`` has two advantages over ``assert``:  it works even in -O
       
   355       mode, and it raises ``TestFailed`` on failure instead of
       
   356       ``AssertionError``.
       
   357 
       
   358     * ``have_unicode`` - true if Unicode is available, false otherwise.
       
   359 
       
   360     * ``is_jython`` - true if the interpreter is Jython, false otherwise.
       
   361 
       
   362     * ``TESTFN`` - a string that should always be used as the filename when
       
   363       you need to create a temp file.  Also use ``try``/``finally`` to
       
   364       ensure that your temp files are deleted before your test completes.
       
   365       Note that you cannot unlink an open file on all operating systems, so
       
   366       also be sure to close temp files before trying to unlink them.
       
   367 
       
   368     * ``sortdict(dict)`` - acts like ``repr(dict.items())``, but sorts the
       
   369       items first.  This is important when printing a dict value, because
       
   370       the order of items produced by ``dict.items()`` is not defined by the
       
   371       language.
       
   372 
       
   373     * ``findfile(file)`` - you can call this function to locate a file
       
   374       somewhere along sys.path or in the Lib/test tree - see
       
   375       test_linuxaudiodev.py for an example of its use.
       
   376 
       
   377     * ``fcmp(x,y)`` - you can call this function to compare two floating
       
   378       point numbers when you expect them to only be approximately equal
       
   379       withing a fuzz factor (``test_support.FUZZ``, which defaults to 1e-6).
       
   380 
       
   381     * ``check_syntax_error(testcase, statement)`` - make sure that the
       
   382       statement is *not* correct Python syntax.
       
   383 
       
   384 
       
   385 Some Non-Obvious regrtest Features
       
   386 ==================================
       
   387     * Automagic test detection:  When you create a new test file
       
   388       test_spam.py, you do not need to modify regrtest (or anything else)
       
   389       to advertise its existence.  regrtest searches for and runs all
       
   390       modules in the test directory with names of the form test_xxx.py.
       
   391 
       
   392     * Miranda output:  If, when running test_spam.py, regrtest does not
       
   393       find an expected-output file test/output/test_spam, regrtest
       
   394       pretends that it did find one, containing the single line
       
   395 
       
   396       test_spam
       
   397 
       
   398       This allows new tests that don't expect to print anything to stdout
       
   399       to not bother creating expected-output files.
       
   400 
       
   401     * Two-stage testing:  To run test_spam.py, regrtest imports test_spam
       
   402       as a module.  Most tests run to completion as a side-effect of
       
   403       getting imported.  After importing test_spam, regrtest also executes
       
   404       ``test_spam.test_main()``, if test_spam has a ``test_main`` attribute.
       
   405       This is rarely required with the "traditional" Python tests, and
       
   406       you shouldn't create a module global with name test_main unless
       
   407       you're specifically exploiting this gimmick.  This usage does
       
   408       prove useful with unittest-based tests as well, however; defining
       
   409       a ``test_main()`` which is run by regrtest and a script-stub in the
       
   410       test module ("``if __name__ == '__main__': test_main()``") allows
       
   411       the test to be used like any other Python test and also work
       
   412       with the unittest.py-as-a-script approach, allowing a developer
       
   413       to run specific tests from the command line.