\section{\module{unittest} ---
         Unit testing framework}

\declaremodule{standard}{unittest}
\modulesynopsis{Unit testing framework for Python.}
\moduleauthor{Steve Purcell}{stephen\textunderscore{}purcell@yahoo.com}
\sectionauthor{Steve Purcell}{stephen\textunderscore{}purcell@yahoo.com}
\sectionauthor{Fred L. Drake, Jr.}{fdrake@acm.org}
\sectionauthor{Raymond Hettinger}{python@rcn.com}

\versionadded{2.1}

The Python unit testing framework, often referred to as ``PyUnit,'' is
a Python language version of JUnit, by Kent Beck and Erich Gamma.
JUnit is, in turn, a Java version of Kent's Smalltalk testing
framework.  Each is the de facto standard unit testing framework for
its respective language.

PyUnit supports test automation, sharing of setup and shutdown code
for tests, aggregation of tests into collections, and independence of
the tests from the reporting framework.  The \module{unittest} module
provides classes that make it easy to support these qualities for a
set of tests.

To achieve this, PyUnit supports some important concepts:

\begin{definitions}
\term{test fixture}
A \dfn{test fixture} represents the preparation needed to perform one
or more tests, and any associate cleanup actions.  This may involve,
for example, creating temporary or proxy databases, directories, or
starting a server process.

\term{test case}
A \dfn{test case} is the smallest unit of testing.  It checks for a
specific response to a particular set of inputs.  PyUnit provides a
base class, \class{TestCase}, which may be used to create new test
cases. You may provide your own implementation that does not subclass
from \class{TestCase}, of course.

\term{test suite}
A \dfn{test suite} is a collection of test cases, test suites, or
both.  It is used to aggregate tests that should be executed
together.

\term{test runner}
A \dfn{test runner} is a component which orchestrates the execution of
tests and provides the outcome to the user.  The runner may use a
graphical interface, a textual interface, or return a special value to
indicate the results of executing the tests.
\end{definitions}


The test case and test fixture concepts are supported through the
\class{TestCase} and \class{FunctionTestCase} classes; the former
should be used when creating new tests, and the latter can be used when
integrating existing test code with a PyUnit-driven framework.  When
building test fixtures using \class{TestCase}, the \method{setUp()}
and \method{tearDown()} methods can be overridden to provide
initialization and cleanup for the fixture.  With
\class{FunctionTestCase}, existing functions can be passed to the
constructor for these purposes.  When the test is run, the
fixture initialization is run first; if it succeeds, the cleanup
method is run after the test has been executed, regardless of the
outcome of the test.  Each instance of the \class{TestCase} will only
be used to run a single test method, so a new fixture is created for
each test.

Test suites are implemented by the \class{TestSuite} class.  This
class allows individual tests and test suites to be aggregated; when
the suite is executed, all tests added directly to the suite and in
``child'' test suites are run.

A test runner is an object that provides a single method,
\method{run()}, which accepts a \class{TestCase} or \class{TestSuite}
object as a parameter, and returns a result object.  The class
\class{TestResult} is provided for use as the result object.  PyUnit
provide the \class{TextTestRunner} as an example test runner which
reports test results on the standard error stream by default.
Alternate runners can be implemented for other environments (such as
graphical environments) without any need to derive from a specific
class.


\begin{seealso}
  \seemodule{doctest}{Another test-support module with a very
                      different flavor.}
  \seetitle[http://pyunit.sourceforge.net/]{PyUnit Web Site}{The
            source for further information on PyUnit.}
  \seetitle[http://www.XProgramming.com/testfram.htm]{Simple Smalltalk
            Testing: With Patterns}{Kent Beck's original paper on
            testing frameworks using the pattern shared by
            \module{unittest}.}
\end{seealso}


\subsection{Basic example \label{minimal-example}}

The \module{unittest} module provides a rich set of tools for
constructing and running tests.  This section demonstrates that a
small subset of the tools suffice to meet the needs of most users.

Here is a short script to test three functions from the
\refmodule{random} module:

\begin{verbatim}
import random
import unittest

