\section{\module{test} ---
         Regression tests package for Python}

\declaremodule{standard}{test}
\sectionauthor{Brett Cannon}{brett@python.org}
\modulesynopsis{Regression tests package containing the testing suite
                for Python.}


The \module{test} package contains all regression tests for Python as
well as the modules \module{test.test_support} and
\module{test.regrtest}.  \module{test.test_support} is used to enhance
your tests while \module{test.regrtest} drives the testing suite.

Each module in the \module{test} package whose name starts with
\samp{test_} is a testing suite for a specific module or feature.
All new tests should be written using the \refmodule{unittest} module;
using \refmodule{unittest} is not required but makes the tests more
flexible and maintenance of the tests easier.  Some older tests are
written to use \refmodule{doctest} and a ``traditional'' testing
style; these styles of tests will not be covered.

\begin{seealso}
\seemodule{unittest}{Writing PyUnit regression tests.}
\seemodule{doctest}{Tests embedded in documentation strings.}
\end{seealso}


\subsection{Writing Unit Tests for the \module{test} package%
            \label{writing-tests}}

It is preferred that tests for the \module{test} package use the
\refmodule{unittest} module and follow a few guidelines.
One is to have the name of all the test methods start with \samp{test_} as
well as the module's name.
This is needed so that the methods are recognized by the test driver as
test methods.
Also, no documentation string for the method should be included.
A comment (such as
\samp{\# Tests function returns only True or False}) should be used to provide
documentation for test methods.
This is done because documentation strings get printed out if they exist and
thus what test is being run is not stated.

A basic boilerplate is often used:

\begin{verbatim}
import unittest
from test import test_support

class MyTestCase1(unittest.TestCase):

    # Only use setUp() and tearDown() if necessary

    def setUp(self):
        ... code to execute in preparation for tests ...

    def tearDown(self):
        ... code to execute to clean up after tests ...

    def test_feature_one(self):
        # Test feature one.
        ... testing code ...

    def test_feature_two(self):
        # Test feature two.
        ... testing code ...

    ... more test methods ...

class MyTestCase2(unittest.TestCase):
    ... same structure as MyTestCase1 ...

... more test classes ...

def test_main():
    test_support.run_unittest(MyTestCase1,
                              MyTestCase2,
                              ... list other tests ...
                             )

if __name__ == '__main__':
    test_main()
\end{verbatim}

This boilerplate code allows the testing suite to be run by
\module{test.regrtest} as well as on its own as a script.

The goal for regression testing is to try to break code.
This leads to a few guidelines to be followed:

\begin{itemize}
\item The testing suite should exercise all classes, functions, and
      constants.
      This includes not just the external API that is to be presented to the
      outside world but also "private" code.
\item Whitebox testing (examining the code being tested when the tests are
      being written) is preferred.
      Blackbox testing (testing only the published user interface) is not
      complete enough to make sure all boundary and edge cases are tested.
\item Make sure all possible values are tested including invalid ones.
      This makes sure that not only all valid values are acceptable but also
      that improper values are handled correctly.
\item Exhaust as many code paths as possible.
      Test where branching occurs and thus tailor input to make sure as many
      different paths through the code are taken.
\item Add an explicit test for any bugs discovered for the tested code.
      This will make sure that the error does not crop up again if the code is
      changed in the future.
\item Make sure to clean up after your tests (such as close and remove all
      temporary files).
\item Import as few modules as possible and do it as soon as possible.
      This minimizes external dependencies of tests and also minimizes possible
      anomalous behavior from side-effects of importing a module.
\item Try to maximize code reuse.
      On occasion, tests will vary by something as small as what type
      of input is used.
      Minimize code duplication by subclassing a basic test class with a class
      that specifies the input:
\begin{verbatim}
class TestFuncAcceptsSequences(unittest.TestCase):

    func = mySuperWhammyFunction

    def test_func(self):
        self.func(self.arg)

class AcceptLists(TestFuncAcceptsSequences):
    arg = [1,2,3]

class AcceptStrings(TestFuncAcceptsSequences):
    arg = 'abc'

class AcceptTuples(TestFuncAcceptsSequences):
    arg = (1,2,3)
\end{verbatim}
\end{itemize}

\begin{seealso}
\seetitle{Test Driven Development}
         {A book by Kent Beck on writing tests before code.}
\end{seealso}


\subsection{Running tests using \module{test.regrtest} \label{regrtest}}

\module{test.regrtest} can be used as a script to drive Python's
regression test suite.
Running the script by itself automatically starts running all
regression tests in the \module{test} package.
It does this by finding all modules in the package whose name starts with
\samp{test_}, importing them, and executing the function
\function{test_main()} if present.
The names of tests to execute may also be passed to the script.
Specifying a single regression test (\program{python regrtest.py}
\programopt{test_spam.py}) will minimize output and only print whether
the test passed or failed and thus minimize output.

Running \module{test.regrtest} directly allows what resources are
available for tests to use to be set.
You do this by using the \programopt{-u} command-line option.
Run \program{python regrtest.py} \programopt{-uall} to turn on all
resources; specifying \programopt{all} as an option for
\programopt{-u} enables all possible resources.
If all but one resource is desired (a more common case), a
comma-separated list of resources that are not desired may be listed after
\programopt{all}.
The command \program{python regrtest.py}
\programopt{-uall,-audio,-largefile} will run \module{test.regrtest}
with all resources except the \programopt{audio} and
\programopt{largefile} resources.
For a list of all resources and more command-line options, run
\program{python regrtest.py} \programopt{-h}.

Some other ways to execute the regression tests depend on what platform the
tests are being executed on.
On \UNIX{}, you can run \program{make} \programopt{test} at the
top-level directory where Python was built.
On Windows, executing \program{rt.bat} from your \file{PCBuild}
directory will run all regression tests.


\section{\module{test.test_support} ---
         Utility functions for tests}

\declaremodule[test.testsupport]{standard}{test.test_support}
\modulesynopsis{Support for Python regression tests.}

The \module{test.test_support} module provides support for Python's
regression tests.

This module defines the following exceptions:

\begin{excdesc}{TestFailed}
Exception to be raised when a test fails.
\end{excdesc}

\begin{excdesc}{TestSkipped}
Subclass of \exception{TestFailed}.
Raised when a test is skipped.
This occurs when a needed resource (such as a network connection) is not
available at the time of testing.
\end{excdesc}

\begin{excdesc}{ResourceDenied}
Subclass of \exception{TestSkipped}.
Raised when a resource (such as a network connection) is not available.
Raised by the \function{requires()} function.
\end{excdesc}


The \module{test.test_support} module defines the following constants:

\begin{datadesc}{verbose}
\constant{True} when verbose output is enabled.
Should be checked when more detailed information is desired about a running
test.
\var{verbose} is set by \module{test.regrtest}.
\end{datadesc}

\begin{datadesc}{have_unicode}
\constant{True} when Unicode support is available.
\end{datadesc}

\begin{datadesc}{is_jython}
\constant{True} if the running interpreter is Jython.
\end{datadesc}

\begin{datadesc}{TESTFN}
Set to the path that a temporary file may be created at.
Any temporary that is created should be closed and unlinked (removed).
\end{datadesc}


The \module{test.test_support} module defines the following functions:

\begin{funcdesc}{forget}{module_name}
Removes the module named \var{module_name} from \code{sys.modules} and deletes
any byte-compiled files of the module.
\end{funcdesc}

\begin{funcdesc}{is_resource_enabled}{resource}
Returns \constant{True} if \var{resource} is enabled and available.
The list of available resources is only set when \module{test.regrtest}
is executing the tests.
\end{funcdesc}

\begin{funcdesc}{requires}{resource\optional{, msg}}
Raises \exception{ResourceDenied} if \var{resource} is not available.
\var{msg} is the argument to \exception{ResourceDenied} if it is raised.
Always returns true if called by a function whose \code{__name__} is
\code{'__main__'}.
Used when tests are executed by \module{test.regrtest}.
\end{funcdesc}

\begin{funcdesc}{findfile}{filename}
Return the path to the file named \var{filename}.
If no match is found \var{filename} is returned.
This does not equal a failure since it could be the path to the file.
\end{funcdesc}

\begin{funcdesc}{run_unittest}{*classes}
Execute \class{unittest.TestCase} subclasses passed to the function.
The function scans the classes for methods starting with the prefix
\samp{test_} and executes the tests individually.
This is the preferred way to execute tests.
\end{funcdesc}

\begin{funcdesc}{run_suite}{suite\optional{, testclass}}
Execute the \class{unittest.TestSuite} instance \var{suite}.
The optional argument \var{testclass} accepts one of the test classes in the
suite so as to print out more detailed information on where the testing suite
originated from.
\end{funcdesc}
