diff options
author | Fred Drake <fdrake@acm.org> | 2001-04-07 05:41:39 (GMT) |
---|---|---|
committer | Fred Drake <fdrake@acm.org> | 2001-04-07 05:41:39 (GMT) |
commit | b9ad2287987c570d711f043100e438b146e00351 (patch) | |
tree | 073e9d37ca21ca460c3f38dc5202c46dd34f6c0b /Doc/lib/libunittest.tex | |
parent | eb26f9590691b502db69e26ff441abec7fbd4d47 (diff) | |
download | cpython-b9ad2287987c570d711f043100e438b146e00351.zip cpython-b9ad2287987c570d711f043100e438b146e00351.tar.gz cpython-b9ad2287987c570d711f043100e438b146e00351.tar.bz2 |
Start of documentation for the unittest module. Some of this comes from
Steve Purcell's documentation, and a lot of it is written based on
using PyUnit and reading the implementation.
There is more to come, but I want to get this check in before I have a
disk crash or anything else bad happens.
Diffstat (limited to 'Doc/lib/libunittest.tex')
-rw-r--r-- | Doc/lib/libunittest.tex | 266 |
1 files changed, 266 insertions, 0 deletions
diff --git a/Doc/lib/libunittest.tex b/Doc/lib/libunittest.tex new file mode 100644 index 0000000..15787da --- /dev/null +++ b/Doc/lib/libunittest.tex @@ -0,0 +1,266 @@ +\section{\module{unittest} --- + Unit testing framework} + +\declaremodule{standard}{unittest} +\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. + +To achieve this, PyUnit supports three major concepts: + +\begin{definitions} +\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} + + + +\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{Mapping concepts to classes + \label{test-concept-classes}} + + +\subsection{Organizing test code + \label{organizing-tests}} + + +\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} + + +\subsection{Classes and functions + \label{unittest-contents}} + +\begin{classdesc}{TestCase}{} + Instances of the \class{TestCase} class represent the smallest + testable units in a set of tests. This class is intended to be used + as a base class, with specific tests being implemented by concrete + subclasses. This class implements the interface needed by the test + runner to allow it to drive the test, and methods that the test code + can use to check for and report various kinds of failures. +\end{classdesc} + +\begin{classdesc}{FunctionTestCase}{testFunc\optional{, + setup\optional{, tearDown\optional{, description}}}} + This class implements the portion of the \class{TestCase} interface + which allows the test runner to drive the test, but does not provide + the methods which test code can use to check and report errors. + This is used to create test cases using legacy test code, allowing + it to be integrated into a \refmodule{unittest}-based test + framework. +\end{classdesc} + +\begin{classdesc}{TestSuite}{} + This class represents an aggregation of individual tests cases and + test suites. The class presents the interface needed by the test + runner to allow it to be run as any other test case, but all the + contained tests and test suites are executed. Additional methods + are provided to add test cases and suites to the aggregation. +\end{classdesc} + +\begin{classdesc}{TestLoader}{} +\end{classdesc} + +\begin{classdesc}{TextTestRunner}{\optional{stream\optional{, + descriptions\optional{, verbosity}}}} +\end{classdesc} + +\begin{funcdesc}{main}{\optional{module\optional{, + defaultTest\optional{, argv\optional{, + testRunner\optional{, testRunner}}}}}} +A command-line program that runs a set of tests; this is primarily +for making test modules conveniently executable. The simplest use for +this function is: + +\begin{verbatim} +if __name__ == '__main__': + unittest.main() +\end{verbatim} +\end{funcdesc} + + +\subsection{TestCase Objects + \label{testcase-objects}} + + +\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} + + +\subsection{TestResult Objects + \label{testresult-objects}} + +A \class{TestResult} object stores the results of a set of tests. The +\class{TestCase} and \class{TestSuite} classes ensure that results are +properly stored; test authors do not need to worry about recording the +outcome of tests. + +Testing frameworks built on top of \refmodule{unittest} may want +access to the \class{TestResult} object generated by running a set of +tests for reporting purposes; a \class{TestResult} instance is +returned by the \method{TestRunner.run()} method for this purpose. + +Each instance holds the total number of tests run, and collections of +failures and errors that occurred among those test runs. The +collections contain tuples of \code{(\var{testcase}, +\var{exceptioninfo})}, where \var{exceptioninfo} is a tuple as +returned by \function{sys.exc_info()}. + +\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 + \function{sys.exc_info()} results for tests which raised exceptions + other than \exception{AssertionError}. +\end{memberdesc} + +\begin{memberdesc}[TestResult]{failures} + A list containing pairs of \class{TestCase} instances and the + \function{sys.exc_info()} results for tests which raised the + \exception{AssertionError} exception. +\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 +particularly useful in building GUI tools which support interactive +reporting while tests are being run. + +\begin{methoddesc}[TestResult]{startTest}{test} + Called when the test case \var{test} is about to be run. +\end{methoddesc} + +\begin{methoddesc}[TestResult]{stopTest}{test} + Called when the test case \var{test} has been executed, regardless + of the outcome. +\end{methoddesc} + +\begin{methoddesc}[TestResult]{addError}{test, err} + Called when the test case \var{test} results in an exception other + than \exception{AssertionError}. \var{err} is a tuple of the form + returned by \function{sys.exc_info()}: \code{(\var{type}, + \var{value}, \var{traceback})}. +\end{methoddesc} + +\begin{methoddesc}[TestResult]{addFailure}{test, err} + Called when the test case \var{test} results in an + \exception{AssertionError} exception; the assumption is that the + test raised the \exception{AssertionError} and not the + implementation being tested. \var{err} is a tuple of the form + returned by \function{sys.exc_info()}: \code{(\var{type}, + \var{value}, \var{traceback})}. +\end{methoddesc} + +\begin{methoddesc}[TestResult]{addSuccess}{test} + This method is called for a test that does not fail; \var{test} is + the test case object. +\end{methoddesc} + + +One additional method is available for \class{TestResult} objects: + +\begin{methoddesc}[TestResult]{stop}{} + This method can be called to signal that the set of tests being run + should be aborted. Once this has been called, the + \class{TestRunner} object return to its caller without running any + additional tests. This is used by the \class{TextTestRunner} class + to stop the test framework when the user signals an interrupt from + the keyboard. GUI tools which provide runners can use this in a + similar manner. +\end{methoddesc} |