class TestSequenceFunctions(unittest.TestCase):
    
    def setUp(self):
        self.seq = range(10)

    def testshuffle(self):
        # make sure the shuffled sequence does not lose any elements
        random.shuffle(self.seq)
        self.seq.sort()
        self.assertEqual(self.seq, range(10))

    def testchoice(self):
        element = random.choice(self.seq)
        self.assert_(element in self.seq)

    def testsample(self):
        self.assertRaises(ValueError, random.sample, self.seq, 20)
        for element in random.sample(self.seq, 5):
            self.assert_(element in self.seq)

if __name__ == '__main__':
    unittest.main()
\end{verbatim}

A testcase is created by subclassing \class{unittest.TestCase}.
The three individual tests are defined with methods whose names start with
the letters \samp{test}.  This naming convention informs the test runner
about which methods represent tests.

The crux of each test is a call to \method{assertEqual()} to
check for an expected result; \method{assert_()} to verify a condition;
or \method{assertRaises()} to verify that an expected exception gets
raised.  These methods are used instead of the \keyword{assert} statement
so the test runner can accumulate all test results and produce a report.

When a \method{setUp()} method is defined, the test runner will run that
method prior to each test.  Likewise, if a \method{tearDown()} method is
defined, the test runner will invoke that method after each test.  In the
example, \method{setUp()} was used to create a fresh sequence for each test.

The final block shows a simple way to run the tests.
\function{unittest.main()} provides a command line interface to the
test script.  When run from the command line, the above script
produces an output that looks like this:

\begin{verbatim}
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK
\end{verbatim}

Instead of \function{unittest.main()}, there are other ways to run the tests
with a finer level of control, less terse output, and no requirement to be
run from the command line.  For example, the last two lines may be replaced
with:

\begin{verbatim}
suite = unittest.makeSuite(TestSequenceFunctions)
unittest.TextTestRunner(verbosity=2).run(suite)
\end{verbatim}

Running the revised script from the interpreter or another script
produces the following output:

\begin{verbatim}
testchoice (__main__.TestSequenceFunctions) ... ok
testsample (__main__.TestSequenceFunctions) ... ok
testshuffle (__main__.TestSequenceFunctions) ... ok

----------------------------------------------------------------------
Ran 3 tests in 0.110s

OK
\end{verbatim}

The above examples show the most commonly used \module{unittest} features
which are sufficient to meet many everyday testing needs.  The remainder
of the documentation explores the full feature set from first principles.


\subsection{Organizing test code
            \label{organizing-tests}}

The basic building blocks of unit testing are \dfn{test cases} ---
single scenarios that must be set up and checked for correctness.  In
PyUnit, test cases are represented by instances of the
\class{TestCase} class in the \refmodule{unittest} module. To make
your own test cases you must write subclasses of \class{TestCase}, or
use \class{FunctionTestCase}.

An instance of a \class{TestCase}-derived class is an object that can
completely run a single test method, together with optional set-up
and tidy-up code.

The testing code of a \class{TestCase} instance should be entirely
self contained, such that it can be run either in isolation or in
arbitrary combination with any number of other test cases.

The simplest test case subclass will simply override the
\method{runTest()} method in order to perform specific testing code:

\begin{verbatim}
import unittest

class DefaultWidgetSizeTestCase(unittest.TestCase):
    def runTest(self):
        widget = Widget("The widget")
        self.failUnless(widget.size() == (50,50), 'incorrect default size')
\end{verbatim}

Note that in order to test something, we use the one of the
\method{assert*()} or \method{fail*()} methods provided by the
\class{TestCase} base class.  If the test fails when the test case
runs, an exception will be raised, and the testing framework will
identify the test case as a \dfn{failure}.  Other exceptions that do
not arise from checks made through the \method{assert*()} and
\method{fail*()} methods are identified by the testing framework as
\dfn{errors}.

The way to run a test case will be described later.  For now, note
that to construct an instance of such a test case, we call its
constructor without arguments:

\begin{verbatim}
testCase = DefaultWidgetSizeTestCase()
\end{verbatim}

