| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  | \section{\module{unittest} --- | 
					
						
							|  |  |  |          Unit testing framework} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \declaremodule{standard}{unittest} | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  | \modulesynopsis{Unit testing framework for Python.} | 
					
						
							| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  | \moduleauthor{Steve Purcell}{stephen\textunderscore{}purcell@yahoo.com} | 
					
						
							|  |  |  | \sectionauthor{Steve Purcell}{stephen\textunderscore{}purcell@yahoo.com} | 
					
						
							|  |  |  | \sectionauthor{Fred L. Drake, Jr.}{fdrake@acm.org} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  | To achieve this, PyUnit supports some important concepts: | 
					
						
							| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \begin{definitions} | 
					
						
							| 
									
										
										
										
											2001-04-10 22:25:06 +00:00
										 |  |  | \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. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  | \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} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  | 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 later 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. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \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{Organizing test code | 
					
						
							|  |  |  |             \label{organizing-tests}} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-12 04:50:06 +00:00
										 |  |  | 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") | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  |         self.failUnless(widget.size() == (50,50), 'incorrect default size') | 
					
						
							| 
									
										
										
										
											2001-04-12 04:50:06 +00:00
										 |  |  | \end{verbatim} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  | 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}. | 
					
						
							| 
									
										
										
										
											2001-04-12 04:50:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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): | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  |         self.failUnless(self.widget.size() == (50,50), | 
					
						
							|  |  |  |                         'incorrect default size') | 
					
						
							| 
									
										
										
										
											2001-04-12 04:50:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class WidgetResizeTestCase(SimpleWidgetTestCase): | 
					
						
							|  |  |  |     def runTest(self): | 
					
						
							|  |  |  |         self.widget.resize(100,150) | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  |         self.failUnless(self.widget.size() == (100,150), | 
					
						
							|  |  |  |                         'wrong size after resize') | 
					
						
							| 
									
										
										
										
											2001-04-12 04:50:06 +00:00
										 |  |  | \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): | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  |         self.failUnless(self.widget.size() == (50,50), | 
					
						
							|  |  |  |                         'incorrect default size') | 
					
						
							| 
									
										
										
										
											2001-04-12 04:50:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def testResize(self): | 
					
						
							|  |  |  |         self.widget.resize(100,150) | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  |         self.failUnless(self.widget.size() == (100,150), | 
					
						
							|  |  |  |                         'wrong size after resize') | 
					
						
							| 
									
										
										
										
											2001-04-12 04:50:06 +00:00
										 |  |  | \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 (e.g.\ \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} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \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} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-20 04:24:09 +00:00
										 |  |  | \note{PyUnit supports the use of \exception{AssertionError} | 
					
						
							| 
									
										
										
										
											2001-04-12 04:50:06 +00:00
										 |  |  | as an indicator of test failure, but does not recommend it.  Future | 
					
						
							| 
									
										
										
										
											2001-10-20 04:24:09 +00:00
										 |  |  | versions may treat \exception{AssertionError} differently.} | 
					
						
							| 
									
										
										
										
											2001-04-12 04:50:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  | \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{, | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  |                   setUp\optional{, tearDown\optional{, description}}}} | 
					
						
							| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  |   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} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-10 22:25:06 +00:00
										 |  |  | \begin{classdesc}{TestSuite}{\optional{tests}} | 
					
						
							| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  |   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 | 
					
						
							| 
									
										
										
										
											2001-04-10 22:25:06 +00:00
										 |  |  |   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. | 
					
						
							| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  | \end{classdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{classdesc}{TestLoader}{} | 
					
						
							| 
									
										
										
										
											2001-04-10 22:25:06 +00:00
										 |  |  |   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}. | 
					
						
							| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  | \end{classdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  | \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} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  | \begin{classdesc}{TextTestRunner}{\optional{stream\optional{, | 
					
						
							|  |  |  |                   descriptions\optional{, verbosity}}}} | 
					
						
							| 
									
										
										
										
											2001-04-10 22:25:06 +00:00
										 |  |  |   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. | 
					
						
							| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  | \end{classdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{funcdesc}{main}{\optional{module\optional{, | 
					
						
							|  |  |  |                  defaultTest\optional{, argv\optional{, | 
					
						
							|  |  |  |                  testRunner\optional{, testRunner}}}}}} | 
					
						
							| 
									
										
										
										
											2001-04-12 04:50:06 +00:00
										 |  |  |   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: | 
					
						
							| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \begin{verbatim} | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     unittest.main() | 
					
						
							|  |  |  | \end{verbatim} | 
					
						
							|  |  |  | \end{funcdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \subsection{TestCase Objects | 
					
						
							|  |  |  |             \label{testcase-objects}} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-10 22:25:06 +00:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  |   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. | 
					
						
							| 
									
										
										
										
											2001-04-10 22:25:06 +00:00
										 |  |  | \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} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-12 04:50:06 +00:00
										 |  |  | The test code can use any of the following methods to check for and | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  | 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}. | 
					
						
							| 
									
										
										
										
											2001-04-10 22:25:06 +00:00
										 |  |  | \end{methoddesc} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  | \begin{methoddesc}[TestCase]{assertEqual}{first, second\optional{, msg}} | 
					
						
							|  |  |  | \methodline{failUnlessEqual}{first, second\optional{, msg}} | 
					
						
							| 
									
										
										
										
											2001-04-10 22:25:06 +00:00
										 |  |  |   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 | 
					
						
							| 
									
										
										
										
											2001-04-12 04:50:06 +00:00
										 |  |  |   \var{msg}, or \code{None}.  Note that using \method{failUnlessEqual()} | 
					
						
							| 
									
										
										
										
											2001-04-10 22:25:06 +00:00
										 |  |  |   improves upon doing the comparison as the first parameter to | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  |   \method{failUnless()}:  the default value for \var{msg} can be | 
					
						
							| 
									
										
										
										
											2001-04-10 22:25:06 +00:00
										 |  |  |   computed to include representations of both \var{first} and | 
					
						
							|  |  |  |   \var{second}. | 
					
						
							|  |  |  | \end{methoddesc} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  | \begin{methoddesc}[TestCase]{assertNotEqual}{first, second\optional{, msg}} | 
					
						
							|  |  |  | \methodline{failIfEqual}{first, second\optional{, msg}} | 
					
						
							| 
									
										
										
										
											2001-04-10 22:25:06 +00:00
										 |  |  |   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 | 
					
						
							| 
									
										
										
										
											2001-04-12 04:50:06 +00:00
										 |  |  |   \var{msg}, or \code{None}.  Note that using \method{failIfEqual()} | 
					
						
							| 
									
										
										
										
											2001-04-10 22:25:06 +00:00
										 |  |  |   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} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  | \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} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-10 22:25:06 +00:00
										 |  |  | \begin{methoddesc}[TestCase]{failIf}{expr\optional{, msg}} | 
					
						
							| 
									
										
										
										
											2001-04-12 04:50:06 +00:00
										 |  |  |   The inverse of the \method{failUnless()} method is the | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  |   \method{failIf()} method.  This signals a test failure if \var{expr} | 
					
						
							|  |  |  |   is true, with \var{msg} or \code{None} for the error message. | 
					
						
							| 
									
										
										
										
											2001-04-10 22:25:06 +00:00
										 |  |  | \end{methoddesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{methoddesc}[TestCase]{fail}{\optional{msg}} | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  |   Signals a test failure unconditionally, with \var{msg} or | 
					
						
							|  |  |  |   \code{None} for the error message. | 
					
						
							| 
									
										
										
										
											2001-04-10 22:25:06 +00:00
										 |  |  | \end{methoddesc} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  | \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} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-10 22:25:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \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} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-09-06 15:51:56 +00:00
										 |  |  | 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. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \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}, | 
					
						
							| 
									
										
										
										
											2002-07-02 22:34:44 +00:00
										 |  |  | \var{traceback})}, where \var{traceback} is a string containing a | 
					
						
							|  |  |  | formatted version of the traceback for the exception. | 
					
						
							| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \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 | 
					
						
							| 
									
										
										
										
											2002-07-02 22:34:44 +00:00
										 |  |  |   formatted tracebacks for tests which raised an exception but did not | 
					
						
							|  |  |  |   signal a test failure. | 
					
						
							| 
									
										
										
										
											2002-07-02 22:46:42 +00:00
										 |  |  |   \versionchanged[Contains formatted tracebacks instead of | 
					
						
							|  |  |  |                   \function{sys.exc_info()} results]{2.2} | 
					
						
							| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  | \end{memberdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{memberdesc}[TestResult]{failures} | 
					
						
							|  |  |  |   A list containing pairs of \class{TestCase} instances and the | 
					
						
							| 
									
										
										
										
											2002-07-02 22:34:44 +00:00
										 |  |  |   formatted tracebacks for tests which signalled a failure in the code | 
					
						
							|  |  |  |   under test. | 
					
						
							| 
									
										
										
										
											2002-07-02 22:46:42 +00:00
										 |  |  |   \versionchanged[Contains formatted tracebacks instead of | 
					
						
							|  |  |  |                   \function{sys.exc_info()} results]{2.2} | 
					
						
							| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  | \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 mmay be extended in | 
					
						
							|  |  |  | subclasses to support additional reporting requirements.  This is | 
					
						
							| 
									
										
										
										
											2001-07-14 02:50:55 +00:00
										 |  |  | particularly useful in building tools which support interactive | 
					
						
							| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  | 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} | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  |   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})}. | 
					
						
							| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  | \end{methoddesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{methoddesc}[TestResult]{addFailure}{test, err} | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  |   Called when the test case \var{test} signals a failure. | 
					
						
							| 
									
										
										
										
											2001-04-12 04:50:06 +00:00
										 |  |  |   \var{err} is a tuple of the form returned by | 
					
						
							|  |  |  |   \function{sys.exc_info()}:  \code{(\var{type}, \var{value}, | 
					
						
							|  |  |  |   \var{traceback})}. | 
					
						
							| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  | \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 | 
					
						
							| 
									
										
										
										
											2001-07-14 02:50:55 +00:00
										 |  |  |   the keyboard.  Interactive tools which provide runners can use this | 
					
						
							|  |  |  |   in a similar manner. | 
					
						
							| 
									
										
										
										
											2001-04-07 05:41:39 +00:00
										 |  |  | \end{methoddesc} | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \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. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-20 04:24:09 +00:00
										 |  |  |   \warning{While using a hierarchy of | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  |   \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 | 
					
						
							| 
									
										
										
										
											2001-10-20 04:24:09 +00:00
										 |  |  |   fixtures are different and defined in subclasses.} | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  | \end{methoddesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{methoddesc}[TestLoader]{loadTestsFromName}{name\optional{, module}} | 
					
						
							|  |  |  |   Return a suite of all tests cases given a string specifier. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-09-06 15:51:56 +00:00
										 |  |  |   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. | 
					
						
							| 
									
										
										
										
											2001-04-12 19:34:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   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} | 
					
						
							| 
									
										
										
										
											2002-07-02 22:34:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \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. |