The
unittest
module was greatly enhanced; many new features were added. Most of these features were implemented by Michael Foord, unless otherwise noted. The enhanced version of the module is downloadable separately for use with Python versions 2.4 to 2.6, packaged as the unittest2
package, from https://pypi.org/project/unittest2.
When used from the command line, the module can automatically discover tests. It’s not as fancy as py.test or nose, but provides a simple way to run tests kept within a set of package directories. For example, the following command will search the
test/
subdirectory for any importable test files named test*.py
:
The
main()
function supports some other new options:-b
or--buffer
will buffer the standard output and standard error streams during each test. If the test passes, any resulting output will be discarded; on failure, the buffered output will be displayed.-c
or--catch
will cause the control-C interrupt to be handled more gracefully. Instead of interrupting the test process immediately, the currently running test will be completed and then the partial results up to the interruption will be reported. If you’re impatient, a second press of control-C will cause an immediate interruption.This control-C handler tries to avoid causing problems when the code being tested or the tests being run have defined a signal handler of their own, by noticing that a signal handler was already set and calling it. If this doesn’t work for you, there’s aremoveHandler()
decorator that can be used to mark tests that should have the control-C handling disabled.
The progress messages now show ‘x’ for expected failures and ‘u’ for unexpected successes when run in verbose mode. (Contributed by Benjamin Peterson.)
Test cases can raise the
SkipTest
exception to skip a test (bpo-1034053).
The error messages for
assertEqual()
, assertTrue()
, and assertFalse()
failures now provide more information. If you set the longMessage
attribute of your TestCase
classes to true, both the standard error message and any additional message you provide will be printed for failures. (Added by Michael Foord; bpo-5663.)
The
assertRaises()
method now returns a context handler when called without providing a callable object to run. For example, you can write this:
(Implemented by Antoine Pitrou; bpo-4444.)
Module- and class-level setup and teardown fixtures are now supported. Modules can contain
setUpModule()
and tearDownModule()
functions. Classes can have setUpClass()
and tearDownClass()
methods that must be defined as class methods (using @classmethod
or equivalent). These functions and methods are invoked when the test runner switches to a test case in a different module or class.
The methods
addCleanup()
and doCleanups()
were added. addCleanup()
lets you add cleanup functions that will be called unconditionally (after setUp()
ifsetUp()
fails, otherwise after tearDown()
). This allows for much simpler resource allocation and deallocation during tests (bpo-5679).
A number of new methods were added that provide more specialized tests. Many of these methods were written by Google engineers for use in their test suites; Gregory P. Smith, Michael Foord, and GvR worked on merging them into Python’s version of
unittest
.assertIsNone()
andassertIsNotNone()
take one expression and verify that the result is or is notNone
.assertIs()
andassertIsNot()
take two values and check whether the two values evaluate to the same object or not. (Added by Michael Foord; bpo-2578.)assertIsInstance()
andassertNotIsInstance()
check whether the resulting object is an instance of a particular class, or of one of a tuple of classes. (Added by Georg Brandl; bpo-7031.)assertGreater()
,assertGreaterEqual()
,assertLess()
, andassertLessEqual()
compare two quantities.assertMultiLineEqual()
compares two strings, and if they’re not equal, displays a helpful comparison that highlights the differences in the two strings. This comparison is now used by default when Unicode strings are compared withassertEqual()
.assertRegexpMatches()
andassertNotRegexpMatches()
checks whether the first argument is a string matching or not matching the regular expression provided as the second argument (bpo-8038).assertRaisesRegexp()
checks whether a particular exception is raised, and then also checks that the string representation of the exception matches the provided regular expression.assertIn()
andassertNotIn()
tests whether first is or is not in second.assertItemsEqual()
tests whether two provided sequences contain the same elements.assertSetEqual()
compares whether two sets are equal, and only reports the differences between the sets in case of error.- Similarly,
assertListEqual()
andassertTupleEqual()
compare the specified types and explain any differences without necessarily printing their full values; these methods are now used by default when comparing lists and tuples usingassertEqual()
. More generally,assertSequenceEqual()
compares two sequences and can optionally check whether both sequences are of a particular type. assertDictEqual()
compares two dictionaries and reports the differences; it’s now used by default when you compare two dictionaries usingassertEqual()
.assertDictContainsSubset()
checks whether all of the key/value pairs in first are found in second.assertAlmostEqual()
andassertNotAlmostEqual()
test whether first and second are approximately equal. This method can either round their difference to an optionally-specified number of places (the default is 7) and compare it to zero, or require the difference to be smaller than a supplied deltavalue.loadTestsFromName()
properly honors thesuiteClass
attribute of theTestLoader
. (Fixed by Mark Roddy; bpo-6866.)- A new hook lets you extend the
assertEqual()
method to handle new data types. TheaddTypeEqualityFunc()
method takes a type object and a function. The function will be used when both of the objects being compared are of the specified type. This function should compare the two objects and raise an exception if they don’t match; it’s a good idea for the function to provide additional information about why the two objects aren’t matching, much as the new sequence comparison methods do.
unittest.main()
now takes an optional exit
argument. If false, main()
doesn’t call sys.exit()
, allowing main()
to be used from the interactive interpreter. (Contributed by J. Pablo Fernández; bpo-3379.)TestResult
has new startTestRun()
and stopTestRun()
methods that are called immediately before and after a test run. (Contributed by Robert Collins; bpo-5728.)
With all these changes, the
unittest.py
was becoming awkwardly large, so the module was turned into a package and the code split into several files (by Benjamin Peterson). This doesn’t affect how the module is imported or used.
See also
- http://www.voidspace.org.uk/python/articles/unittest2.shtml
- Describes the new features, how to use them, and the rationale for various design decisions. (By Michael Foord.)
No comments:
Post a Comment