Now, such test cases can be numerous, and their set-up can be
repetitive.  In the above case, constructing a ``Widget'' in each of
100 Widget test case subclasses would mean unsightly duplication.

Luckily, we can factor out such set-up code by implementing a method
called \method{setUp()}, which the testing framework will
automatically call for us when we run the test:

\begin{verbatim}
import unittest

class SimpleWidgetTestCase(unittest.TestCase):
    def setUp(self):
        self.widget = Widget("The widget")

class DefaultWidgetSizeTestCase(SimpleWidgetTestCase):
    def runTest(self):
        self.failUnless(self.widget.size() == (50,50),
                        'incorrect default size')

class WidgetResizeTestCase(SimpleWidgetTestCase):
    def runTest(self):
        self.widget.resize(100,150)
        self.failUnless(self.widget.size() == (100,150),
                        'wrong size after resize')
\end{verbatim}

If the \method{setUp()} method raises an exception while the test is
running, the framework will consider the test to have suffered an
error, and the \method{runTest()} method will not be executed.

Similarly, we can provide a \method{tearDown()} method that tidies up
after the \method{runTest()} method has been run:

\begin{verbatim}
import unittest

class SimpleWidgetTestCase(unittest.TestCase):
    def setUp(self):
        self.widget = Widget("The widget")

    def tearDown(self):
        self.widget.dispose()
        self.widget = None
\end{verbatim}

If \method{setUp()} succeeded, the \method{tearDown()} method will be
run regardless of whether or not \method{runTest()} succeeded.

Such a working environment for the testing code is called a
\dfn{fixture}.

Often, many small test cases will use the same fixture.  In this case,
we would end up subclassing \class{SimpleWidgetTestCase} into many
small one-method classes such as
\class{DefaultWidgetSizeTestCase}.  This is time-consuming and
discouraging, so in the same vein as JUnit, PyUnit provides a simpler
mechanism:

\begin{verbatim}
import unittest

class WidgetTestCase(unittest.TestCase):
    def setUp(self):
        self.widget = Widget("The widget")

    def tearDown(self):
        self.widget.dispose()
        self.widget = None

    def testDefaultSize(self):
        self.failUnless(self.widget.size() == (50,50),
                        'incorrect default size')

    def testResize(self):
        self.widget.resize(100,150)
        self.failUnless(self.widget.size() == (100,150),
                        'wrong size after resize')
\end{verbatim}

Here we have not provided a \method{runTest()} method, but have
instead provided two different test methods.  Class instances will now
each run one of the \method{test*()}  methods, with \code{self.widget}
created and destroyed separately for each instance.  When creating an
instance we must specify the test method it is to run.  We do this by
passing the method name in the constructor:

\begin{verbatim}
defaultSizeTestCase = WidgetTestCase("testDefaultSize")
resizeTestCase = WidgetTestCase("testResize")
\end{verbatim}

Test case instances are grouped together according to the features
they test.  PyUnit provides a mechanism for this: the \class{test
suite}, represented by the class \class{TestSuite} in the
\refmodule{unittest} module:

\begin{verbatim}
widgetTestSuite = unittest.TestSuite()
widgetTestSuite.addTest(WidgetTestCase("testDefaultSize"))
widgetTestSuite.addTest(WidgetTestCase("testResize"))
\end{verbatim}

For the ease of running tests, as we will see later, it is a good
idea to provide in each test module a callable object that returns a
pre-built test suite:

\begin{verbatim}
def suite():
    suite = unittest.TestSuite()
    suite.addTest(WidgetTestCase("testDefaultSize"))
    suite.addTest(WidgetTestCase("testResize"))
    return suite
\end{verbatim}

or even:

\begin{verbatim}
class WidgetTestSuite(unittest.TestSuite):
    def __init__(self):
        unittest.TestSuite.__init__(self,map(WidgetTestCase,
                                              ("testDefaultSize",
                                               "testResize")))
\end{verbatim}

(The latter is admittedly not for the faint-hearted!)

