From 29be70195a38e0fb61dd773c12de28ed04b9fd98 Mon Sep 17 00:00:00 2001
From: Fred Drake <fdrake@acm.org>
Date: Tue, 10 Apr 2001 22:25:06 +0000
Subject: Added definition of "test fixture".

Added description of optional parameter to the TestSuite constructor.

Added descriptions of the TestLoader and TextTestRunner classes.

Added method descriptions for the TestCase class.
---
 Doc/lib/libunittest.tex | 144 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 142 insertions(+), 2 deletions(-)

diff --git a/Doc/lib/libunittest.tex b/Doc/lib/libunittest.tex
index 15787da..b34bfb2 100644
--- a/Doc/lib/libunittest.tex
+++ b/Doc/lib/libunittest.tex
@@ -22,6 +22,12 @@ set of tests.
 To achieve this, PyUnit supports three major concepts:
 
 \begin{definitions}
+\term{test fixture}
+A \dfn{test fixture} represents the preparation needed to perform one
+or more tests, and any associate cleanup actions.  This may involve,
+for example, creating temporary or proxy databases, directories, or
+starting a server process.
+
 \term{test case}
 A \dfn{test case} is the smallest unit of testing.  It checks for a
 specific response to a particular set of inputs.  PyUnit provides a
@@ -119,19 +125,32 @@ testcase = unittest.FunctionTestCase(testSomething,
   framework.
 \end{classdesc}
 
-\begin{classdesc}{TestSuite}{}
+\begin{classdesc}{TestSuite}{\optional{tests}}
   This class represents an aggregation of individual tests cases and
   test suites.  The class presents the interface needed by the test
   runner to allow it to be run as any other test case, but all the
   contained tests and test suites are executed.  Additional methods
-  are provided to add test cases and suites to the aggregation.
+  are provided to add test cases and suites to the aggregation.  If
+  \var{tests} is given, it must be a sequence of individual tests that
+  will be added to the suite.
 \end{classdesc}
 
 \begin{classdesc}{TestLoader}{}
+  This class is responsible for loading tests according to various
+  criteria and returning them wrapped in a \class{TestSuite}.
+  It can load all tests within a given module or \class{TestCase}
+  class.  When loading from a module, it considers all
+  \class{TestCase}-derived classes.  For each such class, it creates
+  an instance for each method with a name beginning with the string
+  \samp{test}.
 \end{classdesc}
 
 \begin{classdesc}{TextTestRunner}{\optional{stream\optional{,
                   descriptions\optional{, verbosity}}}}
+  A basic test runner implementation which prints results on standard
+  output.  It has a few configurable parameters, but is essentially
+  very simple.  Graphical applications which run test suites should
+  provide alternate implementations.
 \end{classdesc}
 
 \begin{funcdesc}{main}{\optional{module\optional{,
@@ -151,6 +170,127 @@ if __name__ == '__main__':
 \subsection{TestCase Objects
             \label{testcase-objects}}
 
+Each \class{TestCase} instance represents a single test, but each
+concrete subclass may be used to define multiple tests --- the
+concrete class represents a single test fixture.  The fixture is
+created and cleaned up for each test case.
+
+\class{TestCase} instances provide three groups of methods: one group
+used to run the test, another used by the test implementation to
+check conditions and report failures, and some inquiry methods
+allowing information about the test itself to be gathered.
+
+Methods in the first group are:
+
+\begin{methoddesc}[TestCase]{setUp}{}
+  Method called to prepare the test fixture.  This is called
+  immediately before calling the test method; any exception raised by
+  this method will be considered an error rather than a test failure.
+  The default implementation does nothing.
+\end{methoddesc}
+
+\begin{methoddesc}[TestCase]{run}{\optional{result}}
+  Run the test, collecting the result into the test result object
+  passed as \var{result}.  If \var{result} is omitted or \code{None},
+  a temporary result object is created and used, but is not made
+  available to the caller.  This is equivalent to simply calling the
+  \class{TestCase} instance.
+\end{methoddesc}
+
+\begin{methoddesc}[TestCase]{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.  The default implementation does nothing.
+\end{methoddesc}
+
+\begin{methoddesc}[TestCase]{debug}{}
+  Run the test without collecting the result.  This allows exceptions
+  raised by the test to be propogated to the caller, and can be used
+  to support running tests under a debugger.
+\end{methoddesc}
+
+
+The test code can either raise \exception{AssertionError} or use any
+of the following methods to check for and report failures:
+
+\begin{methoddesc}[TestCase]{failUnless}{expr\optional{, msg}}
+\methodline[TestCase]{assert_}{value\optional{, msg}}
+  This method is similar to the \keyword{assert} statement, except it
+  works even when Python is executed in ``optimizing'' mode (using the
+  \programopt{-O} command line switch).  If \var{expr} is false,
+  \exception{AssertionError} will be raised with \var{msg} as the
+  message describing the failure; \code{None} will be used for the
+  message if \var{msg} is omitted.  This method is equivalent to
+
+\begin{alltt}
+assert \var{expr}, \var{msg}
+\end{alltt}
+\end{methoddesc}
+
+\begin{methoddesc}[TestCase]{assertEqual}{first, second\optional{, msg}}
+  Test that \var{first} and \var{second} are equal.  If the values do
+  not compare equal, the test will fail with the explanation given by
+  \var{msg}, or \code{None}.  Note that using \method{assertEqual()}
+  improves upon doing the comparison as the first parameter to
+  \method{failUnless()} is that the default value for \var{msg} can be
+  computed to include representations of both \var{first} and
+  \var{second}.
+\end{methoddesc}
+
+\begin{methoddesc}[TestCase]{assertNotEqual}{first, second\optional{, msg}}
+  Test that \var{first} and \var{second} are not equal.  If the values
+  do compare equal, the test will fail with the explanation given by
+  \var{msg}, or \code{None}.  Note that using \method{assertNotEqual()}
+  improves upon doing the comparison as the first parameter to
+  \method{failUnless()} is that the default value for \var{msg} can be
+  computed to include representations of both \var{first} and
+  \var{second}.
+\end{methoddesc}
+
+\begin{methoddesc}[TestCase]{failIf}{expr\optional{, msg}}
+  The inverse of the \method{assert_()} method is the
+  \method{failIf()} method.  This raises \exception{AssertionError} if
+  \var{expr} is true, with \var{msg} or \code{None} for the error
+  message.
+\end{methoddesc}
+
+\begin{methoddesc}[TestCase]{fail}{\optional{msg}}
+  Fail unconditionally, with \var{msg} or \code{None} for the error
+  message.
+\end{methoddesc}
+
+
+Testing frameworks can use the following methods to collect
+information on the test:
+
+\begin{methoddesc}[TestCase]{countTestCases}{}
+  Return the number of tests represented by the this test object.  For
+  \class{TestCase} instances, this will always be \code{1}, but this
+  method is also implemented by the \class{TestSuite} class, which can
+  return larger values.
+\end{methoddesc}
+
+\begin{methoddesc}[TestCase]{defaultTestResult}{}
+  Return the default type of test result object to be used to run this
+  test.
+\end{methoddesc}
+
+\begin{methoddesc}[TestCase]{id}{}
+  Return a string identifying the specific test case.  This is usually
+  the full name of the test method, including the module and class
+  names.
+\end{methoddesc}
+
+\begin{methoddesc}[TestCase]{shortDescription}{}
+  Returns a one-line description of the test, or \code{None} if no
+  description has been provided.  The default implementation of this
+  method returns the first line of the test method's docstring, if
+  available, or \code{None}.
+\end{methoddesc}
+
 
 \subsection{TestSuite Objects
             \label{testsuite-objects}}
-- 
cgit v0.12

g=1'>Expand</a>)</th><th class='left'>Author</th><th class='left'>Age</th><th class='left'>Files</th><th class='left'>Lines</th></tr>
<tr class='nohover'><td class='commitgraph'>...</td><td colspan='6' /></tr>
<tr><td class='commitgraph'>* </td><td><a href='/oss-git/hdf5.git/commit/test?h=hdf5_1_14_2&amp;id=4105dfedb98236c9e2029ff14b0694161aabfb05'>[svn-r7379] Purpose:</a><span class='decoration'></span></td><td>Quincey Koziol</td><td><span title='2003-08-18 16:29:33 (GMT)'>2003-08-18</span></td><td>1</td><td>-0/+7</td></tr>
<tr class='nohover'><td class='commitgraph'></td>
<td colspan='5'>
</td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/oss-git/hdf5.git/commit/test?h=hdf5_1_14_2&amp;id=d99164a9ed4fb031db5d3cf3d3086862f25f48f1'>[svn-r7377] Purpose:</a><span class='decoration'></span></td><td>Quincey Koziol</td><td><span title='2003-08-16 18:54:40 (GMT)'>2003-08-16</span></td><td>1</td><td>-0/+149</td></tr>
<tr class='nohover'><td class='commitgraph'></td>
<td colspan='5'>
</td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/oss-git/hdf5.git/commit/test?h=hdf5_1_14_2&amp;id=f29e3e10975ee2164ca1ad1c0964108f3dc117d0'>[svn-r7362] Purpose:</a><span class='decoration'></span></td><td>Quincey Koziol</td><td><span title='2003-08-14 12:18:34 (GMT)'>2003-08-14</span></td><td>2</td><td>-1/+383</td></tr>
<tr class='nohover'><td class='commitgraph'></td>
<td colspan='5'>
</td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/oss-git/hdf5.git/commit/test?h=hdf5_1_14_2&amp;id=7f119036d319fdff74b2a2e9de574b0c2bda538b'>[svn-r7352] Purpose:</a><span class='decoration'></span></td><td>Quincey Koziol</td><td><span title='2003-08-13 01:50:11 (GMT)'>2003-08-13</span></td><td>1</td><td>-1/+61</td></tr>
<tr class='nohover'><td class='commitgraph'></td>
<td colspan='5'>
</td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/oss-git/hdf5.git/commit/test?h=hdf5_1_14_2&amp;id=9a2f9731bd0ed65526d7005c214ffb6f74485871'>[svn-r7347] Purpose:</a><span class='decoration'></span></td><td>Quincey Koziol</td><td><span title='2003-08-12 13:29:41 (GMT)'>2003-08-12</span></td><td>1</td><td>-2/+0</td></tr>
<tr class='nohover'><td class='commitgraph'></td>
<td colspan='5'>
</td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/oss-git/hdf5.git/commit/test?h=hdf5_1_14_2&amp;id=95bf191857663a68e37e7bd78122fd681dbb9724'>[svn-r7320] Purpose:</a><span class='decoration'></span></td><td>Quincey Koziol</td><td><span title='2003-08-08 19:25:18 (GMT)'>2003-08-08</span></td><td>5</td><td>-22/+11</td></tr>
<tr class='nohover'><td class='commitgraph'></td>
<td colspan='5'>
</td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/oss-git/hdf5.git/commit/test?h=hdf5_1_14_2&amp;id=8d120c4d0241ea829356b0155dc11fe705f7a7ec'>[svn-r7311] Purpose:</a><span class='decoration'></span></td><td>Quincey Koziol</td><td><span title='2003-08-08 19:06:29 (GMT)'>2003-08-08</span></td><td>1</td><td>-151/+129</td></tr>
<tr class='nohover'><td class='commitgraph'></td>
<td colspan='5'>
</td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/oss-git/hdf5.git/commit/test?h=hdf5_1_14_2&amp;id=6f26af4580e1a114c75f3e6cf7f3f742574900b8'>[svn-r7310] Purpose:</a><span class='decoration'></span></td><td>Quincey Koziol</td><td><span title='2003-08-08 19:05:05 (GMT)'>2003-08-08</span></td><td>1</td><td>-5/+5</td></tr>
<tr class='nohover'><td class='commitgraph'></td>
<td colspan='5'>
</td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/oss-git/hdf5.git/commit/test?h=hdf5_1_14_2&amp;id=eaad7b0f211a9cb6876879fc98d8f12e739a7b60'>[svn-r7309] Purpose:</a><span class='decoration'></span></td><td>Quincey Koziol</td><td><span title='2003-08-08 19:04:26 (GMT)'>2003-08-08</span></td><td>1</td><td>-5/+2</td></tr>
<tr class='nohover'><td class='commitgraph'></td>
<td colspan='5'>
</td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/oss-git/hdf5.git/commit/test?h=hdf5_1_14_2&amp;id=92f5e443f8105b51697afb67daca9066793ab05d'>[svn-r7308] Purpose:</a><span class='decoration'></span></td><td>Quincey Koziol</td><td><span title='2003-08-08 19:03:43 (GMT)'>2003-08-08</span></td><td>2</td><td>-4/+5</td></tr>
<tr class='nohover'><td class='commitgraph'></td>
<td colspan='5'>
</td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/oss-git/hdf5.git/commit/test?h=hdf5_1_14_2&amp;id=8daa13f3cd24ac980feb71e723ce123d4655b4fe'>[svn-r7307] Purpose:</a><span class='decoration'></span></td><td>Quincey Koziol</td><td><span title='2003-08-08 19:02:26 (GMT)'>2003-08-08</span></td><td>1</td><td>-14/+13</td></tr>
<tr class='nohover'><td class='commitgraph'></td>
<td colspan='5'>
</td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/oss-git/hdf5.git/commit/test?h=hdf5_1_14_2&amp;id=a02e07921ea689312b262716e0987ca53c77063c'>[svn-r7285] Purpose:</a><span class='decoration'></span></td><td>Robert E. McGrath</td><td><span title='2003-08-04 20:38:55 (GMT)'>2003-08-04</span></td><td>1</td><td>-0/+1</td></tr>
<tr class='nohover'><td class='commitgraph'></td>
<td colspan='5'>
</td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/oss-git/hdf5.git/commit/test?h=hdf5_1_14_2&amp;id=4bb5eef01c9264b017de6145788946a293396439'>[svn-r7275] Purpose:</a><span class='decoration'></span></td><td>Bill Wendling</td><td><span title='2003-07-29 19:24:32 (GMT)'>2003-07-29</span>