mirror of https://github.com/python/cpython
948 lines
36 KiB
ReStructuredText
948 lines
36 KiB
ReStructuredText
|
|
:mod:`unittest` --- Unit testing framework
|
|
==========================================
|
|
|
|
.. module:: unittest
|
|
:synopsis: Unit testing framework for Python.
|
|
.. moduleauthor:: Steve Purcell <stephen_purcell@yahoo.com>
|
|
.. sectionauthor:: Steve Purcell <stephen_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, sometimes 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.
|
|
|
|
:mod:`unittest` 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 :mod:`unittest` module provides classes that make
|
|
it easy to support these qualities for a set of tests.
|
|
|
|
To achieve this, :mod:`unittest` supports some important concepts:
|
|
|
|
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.
|
|
|
|
test case
|
|
A :dfn:`test case` is the smallest unit of testing. It checks for a specific
|
|
response to a particular set of inputs. :mod:`unittest` provides a base class,
|
|
:class:`TestCase`, which may be used to create new test cases.
|
|
|
|
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.
|
|
|
|
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.
|
|
|
|
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 :mod:`unittest`\ -driven framework. When building test
|
|
fixtures using :class:`TestCase`, the :meth:`setUp` and :meth:`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, :meth:`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. :mod:`unittest` provides 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.
|
|
|
|
|
|
.. seealso::
|
|
|
|
Module :mod:`doctest`
|
|
Another test-support module with a very different flavor.
|
|
|
|
`Simple Smalltalk Testing: With Patterns <http://www.XProgramming.com/testfram.htm>`_
|
|
Kent Beck's original paper on testing frameworks using the pattern shared by
|
|
:mod:`unittest`.
|
|
|
|
`Nose <http://code.google.com/p/python-nose/>`_ and `py.test <http://pytest.org>`_
|
|
Third-party unittest frameworks with a lighter-weight syntax
|
|
for writing tests. For example, ``assert func(10) == 42``.
|
|
|
|
`python-mock <http://python-mock.sourceforge.net/>`_ and `minimock <http://blog.ianbicking.org/minimock.html>`_
|
|
Tools for creating mock test objects (objects simulating external resources).
|
|
|
|
.. _unittest-minimal-example:
|
|
|
|
Basic example
|
|
-------------
|
|
|
|
The :mod:`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 :mod:`random` module::
|
|
|
|
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.assertTrue(element in self.seq)
|
|
|
|
def testsample(self):
|
|
self.assertRaises(ValueError, random.sample, self.seq, 20)
|
|
for element in random.sample(self.seq, 5):
|
|
self.assertTrue(element in self.seq)
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|
|
|
|
A testcase is created by subclassing :class:`unittest.TestCase`. The three
|
|
individual tests are defined with methods whose names start with the letters
|
|
``test``. This naming convention informs the test runner about which methods
|
|
represent tests.
|
|
|
|
The crux of each test is a call to :meth:`assertEqual` to check for an expected
|
|
result; :meth:`assert_` to verify a condition; or :meth:`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 :meth:`setUp` method is defined, the test runner will run that method
|
|
prior to each test. Likewise, if a :meth:`tearDown` method is defined, the test
|
|
runner will invoke that method after each test. In the example, :meth:`setUp`
|
|
was used to create a fresh sequence for each test.
|
|
|
|
The final block shows a simple way to run the tests. :func:`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::
|
|
|
|
...
|
|
----------------------------------------------------------------------
|
|
Ran 3 tests in 0.000s
|
|
|
|
OK
|
|
|
|
Instead of :func:`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::
|
|
|
|
suite = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions)
|
|
unittest.TextTestRunner(verbosity=2).run(suite)
|
|
|
|
Running the revised script from the interpreter or another script produces the
|
|
following output::
|
|
|
|
testchoice (__main__.TestSequenceFunctions) ... ok
|
|
testsample (__main__.TestSequenceFunctions) ... ok
|
|
testshuffle (__main__.TestSequenceFunctions) ... ok
|
|
|
|
----------------------------------------------------------------------
|
|
Ran 3 tests in 0.110s
|
|
|
|
OK
|
|
|
|
The above examples show the most commonly used :mod:`unittest` features which
|
|
are sufficient to meet many everyday testing needs. The remainder of the
|
|
documentation explores the full feature set from first principles.
|
|
|
|
|
|
.. _organizing-tests:
|
|
|
|
Organizing test code
|
|
--------------------
|
|
|
|
The basic building blocks of unit testing are :dfn:`test cases` --- single
|
|
scenarios that must be set up and checked for correctness. In :mod:`unittest`,
|
|
test cases are represented by instances of :mod:`unittest`'s :class:`TestCase`
|
|
class. 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 :class:`TestCase` subclass will simply override the :meth:`runTest`
|
|
method in order to perform specific testing code::
|
|
|
|
import unittest
|
|
|
|
class DefaultWidgetSizeTestCase(unittest.TestCase):
|
|
def runTest(self):
|
|
widget = Widget('The widget')
|
|
self.assertEqual(widget.size(), (50, 50), 'incorrect default size')
|
|
|
|
Note that in order to test something, we use the one of the :meth:`assert\*` or
|
|
:meth:`fail\*` methods provided by the :class:`TestCase` base class. If the
|
|
test fails, an exception will be raised, and :mod:`unittest` will identify the
|
|
test case as a :dfn:`failure`. Any other exceptions will be treated as
|
|
:dfn:`errors`. This helps you identify where the problem is: :dfn:`failures` are
|
|
caused by incorrect results - a 5 where you expected a 6. :dfn:`Errors` are
|
|
caused by incorrect code - e.g., a :exc:`TypeError` caused by an incorrect
|
|
function call.
|
|
|
|
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::
|
|
|
|
testCase = DefaultWidgetSizeTestCase()
|
|
|
|
Now, such test cases can be numerous, and their set-up can be repetitive. In
|
|
the above case, constructing a :class:`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
|
|
:meth:`setUp`, which the testing framework will automatically call for us when
|
|
we run the test::
|
|
|
|
import unittest
|
|
|
|
class SimpleWidgetTestCase(unittest.TestCase):
|
|
def setUp(self):
|
|
self.widget = Widget('The widget')
|
|
|
|
class DefaultWidgetSizeTestCase(SimpleWidgetTestCase):
|
|
def runTest(self):
|
|
self.assertEqual(self.widget.size(), (50,50),
|
|
'incorrect default size')
|
|
|
|
class WidgetResizeTestCase(SimpleWidgetTestCase):
|
|
def runTest(self):
|
|
self.widget.resize(100,150)
|
|
self.assertEqual(self.widget.size(), (100,150),
|
|
'wrong size after resize')
|
|
|
|
If the :meth:`setUp` method raises an exception while the test is running, the
|
|
framework will consider the test to have suffered an error, and the
|
|
:meth:`runTest` method will not be executed.
|
|
|
|
Similarly, we can provide a :meth:`tearDown` method that tidies up after the
|
|
:meth:`runTest` method has been run::
|
|
|
|
import unittest
|
|
|
|
class SimpleWidgetTestCase(unittest.TestCase):
|
|
def setUp(self):
|
|
self.widget = Widget('The widget')
|
|
|
|
def tearDown(self):
|
|
self.widget.dispose()
|
|
self.widget = None
|
|
|
|
If :meth:`setUp` succeeded, the :meth:`tearDown` method will be run whether
|
|
:meth:`runTest` succeeded or not.
|
|
|
|
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, :mod:`unittest` provides a simpler
|
|
mechanism::
|
|
|
|
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.assertEqual(self.widget.size(), (50,50),
|
|
'incorrect default size')
|
|
|
|
def testResize(self):
|
|
self.widget.resize(100,150)
|
|
self.assertEqual(self.widget.size(), (100,150),
|
|
'wrong size after resize')
|
|
|
|
Here we have not provided a :meth:`runTest` method, but have instead provided
|
|
two different test methods. Class instances will now each run one of the
|
|
:meth:`test\*` methods, with ``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::
|
|
|
|
defaultSizeTestCase = WidgetTestCase('testDefaultSize')
|
|
resizeTestCase = WidgetTestCase('testResize')
|
|
|
|
Test case instances are grouped together according to the features they test.
|
|
:mod:`unittest` provides a mechanism for this: the :dfn:`test suite`,
|
|
represented by :mod:`unittest`'s :class:`TestSuite` class::
|
|
|
|
widgetTestSuite = unittest.TestSuite()
|
|
widgetTestSuite.addTest(WidgetTestCase('testDefaultSize'))
|
|
widgetTestSuite.addTest(WidgetTestCase('testResize'))
|
|
|
|
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::
|
|
|
|
def suite():
|
|
suite = unittest.TestSuite()
|
|
suite.addTest(WidgetTestCase('testDefaultSize'))
|
|
suite.addTest(WidgetTestCase('testResize'))
|
|
return suite
|
|
|
|
or even::
|
|
|
|
def suite():
|
|
tests = ['testDefaultSize', 'testResize']
|
|
|
|
return unittest.TestSuite(map(WidgetTestCase, tests))
|
|
|
|
Since it is a common pattern to create a :class:`TestCase` subclass with many
|
|
similarly named test functions, :mod:`unittest` provides a :class:`TestLoader`
|
|
class that can be used to automate the process of creating a test suite and
|
|
populating it with individual tests. For example, ::
|
|
|
|
suite = unittest.TestLoader().loadTestsFromTestCase(WidgetTestCase)
|
|
|
|
will create a test suite that will run ``WidgetTestCase.testDefaultSize()`` and
|
|
``WidgetTestCase.testResize``. :class:`TestLoader` uses the ``'test'`` method
|
|
name prefix to identify test methods automatically.
|
|
|
|
Note that the order in which the various test cases will be run is determined by
|
|
sorting the test function names with the built-in :func:`cmp` 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`::
|
|
|
|
suite1 = module1.TheTestSuite()
|
|
suite2 = module2.TheTestSuite()
|
|
alltests = unittest.TestSuite([suite1, suite2])
|
|
|
|
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:`test_widget.py`:
|
|
|
|
* The test module can be run standalone from the command line.
|
|
|
|
* The test code can more easily be separated from shipped code.
|
|
|
|
* There is less temptation to change test code to fit the code it tests without
|
|
a good reason.
|
|
|
|
* Test code should be modified much less frequently than the code it tests.
|
|
|
|
* Tested code can be refactored more easily.
|
|
|
|
* Tests for modules written in C must be in separate modules anyway, so why not
|
|
be consistent?
|
|
|
|
* If the testing strategy changes, there is no need to change the source code.
|
|
|
|
|
|
.. _legacy-unit-tests:
|
|
|
|
Re-using old test code
|
|
----------------------
|
|
|
|
Some users will find that they have existing test code that they would like to
|
|
run from :mod:`unittest`, without converting every old test function to a
|
|
:class:`TestCase` subclass.
|
|
|
|
For this reason, :mod:`unittest` 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 be provided.
|
|
|
|
Given the following test function::
|
|
|
|
def testSomething():
|
|
something = makeSomething()
|
|
assert something.name is not None
|
|
# ...
|
|
|
|
one can create an equivalent test case instance as follows::
|
|
|
|
testcase = unittest.FunctionTestCase(testSomething)
|
|
|
|
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 like so::
|
|
|
|
testcase = unittest.FunctionTestCase(testSomething,
|
|
setUp=makeSomethingDB,
|
|
tearDown=deleteSomethingDB)
|
|
|
|
To make migrating existing test suites easier, :mod:`unittest` supports tests
|
|
raising :exc:`AssertionError` to indicate test failure. However, it is
|
|
recommended that you use the explicit :meth:`TestCase.fail\*` and
|
|
:meth:`TestCase.assert\*` methods instead, as future versions of :mod:`unittest`
|
|
may treat :exc:`AssertionError` differently.
|
|
|
|
.. note::
|
|
|
|
Even though :class:`FunctionTestCase` can be used to quickly convert an existing
|
|
test base over to a :mod:`unittest`\ -based system, this approach is not
|
|
recommended. Taking the time to set up proper :class:`TestCase` subclasses will
|
|
make future test refactorings infinitely easier.
|
|
|
|
|
|
.. _unittest-contents:
|
|
|
|
Classes and functions
|
|
---------------------
|
|
|
|
|
|
.. class:: TestCase([methodName])
|
|
|
|
Instances of the :class:`TestCase` class represent the smallest testable units
|
|
in the :mod:`unittest` universe. 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 failure.
|
|
|
|
Each instance of :class:`TestCase` will run a single test method: the method
|
|
named *methodName*. If you remember, we had an earlier example that went
|
|
something like this::
|
|
|
|
def suite():
|
|
suite = unittest.TestSuite()
|
|
suite.addTest(WidgetTestCase('testDefaultSize'))
|
|
suite.addTest(WidgetTestCase('testResize'))
|
|
return suite
|
|
|
|
Here, we create two instances of :class:`WidgetTestCase`, each of which runs a
|
|
single test.
|
|
|
|
*methodName* defaults to ``'runTest'``.
|
|
|
|
|
|
.. class:: FunctionTestCase(testFunc[, setUp[, tearDown[, 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 :mod:`unittest`\
|
|
-based test framework.
|
|
|
|
|
|
.. class:: TestSuite([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. Running a :class:`TestSuite` instance is the same as
|
|
iterating over the suite, running each test individually.
|
|
|
|
If *tests* is given, it must be an iterable of individual test cases or other
|
|
test suites that will be used to build the suite initially. Additional methods
|
|
are provided to add test cases and suites to the collection later on.
|
|
|
|
|
|
.. class:: 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` subclass.
|
|
|
|
|
|
.. class:: TestResult()
|
|
|
|
This class is used to compile information about which tests have succeeded and
|
|
which have failed.
|
|
|
|
|
|
.. data:: defaultTestLoader
|
|
|
|
Instance of the :class:`TestLoader` class intended to be shared. If no
|
|
customization of the :class:`TestLoader` is needed, this instance can be used
|
|
instead of repeatedly creating new instances.
|
|
|
|
|
|
.. class:: TextTestRunner([stream[, descriptions[, verbosity]]])
|
|
|
|
A basic test runner implementation which prints results on standard error. It
|
|
has a few configurable parameters, but is essentially very simple. Graphical
|
|
applications which run test suites should provide alternate implementations.
|
|
|
|
|
|
.. function:: main([module[, defaultTest[, argv[, testRunner[, testLoader]]]]])
|
|
|
|
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 to
|
|
include the following line at the end of a test script::
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|
|
|
|
The *testRunner* argument can either be a test runner class or an already
|
|
created instance of it.
|
|
|
|
In some cases, the existing tests may have been written using the :mod:`doctest`
|
|
module. If so, that module provides a :class:`DocTestSuite` class that can
|
|
automatically build :class:`unittest.TestSuite` instances from the existing
|
|
:mod:`doctest`\ -based tests.
|
|
|
|
.. versionadded:: 2.3
|
|
|
|
|
|
.. _testcase-objects:
|
|
|
|
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 (running the test) are:
|
|
|
|
|
|
.. method:: 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.
|
|
|
|
|
|
.. method:: 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
|
|
:meth:`setUp` succeeds, regardless of the outcome of the test method. The
|
|
default implementation does nothing.
|
|
|
|
|
|
.. method:: TestCase.run([result])
|
|
|
|
Run the test, collecting the result into the test result object passed as
|
|
*result*. If *result* is omitted or :const:`None`, a temporary result object is
|
|
created (by calling the :meth:`defaultTestCase` method) and used; this result
|
|
object is not returned to :meth:`run`'s caller.
|
|
|
|
The same effect may be had by simply calling the :class:`TestCase` instance.
|
|
|
|
|
|
.. method:: 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.
|
|
|
|
The test code can use any of the following methods to check for and report
|
|
failures.
|
|
|
|
|
|
.. method:: TestCase.assert_(expr[, msg])
|
|
TestCase.failUnless(expr[, msg])
|
|
TestCase.assertTrue(expr[, msg])
|
|
|
|
Signal a test failure if *expr* is false; the explanation for the error will be
|
|
*msg* if given, otherwise it will be :const:`None`.
|
|
|
|
|
|
.. method:: TestCase.assertEqual(first, second[, msg])
|
|
TestCase.failUnlessEqual(first, second[, msg])
|
|
|
|
Test that *first* and *second* are equal. If the values do not compare equal,
|
|
the test will fail with the explanation given by *msg*, or :const:`None`. Note
|
|
that using :meth:`failUnlessEqual` improves upon doing the comparison as the
|
|
first parameter to :meth:`failUnless`: the default value for *msg* can be
|
|
computed to include representations of both *first* and *second*.
|
|
|
|
|
|
.. method:: TestCase.assertNotEqual(first, second[, msg])
|
|
TestCase.failIfEqual(first, second[, msg])
|
|
|
|
Test that *first* and *second* are not equal. If the values do compare equal,
|
|
the test will fail with the explanation given by *msg*, or :const:`None`. Note
|
|
that using :meth:`failIfEqual` improves upon doing the comparison as the first
|
|
parameter to :meth:`failUnless` is that the default value for *msg* can be
|
|
computed to include representations of both *first* and *second*.
|
|
|
|
|
|
.. method:: TestCase.assertAlmostEqual(first, second[, places[, msg]])
|
|
TestCase.failUnlessAlmostEqual(first, second[, places[, msg]])
|
|
|
|
Test that *first* and *second* are approximately equal by computing the
|
|
difference, rounding to the given number of decimal *places* (default 7),
|
|
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 *msg*, or :const:`None`.
|
|
|
|
|
|
.. method:: TestCase.assertNotAlmostEqual(first, second[, places[, msg]])
|
|
TestCase.failIfAlmostEqual(first, second[, places[, msg]])
|
|
|
|
Test that *first* and *second* are not approximately equal by computing the
|
|
difference, rounding to the given number of decimal *places* (default 7),
|
|
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 *msg*, or :const:`None`.
|
|
|
|
|
|
.. method:: TestCase.assertRaises(exception, callable, ...)
|
|
TestCase.failUnlessRaises(exception, callable, ...)
|
|
|
|
Test that an exception is raised when *callable* is called with any positional
|
|
or keyword arguments that are also passed to :meth:`assertRaises`. The test
|
|
passes if *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 *exception*.
|
|
|
|
|
|
.. method:: TestCase.failIf(expr[, msg])
|
|
TestCase.assertFalse(expr[, msg])
|
|
|
|
The inverse of the :meth:`failUnless` method is the :meth:`failIf` method. This
|
|
signals a test failure if *expr* is true, with *msg* or :const:`None` for the
|
|
error message.
|
|
|
|
|
|
.. method:: TestCase.fail([msg])
|
|
|
|
Signals a test failure unconditionally, with *msg* or :const:`None` for the
|
|
error message.
|
|
|
|
|
|
.. attribute:: TestCase.failureException
|
|
|
|
This class attribute gives the exception raised by the :meth:`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
|
|
:exc:`AssertionError`.
|
|
|
|
Testing frameworks can use the following methods to collect information on the
|
|
test:
|
|
|
|
|
|
.. method:: TestCase.countTestCases()
|
|
|
|
Return the number of tests represented by this test object. For
|
|
:class:`TestCase` instances, this will always be ``1``.
|
|
|
|
|
|
.. method:: TestCase.defaultTestResult()
|
|
|
|
Return an instance of the test result class that should be used for this test
|
|
case class (if no other result instance is provided to the :meth:`run` method).
|
|
|
|
For :class:`TestCase` instances, this will always be an instance of
|
|
:class:`TestResult`; subclasses of :class:`TestCase` should override this as
|
|
necessary.
|
|
|
|
|
|
.. method:: 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 name.
|
|
|
|
|
|
.. method:: TestCase.shortDescription()
|
|
|
|
Returns a one-line description of the test, or :const:`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 :const:`None`.
|
|
|
|
|
|
.. _testsuite-objects:
|
|
|
|
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 of tests that should be run together. Some additional methods
|
|
are available to add tests to :class:`TestSuite` instances:
|
|
|
|
|
|
.. method:: TestSuite.addTest(test)
|
|
|
|
Add a :class:`TestCase` or :class:`TestSuite` to the suite.
|
|
|
|
|
|
.. method:: TestSuite.addTests(tests)
|
|
|
|
Add all the tests from an iterable of :class:`TestCase` and :class:`TestSuite`
|
|
instances to this test suite.
|
|
|
|
This is equivalent to iterating over *tests*, calling :meth:`addTest` for each
|
|
element.
|
|
|
|
:class:`TestSuite` shares the following methods with :class:`TestCase`:
|
|
|
|
|
|
.. method:: TestSuite.run(result)
|
|
|
|
Run the tests associated with this suite, collecting the result into the test
|
|
result object passed as *result*. Note that unlike :meth:`TestCase.run`,
|
|
:meth:`TestSuite.run` requires the result object to be passed in.
|
|
|
|
|
|
.. method:: TestSuite.debug()
|
|
|
|
Run the tests associated with this suite 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.
|
|
|
|
|
|
.. method:: TestSuite.countTestCases()
|
|
|
|
Return the number of tests represented by this test object, including all
|
|
individual tests and sub-suites.
|
|
|
|
In the typical usage of a :class:`TestSuite` object, the :meth:`run` method is
|
|
invoked by a :class:`TestRunner` rather than by the end-user test harness.
|
|
|
|
|
|
.. _testresult-objects:
|
|
|
|
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 recorded; test authors do not need to worry about recording the outcome
|
|
of tests.
|
|
|
|
Testing frameworks built on top of :mod:`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
|
|
:meth:`TestRunner.run` method for this purpose.
|
|
|
|
:class:`TestResult` instances have the following attributes that will be of
|
|
interest when inspecting the results of running a set of tests:
|
|
|
|
|
|
.. attribute:: TestResult.errors
|
|
|
|
A list containing 2-tuples of :class:`TestCase` instances and strings holding
|
|
formatted tracebacks. Each tuple represents a test which raised an unexpected
|
|
exception.
|
|
|
|
.. versionchanged:: 2.2
|
|
Contains formatted tracebacks instead of :func:`sys.exc_info` results.
|
|
|
|
|
|
.. attribute:: TestResult.failures
|
|
|
|
A list containing 2-tuples of :class:`TestCase` instances and strings holding
|
|
formatted tracebacks. Each tuple represents a test where a failure was
|
|
explicitly signalled using the :meth:`TestCase.fail\*` or
|
|
:meth:`TestCase.assert\*` methods.
|
|
|
|
.. versionchanged:: 2.2
|
|
Contains formatted tracebacks instead of :func:`sys.exc_info` results.
|
|
|
|
|
|
.. attribute:: TestResult.testsRun
|
|
|
|
The total number of tests run so far.
|
|
|
|
|
|
.. method:: TestResult.wasSuccessful()
|
|
|
|
Returns :const:`True` if all tests run so far have passed, otherwise returns
|
|
:const:`False`.
|
|
|
|
|
|
.. method:: TestResult.stop()
|
|
|
|
This method can be called to signal that the set of tests being run should be
|
|
aborted by setting the :class:`TestResult`'s ``shouldStop`` attribute to
|
|
:const:`True`. :class:`TestRunner` objects should respect this flag and return
|
|
without running any additional tests.
|
|
|
|
For example, this feature 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 :class:`TestRunner` implementations can use this
|
|
in a similar manner.
|
|
|
|
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.
|
|
|
|
|
|
.. method:: TestResult.startTest(test)
|
|
|
|
Called when the test case *test* is about to be run.
|
|
|
|
The default implementation simply increments the instance's ``testsRun``
|
|
counter.
|
|
|
|
|
|
.. method:: TestResult.stopTest(test)
|
|
|
|
Called after the test case *test* has been executed, regardless of the outcome.
|
|
|
|
The default implementation does nothing.
|
|
|
|
|
|
.. method:: TestResult.addError(test, err)
|
|
|
|
Called when the test case *test* raises an unexpected exception *err* is a tuple
|
|
of the form returned by :func:`sys.exc_info`: ``(type, value, traceback)``.
|
|
|
|
The default implementation appends a tuple ``(test, formatted_err)`` to the
|
|
instance's ``errors`` attribute, where *formatted_err* is a formatted
|
|
traceback derived from *err*.
|
|
|
|
|
|
.. method:: TestResult.addFailure(test, err)
|
|
|
|
Called when the test case *test* signals a failure. *err* is a tuple of the form
|
|
returned by :func:`sys.exc_info`: ``(type, value, traceback)``.
|
|
|
|
The default implementation appends a tuple ``(test, formatted_err)`` to the
|
|
instance's ``failures`` attribute, where *formatted_err* is a formatted
|
|
traceback derived from *err*.
|
|
|
|
|
|
.. method:: TestResult.addSuccess(test)
|
|
|
|
Called when the test case *test* succeeds.
|
|
|
|
The default implementation does nothing.
|
|
|
|
|
|
.. _testloader-objects:
|
|
|
|
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
|
|
:mod:`unittest` module provides an instance that can be shared as
|
|
``unittest.defaultTestLoader``. Using a subclass or instance, however, allows
|
|
customization of some configurable properties.
|
|
|
|
:class:`TestLoader` objects have the following methods:
|
|
|
|
|
|
.. method:: TestLoader.loadTestsFromTestCase(testCaseClass)
|
|
|
|
Return a suite of all tests cases contained in the :class:`TestCase`\ -derived
|
|
:class:`testCaseClass`.
|
|
|
|
|
|
.. method:: TestLoader.loadTestsFromModule(module)
|
|
|
|
Return a suite of all tests cases contained in the given module. This method
|
|
searches *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.
|
|
|
|
|
|
.. method:: TestLoader.loadTestsFromName(name[, module])
|
|
|
|
Return a suite of all tests cases given a string specifier.
|
|
|
|
The specifier *name* is a "dotted name" that may resolve either to a module, a
|
|
test case class, a test method within a test case class, a :class:`TestSuite`
|
|
instance, or a callable object which returns a :class:`TestCase` or
|
|
:class:`TestSuite` instance. These checks are applied in the order listed here;
|
|
that is, a method on a possible test case class will be picked up as "a test
|
|
method within a test case class", rather than "a callable object".
|
|
|
|
For example, if you have a module :mod:`SampleTests` containing a
|
|
:class:`TestCase`\ -derived class :class:`SampleTestCase` with three test
|
|
methods (:meth:`test_one`, :meth:`test_two`, and :meth:`test_three`), the
|
|
specifier ``'SampleTests.SampleTestCase'`` would cause this method to return a
|
|
suite which will run all three test methods. Using the specifier
|
|
``'SampleTests.SampleTestCase.test_two'`` would cause it to return a test suite
|
|
which will run only the :meth:`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 *name* relative to the given *module*.
|
|
|
|
|
|
.. method:: TestLoader.loadTestsFromNames(names[, module])
|
|
|
|
Similar to :meth:`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.
|
|
|
|
|
|
.. method:: TestLoader.getTestCaseNames(testCaseClass)
|
|
|
|
Return a sorted sequence of method names found within *testCaseClass*; this
|
|
should be a subclass of :class:`TestCase`.
|
|
|
|
The following attributes of a :class:`TestLoader` can be configured either by
|
|
subclassing or assignment on an instance:
|
|
|
|
|
|
.. attribute:: TestLoader.testMethodPrefix
|
|
|
|
String giving the prefix of method names which will be interpreted as test
|
|
methods. The default value is ``'test'``.
|
|
|
|
This affects :meth:`getTestCaseNames` and all the :meth:`loadTestsFrom\*`
|
|
methods.
|
|
|
|
|
|
.. attribute:: TestLoader.sortTestMethodsUsing
|
|
|
|
Function to be used to compare method names when sorting them in
|
|
:meth:`getTestCaseNames` and all the :meth:`loadTestsFrom\*` methods. The
|
|
default value is the built-in :func:`cmp` function; the attribute can also be
|
|
set to :const:`None` to disable the sort.
|
|
|
|
|
|
.. attribute:: 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.
|
|
|
|
This affects all the :meth:`loadTestsFrom\*` methods.
|
|
|