Since it is a common pattern to create a \class{TestCase} subclass
with many similarly named test functions, there is a convenience
function called \function{makeSuite()} that constructs a test suite
that comprises all of the test cases in a test case class:

\begin{verbatim}
suite = unittest.makeSuite(WidgetTestCase)
\end{verbatim}

Note that when using the \function{makeSuite()} function, the order in
which the various test cases will be run by the test suite is the
order determined by sorting the test function names using the
\function{cmp()} built-in function.

Often it is desirable to group suites of test cases together, so as to
run tests for the whole system at once.  This is easy, since
\class{TestSuite} instances can be added to a \class{TestSuite} just
as \class{TestCase} instances can be added to a \class{TestSuite}:

\begin{verbatim}
suite1 = module1.TheTestSuite()
suite2 = module2.TheTestSuite()
alltests = unittest.TestSuite((suite1, suite2))
\end{verbatim}

You can place the definitions of test cases and test suites in the
same modules as the code they are to test (such as \file{widget.py}),
but there are several advantages to placing the test code in a
separate module, such as \file{widgettests.py}:

\begin{itemize}
  \item The test module can be run standalone from the command line.
  \item The test code can more easily be separated from shipped code.
  \item There is less temptation to change test code to fit the code
        it tests without a good reason.
  \item Test code should be modified much less frequently than the
        code it tests.
  \item Tested code can be refactored more easily.
  \item Tests for modules written in C must be in separate modules
        anyway, so why not be consistent?
  \item If the testing strategy changes, there is no need to change
        the source code.
\end{itemize}


\subsection{Re-using old test code
            \label{legacy-unit-tests}}

Some users will find that they have existing test code that they would
like to run from PyUnit, without converting every old test function to
a \class{TestCase} subclass.

For this reason, PyUnit provides a \class{FunctionTestCase} class.
This subclass of \class{TestCase} can be used to wrap an existing test
function.  Set-up and tear-down functions can also optionally be
wrapped.

Given the following test function:

\begin{verbatim}
def testSomething():
    something = makeSomething()
    assert something.name is not None
    # ...
\end{verbatim}

one can create an equivalent test case instance as follows:

\begin{verbatim}
testcase = unittest.FunctionTestCase(testSomething)
\end{verbatim}

If there are additional set-up and tear-down methods that should be
called as part of the test case's operation, they can also be provided:

\begin{verbatim}
testcase = unittest.FunctionTestCase(testSomething,
                                     setUp=makeSomethingDB,
                                     tearDown=deleteSomethingDB)
\end{verbatim}

\note{PyUnit supports the use of \exception{AssertionError}
as an indicator of test failure, but does not recommend it.  Future
versions may treat \exception{AssertionError} differently.}


\subsection{Classes and functions
            \label{unittest-contents}}

\begin{classdesc}{TestCase}{}
  Instances of the \class{TestCase} class represent the smallest
  testable units in a set of tests.  This class is intended to be used
  as a base class, with specific tests being implemented by concrete
  subclasses.  This class implements the interface needed by the test
  runner to allow it to drive the test, and methods that the test code
  can use to check for and report various kinds of failures.
\end{classdesc}

\begin{classdesc}{FunctionTestCase}{testFunc\optional{,
                  setUp\optional{, tearDown\optional{, description}}}}
  This class implements the portion of the \class{TestCase} interface
  which allows the test runner to drive the test, but does not provide
  the methods which test code can use to check and report errors.
  This is used to create test cases using legacy test code, allowing
  it to be integrated into a \refmodule{unittest}-based test
  framework.
\end{classdesc}

\begin{classdesc}{TestSuite}{\optional{tests}}
  This class represents an aggregation of individual tests cases and
  test suites.  The class presents the interface needed by the test
  runner to allow it to be run as any other test case, but all the
  contained tests and test suites are executed.  Additional methods
  are provided to add test cases and suites to the aggregation.  If
  \var{tests} is given, it must be a sequence of individual tests that
  will be added to the suite.
\end{classdesc}

