\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.

\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}
  \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 \code{unittest.TestCase}.
The three individual tests are defined with methods whose names start with
the letters \code{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.  \code{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 \code{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.TestSuite()
suite.addTest(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()} provided in the
\refmodule{unittest} module that constructs a test suite that
comprises all of the test cases in a test case class:

\begin{verbatim}
suite = unittest.makeSuite(WidgetTestCase,'test')
\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
\module{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 \code{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 propogated 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
  \code{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 \code{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 \code{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 \code{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 \code{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 \code{None} for the error message.
\end{methoddesc}

\begin{methoddesc}[TestCase]{fail}{\optional{msg}}
  Signals a test failure unconditionally, with \var{msg} or
  \code{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 \code{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 \code{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 \code{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}


\subsection{Getting Extended Error Information
            \label{unittest-error-info}}

Some applications can make use of more error information (for example,
an integrated development environment, or IDE).  Such an application
can retrieve supplemental information about errors and failures by
using an alternate \class{TestResult} implementation, and extending
the \method{defaultTestResult()} method of the \class{TestCase} class
to provide it.

Here is a brief example of a \class{TestResult} subclass which stores
the actual exception and traceback objects.  (Be aware that storing
traceback objects can cause a great deal of memory not to be reclaimed
when it otherwise would be, which can have effects that affect the
behavior of the tests.)

\begin{verbatim}
import unittest

class MyTestCase(unittest.TestCase):
    def defaultTestResult(self):
        return MyTestResult()

class MyTestResult(unittest.TestResult):
    def __init__(self):
        self.errors_tb = []
        self.failures_tb = []

    def addError(self, test, err):
        self.errors_tb.append((test, err))
        unittest.TestResult.addError(self, test, err)

    def addFailure(self, test, err):
        self.failures_tb.append((test, err))
        unittest.TestResult.addFailure(self, test, err)
\end{verbatim}

Tests written using \class{MyTestCase} as the base class, instead of
\class{TestCase}, will allow tools to extract additional information
from the results object.
