blob: 000c2010ba4ae56d18248389fbc652b097ee63fa [file] [log] [blame]
Fred Drake02538202001-03-21 18:09:46 +00001#!/usr/bin/env python
Steve Purcell5ddd1a82001-03-22 08:45:36 +00002'''
Fred Drake02538202001-03-21 18:09:46 +00003Python unit testing framework, based on Erich Gamma's JUnit and Kent Beck's
4Smalltalk testing framework.
5
Fred Drake02538202001-03-21 18:09:46 +00006This module contains the core framework classes that form the basis of
7specific test cases and suites (TestCase, TestSuite etc.), and also a
8text-based utility class for running the tests and reporting the results
Jeremy Hyltonefef5da2001-10-22 18:14:15 +00009 (TextTestRunner).
Fred Drake02538202001-03-21 18:09:46 +000010
Steve Purcell5ddd1a82001-03-22 08:45:36 +000011Simple usage:
12
13 import unittest
14
15 class IntegerArithmenticTestCase(unittest.TestCase):
16 def testAdd(self): ## test method names begin 'test*'
17 self.assertEquals((1 + 2), 3)
18 self.assertEquals(0 + 1, 1)
Steve Purcell7b065702001-09-06 08:24:40 +000019 def testMultiply(self):
Steve Purcell5ddd1a82001-03-22 08:45:36 +000020 self.assertEquals((0 * 10), 0)
21 self.assertEquals((5 * 8), 40)
22
23 if __name__ == '__main__':
24 unittest.main()
25
26Further information is available in the bundled documentation, and from
27
Georg Brandl15c5ce92007-03-07 09:09:40 +000028 http://docs.python.org/lib/module-unittest.html
Steve Purcell5ddd1a82001-03-22 08:45:36 +000029
Steve Purcell7e743842003-09-22 11:08:12 +000030Copyright (c) 1999-2003 Steve Purcell
Fred Drake02538202001-03-21 18:09:46 +000031This module is free software, and you may redistribute it and/or modify
32it under the same terms as Python itself, so long as this copyright message
33and disclaimer are retained in their original form.
34
35IN NO EVENT SHALL THE AUTHOR BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
36SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF
37THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
38DAMAGE.
39
40THE AUTHOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT
41LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
42PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS,
43AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
44SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
Steve Purcell5ddd1a82001-03-22 08:45:36 +000045'''
Fred Drake02538202001-03-21 18:09:46 +000046
Steve Purcell5ddd1a82001-03-22 08:45:36 +000047__author__ = "Steve Purcell"
48__email__ = "stephen_purcell at yahoo dot com"
Benjamin Petersonbca248e2009-03-23 23:19:03 +000049__version__ = "$Id$"
Fred Drake02538202001-03-21 18:09:46 +000050
51import time
52import sys
53import traceback
Fred Drake02538202001-03-21 18:09:46 +000054import os
Steve Purcell5ddd1a82001-03-22 08:45:36 +000055import types
Benjamin Peterson692428e2009-03-23 21:50:21 +000056import functools
Fred Drake02538202001-03-21 18:09:46 +000057
58##############################################################################
Steve Purcelld75e7e42003-09-15 11:01:21 +000059# Exported classes and functions
60##############################################################################
61__all__ = ['TestResult', 'TestCase', 'TestSuite', 'TextTestRunner',
62 'TestLoader', 'FunctionTestCase', 'main', 'defaultTestLoader']
63
Steve Purcell7e743842003-09-22 11:08:12 +000064# Expose obsolete functions for backwards compatibility
Steve Purcelld75e7e42003-09-15 11:01:21 +000065__all__.extend(['getTestCaseNames', 'makeSuite', 'findTestCases'])
66
67
68##############################################################################
Steve Purcell7e743842003-09-22 11:08:12 +000069# Backward compatibility
70##############################################################################
Steve Purcell7e743842003-09-22 11:08:12 +000071
Raymond Hettinger5930d8f2008-07-10 16:06:41 +000072def _CmpToKey(mycmp):
73 'Convert a cmp= function into a key= function'
74 class K(object):
75 def __init__(self, obj):
76 self.obj = obj
77 def __lt__(self, other):
78 return mycmp(self.obj, other.obj) == -1
79 return K
Steve Purcell7e743842003-09-22 11:08:12 +000080
81##############################################################################
Fred Drake02538202001-03-21 18:09:46 +000082# Test framework core
83##############################################################################
84
Steve Purcelldc391a62002-08-09 09:46:23 +000085def _strclass(cls):
86 return "%s.%s" % (cls.__module__, cls.__name__)
87
Benjamin Peterson692428e2009-03-23 21:50:21 +000088
89class SkipTest(Exception):
90 """
91 Raise this exception in a test to skip it.
92
93 Usually you can use TestResult.skip() or one of the skipping decorators
94 instead of raising this directly.
95 """
96 pass
97
98class _ExpectedFailure(Exception):
99 """
100 Raise this when a test is expected to fail.
101
102 This is an implementation detail.
103 """
104
105 def __init__(self, exc_info):
106 super(_ExpectedFailure, self).__init__()
107 self.exc_info = exc_info
108
109class _UnexpectedSuccess(Exception):
110 """
111 The test was supposed to fail, but it didn't!
112 """
113 pass
114
115def _id(obj):
116 return obj
117
118def skip(reason):
119 """
120 Unconditionally skip a test.
121 """
122 def decorator(test_item):
123 if isinstance(test_item, type) and issubclass(test_item, TestCase):
124 test_item.__unittest_skip__ = True
125 test_item.__unittest_skip_why__ = reason
126 return test_item
127 @functools.wraps(test_item)
128 def skip_wrapper(*args, **kwargs):
129 raise SkipTest(reason)
130 return skip_wrapper
131 return decorator
132
133def skipIf(condition, reason):
134 """
135 Skip a test if the condition is true.
136 """
137 if condition:
138 return skip(reason)
139 return _id
140
141def skipUnless(condition, reason):
142 """
143 Skip a test unless the condition is true.
144 """
145 if not condition:
146 return skip(reason)
147 return _id
148
149
150def expectedFailure(func):
151 @functools.wraps(func)
152 def wrapper(*args, **kwargs):
153 try:
154 func(*args, **kwargs)
155 except Exception:
156 raise _ExpectedFailure(sys.exc_info())
157 raise _UnexpectedSuccess
158 return wrapper
159
160
Steve Purcellb8d5f242003-12-06 13:03:13 +0000161__unittest = 1
162
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000163class TestResult(object):
Fred Drake02538202001-03-21 18:09:46 +0000164 """Holder for test result information.
165
166 Test results are automatically managed by the TestCase and TestSuite
167 classes, and do not need to be explicitly manipulated by writers of tests.
168
169 Each instance holds the total number of tests run, and collections of
170 failures and errors that occurred among those test runs. The collections
Steve Purcell7b065702001-09-06 08:24:40 +0000171 contain tuples of (testcase, exceptioninfo), where exceptioninfo is the
Fred Drake656f9ec2001-09-06 19:13:14 +0000172 formatted traceback of the error that occurred.
Fred Drake02538202001-03-21 18:09:46 +0000173 """
174 def __init__(self):
175 self.failures = []
176 self.errors = []
177 self.testsRun = 0
Benjamin Peterson692428e2009-03-23 21:50:21 +0000178 self.skipped = []
Benjamin Petersoncb2b0e42009-03-23 22:29:45 +0000179 self.expectedFailures = []
180 self.unexpectedSuccesses = []
Georg Brandl15c5ce92007-03-07 09:09:40 +0000181 self.shouldStop = False
Fred Drake02538202001-03-21 18:09:46 +0000182
183 def startTest(self, test):
184 "Called when the given test is about to be run"
185 self.testsRun = self.testsRun + 1
186
187 def stopTest(self, test):
188 "Called when the given test has been run"
189 pass
190
191 def addError(self, test, err):
Steve Purcell7b065702001-09-06 08:24:40 +0000192 """Called when an error has occurred. 'err' is a tuple of values as
193 returned by sys.exc_info().
194 """
Steve Purcellb8d5f242003-12-06 13:03:13 +0000195 self.errors.append((test, self._exc_info_to_string(err, test)))
Fred Drake02538202001-03-21 18:09:46 +0000196
197 def addFailure(self, test, err):
Steve Purcell7b065702001-09-06 08:24:40 +0000198 """Called when an error has occurred. 'err' is a tuple of values as
199 returned by sys.exc_info()."""
Steve Purcellb8d5f242003-12-06 13:03:13 +0000200 self.failures.append((test, self._exc_info_to_string(err, test)))
Fred Drake02538202001-03-21 18:09:46 +0000201
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000202 def addSuccess(self, test):
203 "Called when a test has completed successfully"
204 pass
205
Benjamin Peterson692428e2009-03-23 21:50:21 +0000206 def addSkip(self, test, reason):
207 """Called when a test is skipped."""
208 self.skipped.append((test, reason))
209
210 def addExpectedFailure(self, test, err):
211 """Called when an expected failure/error occured."""
Benjamin Petersoncb2b0e42009-03-23 22:29:45 +0000212 self.expectedFailures.append(
Benjamin Peterson692428e2009-03-23 21:50:21 +0000213 (test, self._exc_info_to_string(err, test)))
214
215 def addUnexpectedSuccess(self, test):
216 """Called when a test was expected to fail, but succeed."""
Benjamin Petersoncb2b0e42009-03-23 22:29:45 +0000217 self.unexpectedSuccesses.append(test)
Benjamin Peterson692428e2009-03-23 21:50:21 +0000218
Fred Drake02538202001-03-21 18:09:46 +0000219 def wasSuccessful(self):
220 "Tells whether or not this result was a success"
221 return len(self.failures) == len(self.errors) == 0
222
223 def stop(self):
224 "Indicates that the tests should be aborted"
Steve Purcell7e743842003-09-22 11:08:12 +0000225 self.shouldStop = True
Tim Petersa19a1682001-03-29 04:36:09 +0000226
Steve Purcellb8d5f242003-12-06 13:03:13 +0000227 def _exc_info_to_string(self, err, test):
Steve Purcell7b065702001-09-06 08:24:40 +0000228 """Converts a sys.exc_info()-style tuple of values into a string."""
Steve Purcellb8d5f242003-12-06 13:03:13 +0000229 exctype, value, tb = err
230 # Skip test runner traceback levels
231 while tb and self._is_relevant_tb_level(tb):
232 tb = tb.tb_next
233 if exctype is test.failureException:
234 # Skip assert*() traceback levels
235 length = self._count_relevant_tb_levels(tb)
236 return ''.join(traceback.format_exception(exctype, value, tb, length))
237 return ''.join(traceback.format_exception(exctype, value, tb))
238
239 def _is_relevant_tb_level(self, tb):
Georg Brandl56af5fc2008-07-18 19:30:10 +0000240 return '__unittest' in tb.tb_frame.f_globals
Steve Purcellb8d5f242003-12-06 13:03:13 +0000241
242 def _count_relevant_tb_levels(self, tb):
243 length = 0
244 while tb and not self._is_relevant_tb_level(tb):
245 length += 1
246 tb = tb.tb_next
247 return length
Steve Purcell7b065702001-09-06 08:24:40 +0000248
Fred Drake02538202001-03-21 18:09:46 +0000249 def __repr__(self):
250 return "<%s run=%i errors=%i failures=%i>" % \
Steve Purcelldc391a62002-08-09 09:46:23 +0000251 (_strclass(self.__class__), self.testsRun, len(self.errors),
Fred Drake02538202001-03-21 18:09:46 +0000252 len(self.failures))
253
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000254class AssertRaisesContext(object):
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000255 def __init__(self, expected, test_case):
256 self.expected = expected
257 self.failureException = test_case.failureException
258 def __enter__(self):
259 pass
260 def __exit__(self, exc_type, exc_value, traceback):
261 if exc_type is None:
262 try:
263 exc_name = self.expected.__name__
264 except AttributeError:
265 exc_name = str(self.expected)
266 raise self.failureException(
267 "{0} not raised".format(exc_name))
268 if issubclass(exc_type, self.expected):
269 return True
270 # Let unexpected exceptions skip through
271 return False
272
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000273class TestCase(object):
Fred Drake02538202001-03-21 18:09:46 +0000274 """A class whose instances are single test cases.
275
Fred Drake02538202001-03-21 18:09:46 +0000276 By default, the test code itself should be placed in a method named
277 'runTest'.
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000278
Tim Petersa19a1682001-03-29 04:36:09 +0000279 If the fixture may be used for many test cases, create as
Fred Drake02538202001-03-21 18:09:46 +0000280 many test methods as are needed. When instantiating such a TestCase
281 subclass, specify in the constructor arguments the name of the test method
282 that the instance is to execute.
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000283
Tim Petersa19a1682001-03-29 04:36:09 +0000284 Test authors should subclass TestCase for their own tests. Construction
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000285 and deconstruction of the test's environment ('fixture') can be
286 implemented by overriding the 'setUp' and 'tearDown' methods respectively.
287
288 If it is necessary to override the __init__ method, the base class
289 __init__ method must always be called. It is important that subclasses
290 should not change the signature of their __init__ method, since instances
291 of the classes are instantiated automatically by parts of the framework
292 in order to be run.
Fred Drake02538202001-03-21 18:09:46 +0000293 """
Steve Purcell15d89272001-04-12 09:05:01 +0000294
295 # This attribute determines which exception will be raised when
296 # the instance's assertion methods fail; test methods raising this
297 # exception will be deemed to have 'failed' rather than 'errored'
298
299 failureException = AssertionError
300
Fred Drake02538202001-03-21 18:09:46 +0000301 def __init__(self, methodName='runTest'):
302 """Create an instance of the class that will use the named test
303 method when executed. Raises a ValueError if the instance does
304 not have a method with the specified name.
305 """
306 try:
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000307 self._testMethodName = methodName
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000308 testMethod = getattr(self, methodName)
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000309 self._testMethodDoc = testMethod.__doc__
Fred Drake02538202001-03-21 18:09:46 +0000310 except AttributeError:
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000311 raise ValueError("no such test method in %s: %s" % \
312 (self.__class__, methodName))
Fred Drake02538202001-03-21 18:09:46 +0000313
314 def setUp(self):
315 "Hook method for setting up the test fixture before exercising it."
316 pass
317
318 def tearDown(self):
319 "Hook method for deconstructing the test fixture after testing it."
320 pass
321
322 def countTestCases(self):
323 return 1
324
325 def defaultTestResult(self):
326 return TestResult()
327
328 def shortDescription(self):
329 """Returns a one-line description of the test, or None if no
330 description has been provided.
331
332 The default implementation of this method returns the first line of
333 the specified test method's docstring.
334 """
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000335 doc = self._testMethodDoc
Steve Purcell7e743842003-09-22 11:08:12 +0000336 return doc and doc.split("\n")[0].strip() or None
Fred Drake02538202001-03-21 18:09:46 +0000337
338 def id(self):
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000339 return "%s.%s" % (_strclass(self.__class__), self._testMethodName)
Fred Drake02538202001-03-21 18:09:46 +0000340
Georg Brandl15c5ce92007-03-07 09:09:40 +0000341 def __eq__(self, other):
342 if type(self) is not type(other):
343 return False
344
345 return self._testMethodName == other._testMethodName
346
347 def __ne__(self, other):
348 return not self == other
349
350 def __hash__(self):
Collin Winter9453e5d2007-03-09 23:30:39 +0000351 return hash((type(self), self._testMethodName))
Georg Brandl15c5ce92007-03-07 09:09:40 +0000352
Fred Drake02538202001-03-21 18:09:46 +0000353 def __str__(self):
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000354 return "%s (%s)" % (self._testMethodName, _strclass(self.__class__))
Fred Drake02538202001-03-21 18:09:46 +0000355
356 def __repr__(self):
357 return "<%s testMethod=%s>" % \
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000358 (_strclass(self.__class__), self._testMethodName)
Fred Drake02538202001-03-21 18:09:46 +0000359
360 def run(self, result=None):
Fred Drake02538202001-03-21 18:09:46 +0000361 if result is None: result = self.defaultTestResult()
362 result.startTest(self)
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000363 testMethod = getattr(self, self._testMethodName)
Fred Drake02538202001-03-21 18:09:46 +0000364 try:
365 try:
366 self.setUp()
Benjamin Peterson692428e2009-03-23 21:50:21 +0000367 except SkipTest as e:
368 result.addSkip(self, str(e))
369 return
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000370 except Exception:
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000371 result.addError(self, self._exc_info())
Fred Drake02538202001-03-21 18:09:46 +0000372 return
373
Benjamin Peterson692428e2009-03-23 21:50:21 +0000374 success = False
Fred Drake02538202001-03-21 18:09:46 +0000375 try:
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000376 testMethod()
Skip Montanaroae5c37b2003-07-13 15:18:12 +0000377 except self.failureException:
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000378 result.addFailure(self, self._exc_info())
Benjamin Peterson692428e2009-03-23 21:50:21 +0000379 except _ExpectedFailure as e:
380 result.addExpectedFailure(self, e.exc_info)
381 except _UnexpectedSuccess:
382 result.addUnexpectedSuccess(self)
383 except SkipTest as e:
384 result.addSkip(self, str(e))
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000385 except Exception:
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000386 result.addError(self, self._exc_info())
Benjamin Peterson692428e2009-03-23 21:50:21 +0000387 else:
388 success = True
Fred Drake02538202001-03-21 18:09:46 +0000389
390 try:
391 self.tearDown()
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000392 except Exception:
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000393 result.addError(self, self._exc_info())
Benjamin Peterson692428e2009-03-23 21:50:21 +0000394 success = False
395 if success:
396 result.addSuccess(self)
Fred Drake02538202001-03-21 18:09:46 +0000397 finally:
398 result.stopTest(self)
399
Raymond Hettinger664347b2004-12-04 21:21:53 +0000400 def __call__(self, *args, **kwds):
401 return self.run(*args, **kwds)
Steve Purcell7e743842003-09-22 11:08:12 +0000402
Fred Drake02538202001-03-21 18:09:46 +0000403 def debug(self):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000404 """Run the test without collecting errors in a TestResult"""
Fred Drake02538202001-03-21 18:09:46 +0000405 self.setUp()
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000406 getattr(self, self._testMethodName)()
Fred Drake02538202001-03-21 18:09:46 +0000407 self.tearDown()
408
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000409 def _exc_info(self):
Steve Purcell15d89272001-04-12 09:05:01 +0000410 """Return a version of sys.exc_info() with the traceback frame
411 minimised; usually the top level of the traceback frame is not
412 needed.
Fred Drake02538202001-03-21 18:09:46 +0000413 """
Georg Brandl15c5ce92007-03-07 09:09:40 +0000414 return sys.exc_info()
Fred Drake02538202001-03-21 18:09:46 +0000415
Benjamin Peterson692428e2009-03-23 21:50:21 +0000416 def skip(self, reason):
417 """Skip this test."""
418 raise SkipTest(reason)
419
Steve Purcell15d89272001-04-12 09:05:01 +0000420 def fail(self, msg=None):
421 """Fail immediately, with the given message."""
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000422 raise self.failureException(msg)
Fred Drake02538202001-03-21 18:09:46 +0000423
424 def failIf(self, expr, msg=None):
425 "Fail the test if the expression is true."
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000426 if expr: raise self.failureException(msg)
Fred Drake02538202001-03-21 18:09:46 +0000427
Steve Purcell15d89272001-04-12 09:05:01 +0000428 def failUnless(self, expr, msg=None):
429 """Fail the test unless the expression is true."""
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000430 if not expr: raise self.failureException(msg)
Steve Purcell15d89272001-04-12 09:05:01 +0000431
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000432 def failUnlessRaises(self, excClass, callableObj=None, *args, **kwargs):
Steve Purcell15d89272001-04-12 09:05:01 +0000433 """Fail unless an exception of class excClass is thrown
Fred Drake02538202001-03-21 18:09:46 +0000434 by callableObj when invoked with arguments args and keyword
435 arguments kwargs. If a different type of exception is
436 thrown, it will not be caught, and the test case will be
437 deemed to have suffered an error, exactly as for an
438 unexpected exception.
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000439
440 If called with callableObj omitted or None, will return a
441 context object used like this::
442
443 with self.failUnlessRaises(some_error_class):
444 do_something()
Fred Drake02538202001-03-21 18:09:46 +0000445 """
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000446 context = AssertRaisesContext(excClass, self)
447 if callableObj is None:
448 return context
449 with context:
Guido van Rossum68468eb2003-02-27 20:14:51 +0000450 callableObj(*args, **kwargs)
Fred Drake02538202001-03-21 18:09:46 +0000451
Steve Purcell15d89272001-04-12 09:05:01 +0000452 def failUnlessEqual(self, first, second, msg=None):
Raymond Hettingerc377cbf2003-04-04 22:56:42 +0000453 """Fail if the two objects are unequal as determined by the '=='
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000454 operator.
455 """
Raymond Hettingerc377cbf2003-04-04 22:56:42 +0000456 if not first == second:
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000457 raise self.failureException(msg or '%r != %r' % (first, second))
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000458
Steve Purcell15d89272001-04-12 09:05:01 +0000459 def failIfEqual(self, first, second, msg=None):
460 """Fail if the two objects are equal as determined by the '=='
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000461 operator.
462 """
Steve Purcell15d89272001-04-12 09:05:01 +0000463 if first == second:
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000464 raise self.failureException(msg or '%r == %r' % (first, second))
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000465
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000466 def failUnlessAlmostEqual(self, first, second, places=7, msg=None):
467 """Fail if the two objects are unequal as determined by their
468 difference rounded to the given number of decimal places
469 (default 7) and comparing to zero.
470
Steve Purcell397b45d2003-10-26 10:41:03 +0000471 Note that decimal places (from zero) are usually not the same
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000472 as significant digits (measured from the most signficant digit).
473 """
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000474 if round(abs(second-first), places) != 0:
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000475 raise self.failureException(
476 msg or '%r != %r within %r places' % (first, second, places))
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000477
478 def failIfAlmostEqual(self, first, second, places=7, msg=None):
479 """Fail if the two objects are equal as determined by their
480 difference rounded to the given number of decimal places
481 (default 7) and comparing to zero.
482
Steve Purcellcca34912003-10-26 16:38:16 +0000483 Note that decimal places (from zero) are usually not the same
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000484 as significant digits (measured from the most signficant digit).
485 """
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000486 if round(abs(second-first), places) == 0:
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000487 raise self.failureException(
488 msg or '%r == %r within %r places' % (first, second, places))
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000489
Steve Purcell7e743842003-09-22 11:08:12 +0000490 # Synonyms for assertion methods
491
Steve Purcell15d89272001-04-12 09:05:01 +0000492 assertEqual = assertEquals = failUnlessEqual
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000493
Steve Purcell15d89272001-04-12 09:05:01 +0000494 assertNotEqual = assertNotEquals = failIfEqual
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000495
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000496 assertAlmostEqual = assertAlmostEquals = failUnlessAlmostEqual
497
498 assertNotAlmostEqual = assertNotAlmostEquals = failIfAlmostEqual
499
Steve Purcell15d89272001-04-12 09:05:01 +0000500 assertRaises = failUnlessRaises
501
Steve Purcell7e743842003-09-22 11:08:12 +0000502 assert_ = assertTrue = failUnless
503
504 assertFalse = failIf
Steve Purcell15d89272001-04-12 09:05:01 +0000505
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000506
Fred Drake02538202001-03-21 18:09:46 +0000507
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000508class TestSuite(object):
Fred Drake02538202001-03-21 18:09:46 +0000509 """A test suite is a composite test consisting of a number of TestCases.
510
511 For use, create an instance of TestSuite, then add test case instances.
512 When all tests have been added, the suite can be passed to a test
513 runner, such as TextTestRunner. It will run the individual test cases
514 in the order in which they were added, aggregating the results. When
515 subclassing, do not forget to call the base class constructor.
516 """
517 def __init__(self, tests=()):
518 self._tests = []
519 self.addTests(tests)
520
521 def __repr__(self):
Steve Purcelldc391a62002-08-09 09:46:23 +0000522 return "<%s tests=%s>" % (_strclass(self.__class__), self._tests)
Fred Drake02538202001-03-21 18:09:46 +0000523
524 __str__ = __repr__
525
Georg Brandl15c5ce92007-03-07 09:09:40 +0000526 def __eq__(self, other):
Benjamin Peterson692428e2009-03-23 21:50:21 +0000527 if not isinstance(other, self.__class__):
528 return NotImplemented
Georg Brandl15c5ce92007-03-07 09:09:40 +0000529 return self._tests == other._tests
530
531 def __ne__(self, other):
532 return not self == other
533
Nick Coghlan48361f52008-08-11 15:45:58 +0000534 # Can't guarantee hash invariant, so flag as unhashable
535 __hash__ = None
536
Jim Fultonfafd8742004-08-28 15:22:12 +0000537 def __iter__(self):
538 return iter(self._tests)
539
Fred Drake02538202001-03-21 18:09:46 +0000540 def countTestCases(self):
541 cases = 0
542 for test in self._tests:
Steve Purcell7e743842003-09-22 11:08:12 +0000543 cases += test.countTestCases()
Fred Drake02538202001-03-21 18:09:46 +0000544 return cases
545
546 def addTest(self, test):
Georg Brandld9e50262007-03-07 11:54:49 +0000547 # sanity checks
Raymond Hettinger5930d8f2008-07-10 16:06:41 +0000548 if not hasattr(test, '__call__'):
Georg Brandld9e50262007-03-07 11:54:49 +0000549 raise TypeError("the test to add must be callable")
550 if (isinstance(test, (type, types.ClassType)) and
551 issubclass(test, (TestCase, TestSuite))):
552 raise TypeError("TestCases and TestSuites must be instantiated "
553 "before passing them to addTest()")
Fred Drake02538202001-03-21 18:09:46 +0000554 self._tests.append(test)
555
556 def addTests(self, tests):
Georg Brandld9e50262007-03-07 11:54:49 +0000557 if isinstance(tests, basestring):
558 raise TypeError("tests must be an iterable of tests, not a string")
Fred Drake02538202001-03-21 18:09:46 +0000559 for test in tests:
560 self.addTest(test)
561
562 def run(self, result):
Fred Drake02538202001-03-21 18:09:46 +0000563 for test in self._tests:
564 if result.shouldStop:
565 break
566 test(result)
567 return result
568
Raymond Hettinger664347b2004-12-04 21:21:53 +0000569 def __call__(self, *args, **kwds):
570 return self.run(*args, **kwds)
571
Fred Drake02538202001-03-21 18:09:46 +0000572 def debug(self):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000573 """Run the tests without collecting errors in a TestResult"""
Fred Drake02538202001-03-21 18:09:46 +0000574 for test in self._tests: test.debug()
Fred Drake02538202001-03-21 18:09:46 +0000575
576
Benjamin Peterson692428e2009-03-23 21:50:21 +0000577class ClassTestSuite(TestSuite):
578 """
579 Suite of tests derived from a single TestCase class.
580 """
581
582 def __init__(self, tests, class_collected_from):
583 super(ClassTestSuite, self).__init__(tests)
584 self.collected_from = class_collected_from
585
586 def id(self):
587 module = getattr(self.collected_from, "__module__", None)
588 if module is not None:
589 return "{0}.{1}".format(module, self.collected_from.__name__)
590 return self.collected_from.__name__
591
592 def run(self, result):
593 if getattr(self.collected_from, "__unittest_skip__", False):
594 # ClassTestSuite result pretends to be a TestCase enough to be
595 # reported.
596 result.startTest(self)
597 try:
598 result.addSkip(self, self.collected_from.__unittest_skip_why__)
599 finally:
600 result.stopTest(self)
601 else:
602 result = super(ClassTestSuite, self).run(result)
603 return result
604
605 shortDescription = id
606
607
Fred Drake02538202001-03-21 18:09:46 +0000608class FunctionTestCase(TestCase):
609 """A test case that wraps a test function.
610
611 This is useful for slipping pre-existing test functions into the
Georg Brandl15c5ce92007-03-07 09:09:40 +0000612 unittest framework. Optionally, set-up and tidy-up functions can be
Fred Drake02538202001-03-21 18:09:46 +0000613 supplied. As with TestCase, the tidy-up ('tearDown') function will
614 always be called if the set-up ('setUp') function ran successfully.
615 """
616
617 def __init__(self, testFunc, setUp=None, tearDown=None,
618 description=None):
619 TestCase.__init__(self)
620 self.__setUpFunc = setUp
621 self.__tearDownFunc = tearDown
622 self.__testFunc = testFunc
623 self.__description = description
624
625 def setUp(self):
626 if self.__setUpFunc is not None:
627 self.__setUpFunc()
628
629 def tearDown(self):
630 if self.__tearDownFunc is not None:
631 self.__tearDownFunc()
632
633 def runTest(self):
634 self.__testFunc()
635
636 def id(self):
637 return self.__testFunc.__name__
638
Georg Brandl15c5ce92007-03-07 09:09:40 +0000639 def __eq__(self, other):
640 if type(self) is not type(other):
641 return False
642
643 return self.__setUpFunc == other.__setUpFunc and \
644 self.__tearDownFunc == other.__tearDownFunc and \
645 self.__testFunc == other.__testFunc and \
646 self.__description == other.__description
647
648 def __ne__(self, other):
649 return not self == other
650
651 def __hash__(self):
Collin Winter9453e5d2007-03-09 23:30:39 +0000652 return hash((type(self), self.__setUpFunc, self.__tearDownFunc,
653 self.__testFunc, self.__description))
Georg Brandl15c5ce92007-03-07 09:09:40 +0000654
Fred Drake02538202001-03-21 18:09:46 +0000655 def __str__(self):
Steve Purcelldc391a62002-08-09 09:46:23 +0000656 return "%s (%s)" % (_strclass(self.__class__), self.__testFunc.__name__)
Fred Drake02538202001-03-21 18:09:46 +0000657
658 def __repr__(self):
Steve Purcelldc391a62002-08-09 09:46:23 +0000659 return "<%s testFunc=%s>" % (_strclass(self.__class__), self.__testFunc)
Fred Drake02538202001-03-21 18:09:46 +0000660
661 def shortDescription(self):
662 if self.__description is not None: return self.__description
663 doc = self.__testFunc.__doc__
Steve Purcell7e743842003-09-22 11:08:12 +0000664 return doc and doc.split("\n")[0].strip() or None
Fred Drake02538202001-03-21 18:09:46 +0000665
666
667
668##############################################################################
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000669# Locating and loading tests
Fred Drake02538202001-03-21 18:09:46 +0000670##############################################################################
671
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000672class TestLoader(object):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000673 """This class is responsible for loading tests according to various
Georg Brandl15c5ce92007-03-07 09:09:40 +0000674 criteria and returning them wrapped in a TestSuite
Fred Drake02538202001-03-21 18:09:46 +0000675 """
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000676 testMethodPrefix = 'test'
677 sortTestMethodsUsing = cmp
678 suiteClass = TestSuite
Benjamin Peterson692428e2009-03-23 21:50:21 +0000679 classSuiteClass = ClassTestSuite
Fred Drake02538202001-03-21 18:09:46 +0000680
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000681 def loadTestsFromTestCase(self, testCaseClass):
Steve Purcell15d89272001-04-12 09:05:01 +0000682 """Return a suite of all tests cases contained in testCaseClass"""
Johannes Gijsbersd7b6ad42004-11-07 15:46:25 +0000683 if issubclass(testCaseClass, TestSuite):
684 raise TypeError("Test cases should not be derived from TestSuite. Maybe you meant to derive from TestCase?")
Steve Purcell7e743842003-09-22 11:08:12 +0000685 testCaseNames = self.getTestCaseNames(testCaseClass)
686 if not testCaseNames and hasattr(testCaseClass, 'runTest'):
687 testCaseNames = ['runTest']
Benjamin Peterson692428e2009-03-23 21:50:21 +0000688 suite = self.classSuiteClass(map(testCaseClass, testCaseNames),
689 testCaseClass)
690 return suite
Fred Drake02538202001-03-21 18:09:46 +0000691
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000692 def loadTestsFromModule(self, module):
Steve Purcell15d89272001-04-12 09:05:01 +0000693 """Return a suite of all tests cases contained in the given module"""
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000694 tests = []
695 for name in dir(module):
696 obj = getattr(module, name)
Guido van Rossum67911372002-09-30 19:25:56 +0000697 if (isinstance(obj, (type, types.ClassType)) and
698 issubclass(obj, TestCase)):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000699 tests.append(self.loadTestsFromTestCase(obj))
700 return self.suiteClass(tests)
Fred Drake02538202001-03-21 18:09:46 +0000701
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000702 def loadTestsFromName(self, name, module=None):
Steve Purcell15d89272001-04-12 09:05:01 +0000703 """Return a suite of all tests cases given a string specifier.
704
705 The name may resolve either to a module, a test case class, a
706 test method within a test case class, or a callable object which
707 returns a TestCase or TestSuite instance.
Tim Peters613b2222001-04-13 05:37:27 +0000708
Steve Purcell15d89272001-04-12 09:05:01 +0000709 The method optionally resolves the names relative to a given module.
710 """
Steve Purcell7e743842003-09-22 11:08:12 +0000711 parts = name.split('.')
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000712 if module is None:
Steve Purcell7e743842003-09-22 11:08:12 +0000713 parts_copy = parts[:]
714 while parts_copy:
715 try:
716 module = __import__('.'.join(parts_copy))
717 break
718 except ImportError:
719 del parts_copy[-1]
720 if not parts_copy: raise
Armin Rigo1b3c04b2003-10-24 17:15:29 +0000721 parts = parts[1:]
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000722 obj = module
723 for part in parts:
Steve Purcell7e743842003-09-22 11:08:12 +0000724 parent, obj = obj, getattr(obj, part)
Fred Drake02538202001-03-21 18:09:46 +0000725
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000726 if isinstance(obj, types.ModuleType):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000727 return self.loadTestsFromModule(obj)
Guido van Rossum67911372002-09-30 19:25:56 +0000728 elif (isinstance(obj, (type, types.ClassType)) and
Steve Purcell397b45d2003-10-26 10:41:03 +0000729 issubclass(obj, TestCase)):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000730 return self.loadTestsFromTestCase(obj)
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000731 elif (isinstance(obj, types.UnboundMethodType) and
Georg Brandl15c5ce92007-03-07 09:09:40 +0000732 isinstance(parent, (type, types.ClassType)) and
733 issubclass(parent, TestCase)):
734 return TestSuite([parent(obj.__name__)])
Steve Purcell397b45d2003-10-26 10:41:03 +0000735 elif isinstance(obj, TestSuite):
Steve Purcell7e743842003-09-22 11:08:12 +0000736 return obj
Raymond Hettinger5930d8f2008-07-10 16:06:41 +0000737 elif hasattr(obj, '__call__'):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000738 test = obj()
Georg Brandl15c5ce92007-03-07 09:09:40 +0000739 if isinstance(test, TestSuite):
740 return test
741 elif isinstance(test, TestCase):
742 return TestSuite([test])
743 else:
744 raise TypeError("calling %s returned %s, not a test" %
745 (obj, test))
Fred Drake02538202001-03-21 18:09:46 +0000746 else:
Georg Brandl15c5ce92007-03-07 09:09:40 +0000747 raise TypeError("don't know how to make test from: %s" % obj)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000748
749 def loadTestsFromNames(self, names, module=None):
Steve Purcell15d89272001-04-12 09:05:01 +0000750 """Return a suite of all tests cases found using the given sequence
751 of string specifiers. See 'loadTestsFromName()'.
752 """
Steve Purcell7e743842003-09-22 11:08:12 +0000753 suites = [self.loadTestsFromName(name, module) for name in names]
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000754 return self.suiteClass(suites)
755
756 def getTestCaseNames(self, testCaseClass):
Steve Purcell15d89272001-04-12 09:05:01 +0000757 """Return a sorted sequence of method names found within testCaseClass
758 """
Steve Purcell7e743842003-09-22 11:08:12 +0000759 def isTestMethod(attrname, testCaseClass=testCaseClass, prefix=self.testMethodPrefix):
Raymond Hettinger5930d8f2008-07-10 16:06:41 +0000760 return attrname.startswith(prefix) and hasattr(getattr(testCaseClass, attrname), '__call__')
Steve Purcell7e743842003-09-22 11:08:12 +0000761 testFnNames = filter(isTestMethod, dir(testCaseClass))
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000762 if self.sortTestMethodsUsing:
Raymond Hettinger5930d8f2008-07-10 16:06:41 +0000763 testFnNames.sort(key=_CmpToKey(self.sortTestMethodsUsing))
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000764 return testFnNames
765
766
767
768defaultTestLoader = TestLoader()
769
770
771##############################################################################
772# Patches for old functions: these functions should be considered obsolete
773##############################################################################
774
775def _makeLoader(prefix, sortUsing, suiteClass=None):
776 loader = TestLoader()
777 loader.sortTestMethodsUsing = sortUsing
778 loader.testMethodPrefix = prefix
779 if suiteClass: loader.suiteClass = suiteClass
780 return loader
781
782def getTestCaseNames(testCaseClass, prefix, sortUsing=cmp):
783 return _makeLoader(prefix, sortUsing).getTestCaseNames(testCaseClass)
784
785def makeSuite(testCaseClass, prefix='test', sortUsing=cmp, suiteClass=TestSuite):
786 return _makeLoader(prefix, sortUsing, suiteClass).loadTestsFromTestCase(testCaseClass)
787
788def findTestCases(module, prefix='test', sortUsing=cmp, suiteClass=TestSuite):
789 return _makeLoader(prefix, sortUsing, suiteClass).loadTestsFromModule(module)
Fred Drake02538202001-03-21 18:09:46 +0000790
791
792##############################################################################
793# Text UI
794##############################################################################
795
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000796class _WritelnDecorator(object):
Fred Drake02538202001-03-21 18:09:46 +0000797 """Used to decorate file-like objects with a handy 'writeln' method"""
798 def __init__(self,stream):
799 self.stream = stream
Fred Drake02538202001-03-21 18:09:46 +0000800
801 def __getattr__(self, attr):
802 return getattr(self.stream,attr)
803
Raymond Hettinger91dd19d2003-09-13 02:58:00 +0000804 def writeln(self, arg=None):
805 if arg: self.write(arg)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000806 self.write('\n') # text-mode streams translate to \r\n if needed
Tim Petersa19a1682001-03-29 04:36:09 +0000807
Fred Drake02538202001-03-21 18:09:46 +0000808
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000809class _TextTestResult(TestResult):
Fred Drake02538202001-03-21 18:09:46 +0000810 """A test result class that can print formatted text results to a stream.
811
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000812 Used by TextTestRunner.
Fred Drake02538202001-03-21 18:09:46 +0000813 """
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000814 separator1 = '=' * 70
815 separator2 = '-' * 70
Fred Drake02538202001-03-21 18:09:46 +0000816
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000817 def __init__(self, stream, descriptions, verbosity):
Fred Drake02538202001-03-21 18:09:46 +0000818 TestResult.__init__(self)
819 self.stream = stream
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000820 self.showAll = verbosity > 1
821 self.dots = verbosity == 1
Fred Drake02538202001-03-21 18:09:46 +0000822 self.descriptions = descriptions
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000823
824 def getDescription(self, test):
825 if self.descriptions:
826 return test.shortDescription() or str(test)
827 else:
828 return str(test)
829
Fred Drake02538202001-03-21 18:09:46 +0000830 def startTest(self, test):
831 TestResult.startTest(self, test)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000832 if self.showAll:
833 self.stream.write(self.getDescription(test))
834 self.stream.write(" ... ")
Georg Brandld0632402008-05-11 15:17:41 +0000835 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +0000836
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000837 def addSuccess(self, test):
838 TestResult.addSuccess(self, test)
839 if self.showAll:
Fred Drake02538202001-03-21 18:09:46 +0000840 self.stream.writeln("ok")
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000841 elif self.dots:
842 self.stream.write('.')
Georg Brandld0632402008-05-11 15:17:41 +0000843 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +0000844
845 def addError(self, test, err):
846 TestResult.addError(self, test, err)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000847 if self.showAll:
848 self.stream.writeln("ERROR")
849 elif self.dots:
850 self.stream.write('E')
Georg Brandld0632402008-05-11 15:17:41 +0000851 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +0000852
853 def addFailure(self, test, err):
854 TestResult.addFailure(self, test, err)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000855 if self.showAll:
856 self.stream.writeln("FAIL")
857 elif self.dots:
858 self.stream.write('F')
Georg Brandld0632402008-05-11 15:17:41 +0000859 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +0000860
Benjamin Peterson692428e2009-03-23 21:50:21 +0000861 def addSkip(self, test, reason):
862 TestResult.addSkip(self, test, reason)
863 if self.showAll:
864 self.stream.writeln("skipped {0!r}".format(reason))
865 elif self.dots:
866 self.stream.write("s")
867 self.stream.flush()
868
869 def addExpectedFailure(self, test, err):
870 TestResult.addExpectedFailure(self, test, err)
871 if self.showAll:
872 self.stream.writeln("expected failure")
873 elif self.dots:
874 self.stream.write(".")
875 self.stream.flush()
876
877 def addUnexpectedSuccess(self, test):
878 TestResult.addUnexpectedSuccess(self, test)
879 if self.showAll:
880 self.stream.writeln("unexpected success")
881 elif self.dots:
882 self.stream.write(".")
883 self.stream.flush()
884
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000885 def printErrors(self):
886 if self.dots or self.showAll:
Fred Drake02538202001-03-21 18:09:46 +0000887 self.stream.writeln()
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000888 self.printErrorList('ERROR', self.errors)
889 self.printErrorList('FAIL', self.failures)
890
891 def printErrorList(self, flavour, errors):
892 for test, err in errors:
893 self.stream.writeln(self.separator1)
894 self.stream.writeln("%s: %s" % (flavour,self.getDescription(test)))
895 self.stream.writeln(self.separator2)
Steve Purcell7b065702001-09-06 08:24:40 +0000896 self.stream.writeln("%s" % err)
Fred Drake02538202001-03-21 18:09:46 +0000897
898
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000899class TextTestRunner(object):
Fred Drake02538202001-03-21 18:09:46 +0000900 """A test runner class that displays results in textual form.
Tim Petersa19a1682001-03-29 04:36:09 +0000901
Fred Drake02538202001-03-21 18:09:46 +0000902 It prints out the names of tests as they are run, errors as they
903 occur, and a summary of the results at the end of the test run.
904 """
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000905 def __init__(self, stream=sys.stderr, descriptions=1, verbosity=1):
Fred Drake02538202001-03-21 18:09:46 +0000906 self.stream = _WritelnDecorator(stream)
907 self.descriptions = descriptions
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000908 self.verbosity = verbosity
909
910 def _makeResult(self):
911 return _TextTestResult(self.stream, self.descriptions, self.verbosity)
Fred Drake02538202001-03-21 18:09:46 +0000912
913 def run(self, test):
914 "Run the given test case or test suite."
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000915 result = self._makeResult()
Fred Drake02538202001-03-21 18:09:46 +0000916 startTime = time.time()
917 test(result)
918 stopTime = time.time()
Steve Purcell397b45d2003-10-26 10:41:03 +0000919 timeTaken = stopTime - startTime
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000920 result.printErrors()
921 self.stream.writeln(result.separator2)
Fred Drake02538202001-03-21 18:09:46 +0000922 run = result.testsRun
923 self.stream.writeln("Ran %d test%s in %.3fs" %
Neal Norwitz76165042002-05-31 14:15:11 +0000924 (run, run != 1 and "s" or "", timeTaken))
Fred Drake02538202001-03-21 18:09:46 +0000925 self.stream.writeln()
Benjamin Petersoncb2b0e42009-03-23 22:29:45 +0000926 results = map(len, (result.expectedFailures,
927 result.unexpectedSuccesses,
Benjamin Peterson692428e2009-03-23 21:50:21 +0000928 result.skipped))
Benjamin Petersoncb2b0e42009-03-23 22:29:45 +0000929 expectedFails, unexpectedSuccesses, skipped = results
Benjamin Peterson692428e2009-03-23 21:50:21 +0000930 infos = []
Fred Drake02538202001-03-21 18:09:46 +0000931 if not result.wasSuccessful():
Benjamin Peterson692428e2009-03-23 21:50:21 +0000932 self.stream.write("FAILED")
Fred Drake02538202001-03-21 18:09:46 +0000933 failed, errored = map(len, (result.failures, result.errors))
934 if failed:
Benjamin Peterson692428e2009-03-23 21:50:21 +0000935 infos.append("failures=%d" % failed)
Fred Drake02538202001-03-21 18:09:46 +0000936 if errored:
Benjamin Peterson692428e2009-03-23 21:50:21 +0000937 infos.append("errors=%d" % errored)
Fred Drake02538202001-03-21 18:09:46 +0000938 else:
Benjamin Peterson692428e2009-03-23 21:50:21 +0000939 self.stream.write("OK")
940 if skipped:
941 infos.append("skipped=%d" % skipped)
942 if expected_fails:
943 infos.append("expected failures=%d" % expected_fails)
944 if unexpected_successes:
945 infos.append("unexpected successes=%d" % unexpected_successes)
946 if infos:
947 self.stream.writeln(" (%s)" % (", ".join(infos),))
Fred Drake02538202001-03-21 18:09:46 +0000948 return result
Tim Petersa19a1682001-03-29 04:36:09 +0000949
Fred Drake02538202001-03-21 18:09:46 +0000950
Fred Drake02538202001-03-21 18:09:46 +0000951
952##############################################################################
953# Facilities for running tests from the command line
954##############################################################################
955
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000956class TestProgram(object):
Fred Drake02538202001-03-21 18:09:46 +0000957 """A command-line program that runs a set of tests; this is primarily
958 for making test modules conveniently executable.
959 """
960 USAGE = """\
Steve Purcell17a781b2001-04-09 15:37:31 +0000961Usage: %(progName)s [options] [test] [...]
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000962
963Options:
964 -h, --help Show this message
965 -v, --verbose Verbose output
966 -q, --quiet Minimal output
Fred Drake02538202001-03-21 18:09:46 +0000967
968Examples:
969 %(progName)s - run default set of tests
970 %(progName)s MyTestSuite - run suite 'MyTestSuite'
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000971 %(progName)s MyTestCase.testSomething - run MyTestCase.testSomething
972 %(progName)s MyTestCase - run all 'test*' test methods
Fred Drake02538202001-03-21 18:09:46 +0000973 in MyTestCase
974"""
975 def __init__(self, module='__main__', defaultTest=None,
Georg Brandld0a96252007-03-07 09:21:06 +0000976 argv=None, testRunner=TextTestRunner,
977 testLoader=defaultTestLoader):
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000978 if isinstance(module, basestring):
Fred Drake02538202001-03-21 18:09:46 +0000979 self.module = __import__(module)
Steve Purcell7e743842003-09-22 11:08:12 +0000980 for part in module.split('.')[1:]:
Fred Drake02538202001-03-21 18:09:46 +0000981 self.module = getattr(self.module, part)
982 else:
983 self.module = module
984 if argv is None:
985 argv = sys.argv
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000986 self.verbosity = 1
Fred Drake02538202001-03-21 18:09:46 +0000987 self.defaultTest = defaultTest
988 self.testRunner = testRunner
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000989 self.testLoader = testLoader
Fred Drake02538202001-03-21 18:09:46 +0000990 self.progName = os.path.basename(argv[0])
991 self.parseArgs(argv)
Fred Drake02538202001-03-21 18:09:46 +0000992 self.runTests()
993
994 def usageExit(self, msg=None):
995 if msg: print msg
996 print self.USAGE % self.__dict__
997 sys.exit(2)
998
999 def parseArgs(self, argv):
1000 import getopt
Benjamin Peterson692428e2009-03-23 21:50:21 +00001001 long_opts = ['help','verbose','quiet']
Fred Drake02538202001-03-21 18:09:46 +00001002 try:
Benjamin Peterson692428e2009-03-23 21:50:21 +00001003 options, args = getopt.getopt(argv[1:], 'hHvq', long_opts)
Fred Drake02538202001-03-21 18:09:46 +00001004 for opt, value in options:
1005 if opt in ('-h','-H','--help'):
1006 self.usageExit()
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001007 if opt in ('-q','--quiet'):
1008 self.verbosity = 0
1009 if opt in ('-v','--verbose'):
1010 self.verbosity = 2
Fred Drake02538202001-03-21 18:09:46 +00001011 if len(args) == 0 and self.defaultTest is None:
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001012 self.test = self.testLoader.loadTestsFromModule(self.module)
1013 return
Fred Drake02538202001-03-21 18:09:46 +00001014 if len(args) > 0:
1015 self.testNames = args
1016 else:
1017 self.testNames = (self.defaultTest,)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001018 self.createTests()
Fred Drake02538202001-03-21 18:09:46 +00001019 except getopt.error, msg:
1020 self.usageExit(msg)
1021
1022 def createTests(self):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001023 self.test = self.testLoader.loadTestsFromNames(self.testNames,
1024 self.module)
Fred Drake02538202001-03-21 18:09:46 +00001025
1026 def runTests(self):
Georg Brandld0a96252007-03-07 09:21:06 +00001027 if isinstance(self.testRunner, (type, types.ClassType)):
1028 try:
1029 testRunner = self.testRunner(verbosity=self.verbosity)
1030 except TypeError:
1031 # didn't accept the verbosity argument
1032 testRunner = self.testRunner()
1033 else:
1034 # it is assumed to be a TestRunner instance
1035 testRunner = self.testRunner
1036 result = testRunner.run(self.test)
Tim Petersa19a1682001-03-29 04:36:09 +00001037 sys.exit(not result.wasSuccessful())
Fred Drake02538202001-03-21 18:09:46 +00001038
1039main = TestProgram
1040
1041
1042##############################################################################
1043# Executing this module from the command line
1044##############################################################################
1045
1046if __name__ == "__main__":
1047 main(module=None)