\begin{classdesc}{TestLoader}{}
  This class is responsible for loading tests according to various
  criteria and returning them wrapped in a \class{TestSuite}.
  It can load all tests within a given module or \class{TestCase}
  class.  When loading from a module, it considers all
  \class{TestCase}-derived classes.  For each such class, it creates
  an instance for each method with a name beginning with the string
  \samp{test}.
\end{classdesc}

\begin{datadesc}{defaultTestLoader}
  Instance of the \class{TestLoader} class which can be shared.  If no
  customization of the \class{TestLoader} is needed, this instance can
  always be used instead of creating new instances.
\end{datadesc}

\begin{classdesc}{TextTestRunner}{\optional{stream\optional{,
                  descriptions\optional{, verbosity}}}}
  A basic test runner implementation which prints results on standard
  output.  It has a few configurable parameters, but is essentially
  very simple.  Graphical applications which run test suites should
  provide alternate implementations.
\end{classdesc}

\begin{funcdesc}{main}{\optional{module\optional{,
                 defaultTest\optional{, argv\optional{,
                 testRunner\optional{, testRunner}}}}}}
  A command-line program that runs a set of tests; this is primarily
  for making test modules conveniently executable.  The simplest use
  for this function is:

\begin{verbatim}
if __name__ == '__main__':
    unittest.main()
\end{verbatim}
\end{funcdesc}

In some cases, the existing tests may have be written using the
\refmodule{doctest} module.  If so, that module provides a 
\class{DocTestSuite} class that can automatically build
\class{unittest.TestSuite} instances from the existing test code.
\versionadded{2.3}


\subsection{TestCase Objects
            \label{testcase-objects}}

Each \class{TestCase} instance represents a single test, but each
concrete subclass may be used to define multiple tests --- the
concrete class represents a single test fixture.  The fixture is
created and cleaned up for each test case.

\class{TestCase} instances provide three groups of methods: one group
used to run the test, another used by the test implementation to
check conditions and report failures, and some inquiry methods
allowing information about the test itself to be gathered.

Methods in the first group are:

\begin{methoddesc}[TestCase]{setUp}{}
  Method called to prepare the test fixture.  This is called
  immediately before calling the test method; any exception raised by
  this method will be considered an error rather than a test failure.
  The default implementation does nothing.
\end{methoddesc}

\begin{methoddesc}[TestCase]{tearDown}{}
  Method called immediately after the test method has been called and
  the result recorded.  This is called even if the test method raised
  an exception, so the implementation in subclasses may need to be
  particularly careful about checking internal state.  Any exception
  raised by this method will be considered an error rather than a test
  failure.  This method will only be called if the \method{setUp()}
  succeeds, regardless of the outcome of the test method.
  The default implementation does nothing.  
\end{methoddesc}

\begin{methoddesc}[TestCase]{run}{\optional{result}}
  Run the test, collecting the result into the test result object
  passed as \var{result}.  If \var{result} is omitted or \constant{None},
  a temporary result object is created and used, but is not made
  available to the caller.  This is equivalent to simply calling the
  \class{TestCase} instance.
\end{methoddesc}

\begin{methoddesc}[TestCase]{debug}{}
  Run the test without collecting the result.  This allows exceptions
  raised by the test to be propagated to the caller, and can be used
  to support running tests under a debugger.
\end{methoddesc}


The test code can use any of the following methods to check for and
report failures.

\begin{methoddesc}[TestCase]{assert_}{expr\optional{, msg}}
\methodline{failUnless}{expr\optional{, msg}}
  Signal a test failure if \var{expr} is false; the explanation for
  the error will be \var{msg} if given, otherwise it will be
  \constant{None}.
\end{methoddesc}

\begin{methoddesc}[TestCase]{assertEqual}{first, second\optional{, msg}}
\methodline{failUnlessEqual}{first, second\optional{, msg}}
  Test that \var{first} and \var{second} are equal.  If the values do
  not compare equal, the test will fail with the explanation given by
  \var{msg}, or \constant{None}.  Note that using \method{failUnlessEqual()}
  improves upon doing the comparison as the first parameter to
  \method{failUnless()}:  the default value for \var{msg} can be
  computed to include representations of both \var{first} and
  \var{second}.
\end{methoddesc}

\begin{methoddesc}[TestCase]{assertNotEqual}{first, second\optional{, msg}}
\methodline{failIfEqual}{first, second\optional{, msg}}
  Test that \var{first} and \var{second} are not equal.  If the values
  do compare equal, the test will fail with the explanation given by
  \var{msg}, or \constant{None}.  Note that using \method{failIfEqual()}
  improves upon doing the comparison as the first parameter to
  \method{failUnless()} is that the default value for \var{msg} can be
  computed to include representations of both \var{first} and
  \var{second}.
\end{methoddesc}

\begin{methoddesc}[TestCase]{assertAlmostEqual}{first, second\optional{,
						places\optional{, msg}}}
\methodline{failUnlessAlmostEqual}{first, second\optional{,
						places\optional{, msg}}}
  Test that \var{first} and \var{second} are approximately equal
  by computing the difference, rounding to the given number of \var{places},
  and comparing to zero.  Note that comparing a given number of decimal places
  is not the same as comparing a given number of significant digits.
  If the values do not compare equal, the test will fail with the explanation
  given by \var{msg}, or \constant{None}.  
\end{methoddesc}

\begin{methoddesc}[TestCase]{assertNotAlmostEqual}{first, second\optional{,
						places\optional{, msg}}}
\methodline{failIfAlmostEqual}{first, second\optional{,
						places\optional{, msg}}}
  Test that \var{first} and \var{second} are not approximately equal
  by computing the difference, rounding to the given number of \var{places},
  and comparing to zero.  Note that comparing a given number of decimal places
  is not the same as comparing a given number of significant digits.
  If the values do not compare equal, the test will fail with the explanation
  given by \var{msg}, or \constant{None}.  
\end{methoddesc}

\begin{methoddesc}[TestCase]{assertRaises}{exception, callable, \moreargs}
\methodline{failUnlessRaises}{exception, callable, \moreargs}
  Test that an exception is raised when \var{callable} is called with
  any positional or keyword arguments that are also passed to
  \method{assertRaises()}.  The test passes if \var{exception} is
  raised, is an error if another exception is raised, or fails if no
  exception is raised.  To catch any of a group of exceptions, a tuple
  containing the exception classes may be passed as \var{exception}.
\end{methoddesc}

\begin{methoddesc}[TestCase]{failIf}{expr\optional{, msg}}
  The inverse of the \method{failUnless()} method is the
  \method{failIf()} method.  This signals a test failure if \var{expr}
  is true, with \var{msg} or \constant{None} for the error message.
\end{methoddesc}

\begin{methoddesc}[TestCase]{fail}{\optional{msg}}
  Signals a test failure unconditionally, with \var{msg} or
  \constant{None} for the error message.
\end{methoddesc}

\begin{memberdesc}[TestCase]{failureException}
  This class attribute gives the exception raised by the
  \method{test()} method.  If a test framework needs to use a
  specialized exception, possibly to carry additional information, it
  must subclass this exception in order to ``play fair'' with the
  framework.  The initial value of this attribute is
  \exception{AssertionError}.
\end{memberdesc}


Testing frameworks can use the following methods to collect
information on the test:

\begin{methoddesc}[TestCase]{countTestCases}{}
  Return the number of tests represented by the this test object.  For
  \class{TestCase} instances, this will always be \code{1}, but this
  method is also implemented by the \class{TestSuite} class, which can
  return larger values.
\end{methoddesc}

\begin{methoddesc}[TestCase]{defaultTestResult}{}
  Return the default type of test result object to be used to run this
  test.
\end{methoddesc}

\begin{methoddesc}[TestCase]{id}{}
  Return a string identifying the specific test case.  This is usually
  the full name of the test method, including the module and class
  names.
\end{methoddesc}

\begin{methoddesc}[TestCase]{shortDescription}{}
  Returns a one-line description of the test, or \constant{None} if no
  description has been provided.  The default implementation of this
  method returns the first line of the test method's docstring, if
  available, or \constant{None}.
\end{methoddesc}


\subsection{TestSuite Objects
            \label{testsuite-objects}}

\class{TestSuite} objects behave much like \class{TestCase} objects,
except they do not actually implement a test.  Instead, they are used
to aggregate tests into groups that should be run together.  Some
additional methods are available to add tests to \class{TestSuite}
instances:

\begin{methoddesc}[TestSuite]{addTest}{test}
  Add a \class{TestCase} or \class{TestSuite} to the set of tests that
  make up the suite.
\end{methoddesc}

\begin{methoddesc}[TestSuite]{addTests}{tests}
  Add all the tests from a sequence of \class{TestCase} and
  \class{TestSuite} instances to this test suite.
\end{methoddesc}

The \method{run()} method is also slightly different:

\begin{methoddesc}[TestSuite]{run}{result}
  Run the tests associated with this suite, collecting the result into
  the test result object passed as \var{result}.  Note that unlike
  \method{TestCase.run()}, \method{TestSuite.run()} requires the
  result object to be passed in.
\end{methoddesc}

In the typical usage of a \class{TestSuite} object, the \method{run()}
method is invoked by a \class{TestRunner} rather than by the end-user
test harness.


\subsection{TestResult Objects
            \label{testresult-objects}}

A \class{TestResult} object stores the results of a set of tests.  The
\class{TestCase} and \class{TestSuite} classes ensure that results are
properly stored; test authors do not need to worry about recording the
outcome of tests.

Testing frameworks built on top of \refmodule{unittest} may want
access to the \class{TestResult} object generated by running a set of
tests for reporting purposes; a \class{TestResult} instance is
returned by the \method{TestRunner.run()} method for this purpose.

Each instance holds the total number of tests run, and collections of
failures and errors that occurred among those test runs.  The
collections contain tuples of \code{(\var{testcase},
\var{traceback})}, where \var{traceback} is a string containing a
formatted version of the traceback for the exception.

\class{TestResult} instances have the following attributes that will
be of interest when inspecting the results of running a set of tests:

\begin{memberdesc}[TestResult]{errors}
  A list containing pairs of \class{TestCase} instances and the
  formatted tracebacks for tests which raised an exception but did not
  signal a test failure.
  \versionchanged[Contains formatted tracebacks instead of
                  \function{sys.exc_info()} results]{2.2}
\end{memberdesc}

\begin{memberdesc}[TestResult]{failures}
  A list containing pairs of \class{TestCase} instances and the
  formatted tracebacks for tests which signalled a failure in the code
  under test.
  \versionchanged[Contains formatted tracebacks instead of
                  \function{sys.exc_info()} results]{2.2}
\end{memberdesc}

\begin{memberdesc}[TestResult]{testsRun}
  The number of tests which have been started.
\end{memberdesc}

\begin{methoddesc}[TestResult]{wasSuccessful}{}
  Returns true if all tests run so far have passed, otherwise returns
  false.
\end{methoddesc}


The following methods of the \class{TestResult} class are used to
maintain the internal data structures, and may be extended in
subclasses to support additional reporting requirements.  This is
particularly useful in building tools which support interactive
reporting while tests are being run.

\begin{methoddesc}[TestResult]{startTest}{test}
  Called when the test case \var{test} is about to be run.
\end{methoddesc}

\begin{methoddesc}[TestResult]{stopTest}{test}
  Called when the test case \var{test} has been executed, regardless
  of the outcome.
\end{methoddesc}

\begin{methoddesc}[TestResult]{addError}{test, err}
  Called when the test case \var{test} raises an exception without
  signalling a test failure.  \var{err} is a tuple of the form
  returned by \function{sys.exc_info()}:  \code{(\var{type},
  \var{value}, \var{traceback})}.
\end{methoddesc}

\begin{methoddesc}[TestResult]{addFailure}{test, err}
  Called when the test case \var{test} signals a failure.
  \var{err} is a tuple of the form returned by
  \function{sys.exc_info()}:  \code{(\var{type}, \var{value},
  \var{traceback})}.
\end{methoddesc}

\begin{methoddesc}[TestResult]{addSuccess}{test}
  This method is called for a test that does not fail; \var{test} is
  the test case object.
\end{methoddesc}


One additional method is available for \class{TestResult} objects:

\begin{methoddesc}[TestResult]{stop}{}
  This method can be called to signal that the set of tests being run
  should be aborted.  Once this has been called, the
  \class{TestRunner} object return to its caller without running any
  additional tests.  This is used by the \class{TextTestRunner} class
  to stop the test framework when the user signals an interrupt from
  the keyboard.  Interactive tools which provide runners can use this
  in a similar manner.
\end{methoddesc}


\subsection{TestLoader Objects
            \label{testloader-objects}}

The \class{TestLoader} class is used to create test suites from
classes and modules.  Normally, there is no need to create an instance
of this class; the \refmodule{unittest} module provides an instance
that can be shared as the \code{defaultTestLoader} module attribute.
Using a subclass or instance would allow customization of some
configurable properties.

\class{TestLoader} objects have the following methods:

\begin{methoddesc}[TestLoader]{loadTestsFromTestCase}{testCaseClass}
  Return a suite of all tests cases contained in the
  \class{TestCase}-derived class \class{testCaseClass}.
\end{methoddesc}

\begin{methoddesc}[TestLoader]{loadTestsFromModule}{module}
  Return a suite of all tests cases contained in the given module.
  This method searches \var{module} for classes derived from
  \class{TestCase} and creates an instance of the class for each test
  method defined for the class.

  \warning{While using a hierarchy of
  \class{Testcase}-derived classes can be convenient in sharing
  fixtures and helper functions, defining test methods on base classes
  that are not intended to be instantiated directly does not play well
  with this method.  Doing so, however, can be useful when the
  fixtures are different and defined in subclasses.}
\end{methoddesc}

\begin{methoddesc}[TestLoader]{loadTestsFromName}{name\optional{, module}}
  Return a suite of all tests cases given a string specifier.

  The specifier \var{name} is a ``dotted name'' that may resolve
  either to a module, a test case class, a test method within a test
  case class, or a callable object which returns a \class{TestCase} or
  \class{TestSuite} instance.  For example, if you have a module
  \module{SampleTests} containing a \class{TestCase}-derived class
  \class{SampleTestCase} with three test methods (\method{test_one()},
  \method{test_two()}, and \method{test_three()}), the specifier
  \code{'SampleTests.SampleTestCase'} would cause this method to
  return a suite which will run all three test methods.  Using the
  specifier \code{'SampleTests.SampleTestCase.test_two'} would cause
  it to return a test suite which will run only the
  \method{test_two()} test method.  The specifier can refer to modules
  and packages which have not been imported; they will be imported as
  a side-effect.

  The method optionally resolves \var{name} relative to a given module.
\end{methoddesc}

\begin{methoddesc}[TestLoader]{loadTestsFromNames}{names\optional{, module}}
  Similar to \method{loadTestsFromName()}, but takes a sequence of
  names rather than a single name.  The return value is a test suite
  which supports all the tests defined for each name.
\end{methoddesc}

\begin{methoddesc}[TestLoader]{getTestCaseNames}{testCaseClass}
  Return a sorted sequence of method names found within
  \var{testCaseClass}.
\end{methoddesc}


The following attributes of a \class{TestLoader} can be configured
either by subclassing or assignment on an instance:

\begin{memberdesc}[TestLoader]{testMethodPrefix}
  String giving the prefix of method names which will be interpreted
  as test methods.  The default value is \code{'test'}.
\end{memberdesc}

\begin{memberdesc}[TestLoader]{sortTestMethodsUsing}
  Function to be used to compare method names when sorting them in
  \method{getTestCaseNames()}.  The default value is the built-in
  \function{cmp()} function; it can be set to \constant{None} to disable
  the sort.
\end{memberdesc}

\begin{memberdesc}[TestLoader]{suiteClass}
  Callable object that constructs a test suite from a list of tests.
  No methods on the resulting object are needed.  The default value is
  the \class{TestSuite} class.
\end{memberdesc}
