blob: 10b68ed6fdc99e9098f1d63735f460a9f62e0da5 [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
Benjamin Peterson4e4de332009-03-24 00:37:12 +000028 http://docs.python.org/library/unittest.html
Steve Purcell5ddd1a82001-03-22 08:45:36 +000029
Steve Purcell7e743842003-09-22 11:08:12 +000030Copyright (c) 1999-2003 Steve Purcell
Benjamin Peterson4e4de332009-03-24 00:37:12 +000031Copyright (c) 2003-2009 Python Software Foundation
Fred Drake02538202001-03-21 18:09:46 +000032This module is free software, and you may redistribute it and/or modify
33it under the same terms as Python itself, so long as this copyright message
34and disclaimer are retained in their original form.
35
36IN NO EVENT SHALL THE AUTHOR BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
37SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF
38THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
39DAMAGE.
40
41THE AUTHOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT
42LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
43PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS,
44AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
45SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
Steve Purcell5ddd1a82001-03-22 08:45:36 +000046'''
Fred Drake02538202001-03-21 18:09:46 +000047
Fred Drake02538202001-03-21 18:09:46 +000048import time
49import sys
50import traceback
Fred Drake02538202001-03-21 18:09:46 +000051import os
Steve Purcell5ddd1a82001-03-22 08:45:36 +000052import types
Benjamin Peterson692428e2009-03-23 21:50:21 +000053import functools
Fred Drake02538202001-03-21 18:09:46 +000054
55##############################################################################
Steve Purcelld75e7e42003-09-15 11:01:21 +000056# Exported classes and functions
57##############################################################################
Benjamin Petersonc750d4d2009-03-24 00:39:24 +000058__all__ = ['TestResult', 'TestCase', 'TestSuite', 'ClassTestSuite',
59 'TextTestRunner', 'TestLoader', 'FunctionTestCase', 'main',
Benjamin Peterson03715482009-03-24 01:11:37 +000060 'defaultTestLoader', 'SkipTest', 'skip', 'skipIf', 'skipUnless',
Benjamin Petersonc750d4d2009-03-24 00:39:24 +000061 'expectedFailure']
Steve Purcelld75e7e42003-09-15 11:01:21 +000062
Steve Purcell7e743842003-09-22 11:08:12 +000063# Expose obsolete functions for backwards compatibility
Steve Purcelld75e7e42003-09-15 11:01:21 +000064__all__.extend(['getTestCaseNames', 'makeSuite', 'findTestCases'])
65
66
67##############################################################################
Steve Purcell7e743842003-09-22 11:08:12 +000068# Backward compatibility
69##############################################################################
Steve Purcell7e743842003-09-22 11:08:12 +000070
Raymond Hettinger5930d8f2008-07-10 16:06:41 +000071def _CmpToKey(mycmp):
72 'Convert a cmp= function into a key= function'
73 class K(object):
74 def __init__(self, obj):
75 self.obj = obj
76 def __lt__(self, other):
77 return mycmp(self.obj, other.obj) == -1
78 return K
Steve Purcell7e743842003-09-22 11:08:12 +000079
80##############################################################################
Fred Drake02538202001-03-21 18:09:46 +000081# Test framework core
82##############################################################################
83
Steve Purcelldc391a62002-08-09 09:46:23 +000084def _strclass(cls):
85 return "%s.%s" % (cls.__module__, cls.__name__)
86
Benjamin Peterson692428e2009-03-23 21:50:21 +000087
88class SkipTest(Exception):
89 """
90 Raise this exception in a test to skip it.
91
92 Usually you can use TestResult.skip() or one of the skipping decorators
93 instead of raising this directly.
94 """
95 pass
96
97class _ExpectedFailure(Exception):
98 """
99 Raise this when a test is expected to fail.
100
101 This is an implementation detail.
102 """
103
104 def __init__(self, exc_info):
105 super(_ExpectedFailure, self).__init__()
106 self.exc_info = exc_info
107
108class _UnexpectedSuccess(Exception):
109 """
110 The test was supposed to fail, but it didn't!
111 """
112 pass
113
114def _id(obj):
115 return obj
116
117def skip(reason):
118 """
119 Unconditionally skip a test.
120 """
121 def decorator(test_item):
122 if isinstance(test_item, type) and issubclass(test_item, TestCase):
123 test_item.__unittest_skip__ = True
124 test_item.__unittest_skip_why__ = reason
125 return test_item
126 @functools.wraps(test_item)
127 def skip_wrapper(*args, **kwargs):
128 raise SkipTest(reason)
129 return skip_wrapper
130 return decorator
131
132def skipIf(condition, reason):
133 """
134 Skip a test if the condition is true.
135 """
136 if condition:
137 return skip(reason)
138 return _id
139
140def skipUnless(condition, reason):
141 """
142 Skip a test unless the condition is true.
143 """
144 if not condition:
145 return skip(reason)
146 return _id
147
148
149def expectedFailure(func):
150 @functools.wraps(func)
151 def wrapper(*args, **kwargs):
152 try:
153 func(*args, **kwargs)
154 except Exception:
155 raise _ExpectedFailure(sys.exc_info())
156 raise _UnexpectedSuccess
157 return wrapper
158
159
Steve Purcellb8d5f242003-12-06 13:03:13 +0000160__unittest = 1
161
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000162class TestResult(object):
Fred Drake02538202001-03-21 18:09:46 +0000163 """Holder for test result information.
164
165 Test results are automatically managed by the TestCase and TestSuite
166 classes, and do not need to be explicitly manipulated by writers of tests.
167
168 Each instance holds the total number of tests run, and collections of
169 failures and errors that occurred among those test runs. The collections
Steve Purcell7b065702001-09-06 08:24:40 +0000170 contain tuples of (testcase, exceptioninfo), where exceptioninfo is the
Fred Drake656f9ec2001-09-06 19:13:14 +0000171 formatted traceback of the error that occurred.
Fred Drake02538202001-03-21 18:09:46 +0000172 """
173 def __init__(self):
174 self.failures = []
175 self.errors = []
176 self.testsRun = 0
Benjamin Peterson692428e2009-03-23 21:50:21 +0000177 self.skipped = []
Benjamin Petersoncb2b0e42009-03-23 22:29:45 +0000178 self.expectedFailures = []
179 self.unexpectedSuccesses = []
Georg Brandl15c5ce92007-03-07 09:09:40 +0000180 self.shouldStop = False
Fred Drake02538202001-03-21 18:09:46 +0000181
182 def startTest(self, test):
183 "Called when the given test is about to be run"
184 self.testsRun = self.testsRun + 1
185
186 def stopTest(self, test):
187 "Called when the given test has been run"
188 pass
189
190 def addError(self, test, err):
Steve Purcell7b065702001-09-06 08:24:40 +0000191 """Called when an error has occurred. 'err' is a tuple of values as
192 returned by sys.exc_info().
193 """
Steve Purcellb8d5f242003-12-06 13:03:13 +0000194 self.errors.append((test, self._exc_info_to_string(err, test)))
Fred Drake02538202001-03-21 18:09:46 +0000195
196 def addFailure(self, test, err):
Steve Purcell7b065702001-09-06 08:24:40 +0000197 """Called when an error has occurred. 'err' is a tuple of values as
198 returned by sys.exc_info()."""
Steve Purcellb8d5f242003-12-06 13:03:13 +0000199 self.failures.append((test, self._exc_info_to_string(err, test)))
Fred Drake02538202001-03-21 18:09:46 +0000200
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000201 def addSuccess(self, test):
202 "Called when a test has completed successfully"
203 pass
204
Benjamin Peterson692428e2009-03-23 21:50:21 +0000205 def addSkip(self, test, reason):
206 """Called when a test is skipped."""
207 self.skipped.append((test, reason))
208
209 def addExpectedFailure(self, test, err):
210 """Called when an expected failure/error occured."""
Benjamin Petersoncb2b0e42009-03-23 22:29:45 +0000211 self.expectedFailures.append(
Benjamin Peterson692428e2009-03-23 21:50:21 +0000212 (test, self._exc_info_to_string(err, test)))
213
214 def addUnexpectedSuccess(self, test):
215 """Called when a test was expected to fail, but succeed."""
Benjamin Petersoncb2b0e42009-03-23 22:29:45 +0000216 self.unexpectedSuccesses.append(test)
Benjamin Peterson692428e2009-03-23 21:50:21 +0000217
Fred Drake02538202001-03-21 18:09:46 +0000218 def wasSuccessful(self):
219 "Tells whether or not this result was a success"
220 return len(self.failures) == len(self.errors) == 0
221
222 def stop(self):
223 "Indicates that the tests should be aborted"
Steve Purcell7e743842003-09-22 11:08:12 +0000224 self.shouldStop = True
Tim Petersa19a1682001-03-29 04:36:09 +0000225
Steve Purcellb8d5f242003-12-06 13:03:13 +0000226 def _exc_info_to_string(self, err, test):
Steve Purcell7b065702001-09-06 08:24:40 +0000227 """Converts a sys.exc_info()-style tuple of values into a string."""
Steve Purcellb8d5f242003-12-06 13:03:13 +0000228 exctype, value, tb = err
229 # Skip test runner traceback levels
230 while tb and self._is_relevant_tb_level(tb):
231 tb = tb.tb_next
232 if exctype is test.failureException:
233 # Skip assert*() traceback levels
234 length = self._count_relevant_tb_levels(tb)
235 return ''.join(traceback.format_exception(exctype, value, tb, length))
236 return ''.join(traceback.format_exception(exctype, value, tb))
237
238 def _is_relevant_tb_level(self, tb):
Georg Brandl56af5fc2008-07-18 19:30:10 +0000239 return '__unittest' in tb.tb_frame.f_globals
Steve Purcellb8d5f242003-12-06 13:03:13 +0000240
241 def _count_relevant_tb_levels(self, tb):
242 length = 0
243 while tb and not self._is_relevant_tb_level(tb):
244 length += 1
245 tb = tb.tb_next
246 return length
Steve Purcell7b065702001-09-06 08:24:40 +0000247
Fred Drake02538202001-03-21 18:09:46 +0000248 def __repr__(self):
249 return "<%s run=%i errors=%i failures=%i>" % \
Steve Purcelldc391a62002-08-09 09:46:23 +0000250 (_strclass(self.__class__), self.testsRun, len(self.errors),
Fred Drake02538202001-03-21 18:09:46 +0000251 len(self.failures))
252
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000253
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000254class AssertRaisesContext(object):
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000255
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000256 def __init__(self, expected, test_case):
257 self.expected = expected
258 self.failureException = test_case.failureException
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000259
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000260 def __enter__(self):
261 pass
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000262
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000263 def __exit__(self, exc_type, exc_value, traceback):
264 if exc_type is None:
265 try:
266 exc_name = self.expected.__name__
267 except AttributeError:
268 exc_name = str(self.expected)
269 raise self.failureException(
270 "{0} not raised".format(exc_name))
271 if issubclass(exc_type, self.expected):
272 return True
273 # Let unexpected exceptions skip through
274 return False
275
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000276
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000277class TestCase(object):
Fred Drake02538202001-03-21 18:09:46 +0000278 """A class whose instances are single test cases.
279
Fred Drake02538202001-03-21 18:09:46 +0000280 By default, the test code itself should be placed in a method named
281 'runTest'.
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000282
Tim Petersa19a1682001-03-29 04:36:09 +0000283 If the fixture may be used for many test cases, create as
Fred Drake02538202001-03-21 18:09:46 +0000284 many test methods as are needed. When instantiating such a TestCase
285 subclass, specify in the constructor arguments the name of the test method
286 that the instance is to execute.
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000287
Tim Petersa19a1682001-03-29 04:36:09 +0000288 Test authors should subclass TestCase for their own tests. Construction
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000289 and deconstruction of the test's environment ('fixture') can be
290 implemented by overriding the 'setUp' and 'tearDown' methods respectively.
291
292 If it is necessary to override the __init__ method, the base class
293 __init__ method must always be called. It is important that subclasses
294 should not change the signature of their __init__ method, since instances
295 of the classes are instantiated automatically by parts of the framework
296 in order to be run.
Fred Drake02538202001-03-21 18:09:46 +0000297 """
Steve Purcell15d89272001-04-12 09:05:01 +0000298
299 # This attribute determines which exception will be raised when
300 # the instance's assertion methods fail; test methods raising this
301 # exception will be deemed to have 'failed' rather than 'errored'
302
303 failureException = AssertionError
304
Fred Drake02538202001-03-21 18:09:46 +0000305 def __init__(self, methodName='runTest'):
306 """Create an instance of the class that will use the named test
307 method when executed. Raises a ValueError if the instance does
308 not have a method with the specified name.
309 """
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000310 self._testMethodName = methodName
Fred Drake02538202001-03-21 18:09:46 +0000311 try:
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000312 testMethod = getattr(self, methodName)
Fred Drake02538202001-03-21 18:09:46 +0000313 except AttributeError:
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000314 raise ValueError("no such test method in %s: %s" % \
315 (self.__class__, methodName))
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000316 self._testMethodDoc = testMethod.__doc__
Fred Drake02538202001-03-21 18:09:46 +0000317
318 def setUp(self):
319 "Hook method for setting up the test fixture before exercising it."
320 pass
321
322 def tearDown(self):
323 "Hook method for deconstructing the test fixture after testing it."
324 pass
325
326 def countTestCases(self):
327 return 1
328
329 def defaultTestResult(self):
330 return TestResult()
331
332 def shortDescription(self):
333 """Returns a one-line description of the test, or None if no
334 description has been provided.
335
336 The default implementation of this method returns the first line of
337 the specified test method's docstring.
338 """
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000339 doc = self._testMethodDoc
Steve Purcell7e743842003-09-22 11:08:12 +0000340 return doc and doc.split("\n")[0].strip() or None
Fred Drake02538202001-03-21 18:09:46 +0000341
342 def id(self):
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000343 return "%s.%s" % (_strclass(self.__class__), self._testMethodName)
Fred Drake02538202001-03-21 18:09:46 +0000344
Georg Brandl15c5ce92007-03-07 09:09:40 +0000345 def __eq__(self, other):
346 if type(self) is not type(other):
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000347 return NotImplemented
Georg Brandl15c5ce92007-03-07 09:09:40 +0000348
349 return self._testMethodName == other._testMethodName
350
351 def __ne__(self, other):
352 return not self == other
353
354 def __hash__(self):
Collin Winter9453e5d2007-03-09 23:30:39 +0000355 return hash((type(self), self._testMethodName))
Georg Brandl15c5ce92007-03-07 09:09:40 +0000356
Fred Drake02538202001-03-21 18:09:46 +0000357 def __str__(self):
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000358 return "%s (%s)" % (self._testMethodName, _strclass(self.__class__))
Fred Drake02538202001-03-21 18:09:46 +0000359
360 def __repr__(self):
361 return "<%s testMethod=%s>" % \
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000362 (_strclass(self.__class__), self._testMethodName)
Fred Drake02538202001-03-21 18:09:46 +0000363
364 def run(self, result=None):
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000365 if result is None:
366 result = self.defaultTestResult()
Fred Drake02538202001-03-21 18:09:46 +0000367 result.startTest(self)
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000368 testMethod = getattr(self, self._testMethodName)
Fred Drake02538202001-03-21 18:09:46 +0000369 try:
370 try:
371 self.setUp()
Benjamin Peterson692428e2009-03-23 21:50:21 +0000372 except SkipTest as e:
373 result.addSkip(self, str(e))
374 return
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000375 except Exception:
Benjamin Petersonc9301352009-03-26 16:32:23 +0000376 result.addError(self, sys.exc_info())
Fred Drake02538202001-03-21 18:09:46 +0000377 return
378
Benjamin Peterson692428e2009-03-23 21:50:21 +0000379 success = False
Fred Drake02538202001-03-21 18:09:46 +0000380 try:
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000381 testMethod()
Skip Montanaroae5c37b2003-07-13 15:18:12 +0000382 except self.failureException:
Benjamin Petersonc9301352009-03-26 16:32:23 +0000383 result.addFailure(self, sys.exc_info())
Benjamin Peterson692428e2009-03-23 21:50:21 +0000384 except _ExpectedFailure as e:
385 result.addExpectedFailure(self, e.exc_info)
386 except _UnexpectedSuccess:
387 result.addUnexpectedSuccess(self)
388 except SkipTest as e:
389 result.addSkip(self, str(e))
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000390 except Exception:
Benjamin Petersonc9301352009-03-26 16:32:23 +0000391 result.addError(self, sys.exc_info())
Benjamin Peterson692428e2009-03-23 21:50:21 +0000392 else:
393 success = True
Fred Drake02538202001-03-21 18:09:46 +0000394
395 try:
396 self.tearDown()
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000397 except Exception:
Benjamin Petersonc9301352009-03-26 16:32:23 +0000398 result.addError(self, sys.exc_info())
Benjamin Peterson692428e2009-03-23 21:50:21 +0000399 success = False
400 if success:
401 result.addSuccess(self)
Fred Drake02538202001-03-21 18:09:46 +0000402 finally:
403 result.stopTest(self)
404
Raymond Hettinger664347b2004-12-04 21:21:53 +0000405 def __call__(self, *args, **kwds):
406 return self.run(*args, **kwds)
Steve Purcell7e743842003-09-22 11:08:12 +0000407
Fred Drake02538202001-03-21 18:09:46 +0000408 def debug(self):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000409 """Run the test without collecting errors in a TestResult"""
Fred Drake02538202001-03-21 18:09:46 +0000410 self.setUp()
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000411 getattr(self, self._testMethodName)()
Fred Drake02538202001-03-21 18:09:46 +0000412 self.tearDown()
413
Benjamin Peterson47d97382009-03-26 20:05:50 +0000414 def skipTest(self, reason):
Benjamin Peterson692428e2009-03-23 21:50:21 +0000415 """Skip this test."""
416 raise SkipTest(reason)
417
Steve Purcell15d89272001-04-12 09:05:01 +0000418 def fail(self, msg=None):
419 """Fail immediately, with the given message."""
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000420 raise self.failureException(msg)
Fred Drake02538202001-03-21 18:09:46 +0000421
422 def failIf(self, expr, msg=None):
423 "Fail the test if the expression is true."
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000424 if expr:
425 raise self.failureException(msg)
Fred Drake02538202001-03-21 18:09:46 +0000426
Steve Purcell15d89272001-04-12 09:05:01 +0000427 def failUnless(self, expr, msg=None):
428 """Fail the test unless the expression is true."""
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000429 if not expr:
430 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
Georg Brandl15c5ce92007-03-07 09:09:40 +0000524 def __eq__(self, other):
Benjamin Peterson692428e2009-03-23 21:50:21 +0000525 if not isinstance(other, self.__class__):
526 return NotImplemented
Georg Brandl15c5ce92007-03-07 09:09:40 +0000527 return self._tests == other._tests
528
529 def __ne__(self, other):
530 return not self == other
531
Nick Coghlan48361f52008-08-11 15:45:58 +0000532 # Can't guarantee hash invariant, so flag as unhashable
533 __hash__ = None
534
Jim Fultonfafd8742004-08-28 15:22:12 +0000535 def __iter__(self):
536 return iter(self._tests)
537
Fred Drake02538202001-03-21 18:09:46 +0000538 def countTestCases(self):
539 cases = 0
540 for test in self._tests:
Steve Purcell7e743842003-09-22 11:08:12 +0000541 cases += test.countTestCases()
Fred Drake02538202001-03-21 18:09:46 +0000542 return cases
543
544 def addTest(self, test):
Georg Brandld9e50262007-03-07 11:54:49 +0000545 # sanity checks
Raymond Hettinger5930d8f2008-07-10 16:06:41 +0000546 if not hasattr(test, '__call__'):
Georg Brandld9e50262007-03-07 11:54:49 +0000547 raise TypeError("the test to add must be callable")
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000548 if isinstance(test, type) and issubclass(test, (TestCase, TestSuite)):
Georg Brandld9e50262007-03-07 11:54:49 +0000549 raise TypeError("TestCases and TestSuites must be instantiated "
550 "before passing them to addTest()")
Fred Drake02538202001-03-21 18:09:46 +0000551 self._tests.append(test)
552
553 def addTests(self, tests):
Georg Brandld9e50262007-03-07 11:54:49 +0000554 if isinstance(tests, basestring):
555 raise TypeError("tests must be an iterable of tests, not a string")
Fred Drake02538202001-03-21 18:09:46 +0000556 for test in tests:
557 self.addTest(test)
558
559 def run(self, result):
Fred Drake02538202001-03-21 18:09:46 +0000560 for test in self._tests:
561 if result.shouldStop:
562 break
563 test(result)
564 return result
565
Raymond Hettinger664347b2004-12-04 21:21:53 +0000566 def __call__(self, *args, **kwds):
567 return self.run(*args, **kwds)
568
Fred Drake02538202001-03-21 18:09:46 +0000569 def debug(self):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000570 """Run the tests without collecting errors in a TestResult"""
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000571 for test in self._tests:
572 test.debug()
Fred Drake02538202001-03-21 18:09:46 +0000573
574
Benjamin Peterson692428e2009-03-23 21:50:21 +0000575class ClassTestSuite(TestSuite):
576 """
577 Suite of tests derived from a single TestCase class.
578 """
579
580 def __init__(self, tests, class_collected_from):
581 super(ClassTestSuite, self).__init__(tests)
582 self.collected_from = class_collected_from
583
584 def id(self):
585 module = getattr(self.collected_from, "__module__", None)
586 if module is not None:
587 return "{0}.{1}".format(module, self.collected_from.__name__)
588 return self.collected_from.__name__
589
590 def run(self, result):
591 if getattr(self.collected_from, "__unittest_skip__", False):
592 # ClassTestSuite result pretends to be a TestCase enough to be
593 # reported.
594 result.startTest(self)
595 try:
596 result.addSkip(self, self.collected_from.__unittest_skip_why__)
597 finally:
598 result.stopTest(self)
599 else:
600 result = super(ClassTestSuite, self).run(result)
601 return result
602
603 shortDescription = id
604
605
Fred Drake02538202001-03-21 18:09:46 +0000606class FunctionTestCase(TestCase):
607 """A test case that wraps a test function.
608
609 This is useful for slipping pre-existing test functions into the
Georg Brandl15c5ce92007-03-07 09:09:40 +0000610 unittest framework. Optionally, set-up and tidy-up functions can be
Fred Drake02538202001-03-21 18:09:46 +0000611 supplied. As with TestCase, the tidy-up ('tearDown') function will
612 always be called if the set-up ('setUp') function ran successfully.
613 """
614
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000615 def __init__(self, testFunc, setUp=None, tearDown=None, description=None):
616 super(FunctionTestCase, self).__init__()
Fred Drake02538202001-03-21 18:09:46 +0000617 self.__setUpFunc = setUp
618 self.__tearDownFunc = tearDown
619 self.__testFunc = testFunc
620 self.__description = description
621
622 def setUp(self):
623 if self.__setUpFunc is not None:
624 self.__setUpFunc()
625
626 def tearDown(self):
627 if self.__tearDownFunc is not None:
628 self.__tearDownFunc()
629
630 def runTest(self):
631 self.__testFunc()
632
633 def id(self):
634 return self.__testFunc.__name__
635
Georg Brandl15c5ce92007-03-07 09:09:40 +0000636 def __eq__(self, other):
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000637 if not isinstance(other, self.__class__):
638 return NotImplemented
Georg Brandl15c5ce92007-03-07 09:09:40 +0000639
640 return self.__setUpFunc == other.__setUpFunc and \
641 self.__tearDownFunc == other.__tearDownFunc and \
642 self.__testFunc == other.__testFunc and \
643 self.__description == other.__description
644
645 def __ne__(self, other):
646 return not self == other
647
648 def __hash__(self):
Collin Winter9453e5d2007-03-09 23:30:39 +0000649 return hash((type(self), self.__setUpFunc, self.__tearDownFunc,
650 self.__testFunc, self.__description))
Georg Brandl15c5ce92007-03-07 09:09:40 +0000651
Fred Drake02538202001-03-21 18:09:46 +0000652 def __str__(self):
Steve Purcelldc391a62002-08-09 09:46:23 +0000653 return "%s (%s)" % (_strclass(self.__class__), self.__testFunc.__name__)
Fred Drake02538202001-03-21 18:09:46 +0000654
655 def __repr__(self):
Steve Purcelldc391a62002-08-09 09:46:23 +0000656 return "<%s testFunc=%s>" % (_strclass(self.__class__), self.__testFunc)
Fred Drake02538202001-03-21 18:09:46 +0000657
658 def shortDescription(self):
659 if self.__description is not None: return self.__description
660 doc = self.__testFunc.__doc__
Steve Purcell7e743842003-09-22 11:08:12 +0000661 return doc and doc.split("\n")[0].strip() or None
Fred Drake02538202001-03-21 18:09:46 +0000662
663
664
665##############################################################################
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000666# Locating and loading tests
Fred Drake02538202001-03-21 18:09:46 +0000667##############################################################################
668
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000669class TestLoader(object):
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000670 """
671 This class is responsible for loading tests according to various criteria
672 and returning them wrapped in a TestSuite
Fred Drake02538202001-03-21 18:09:46 +0000673 """
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000674 testMethodPrefix = 'test'
675 sortTestMethodsUsing = cmp
676 suiteClass = TestSuite
Benjamin Peterson692428e2009-03-23 21:50:21 +0000677 classSuiteClass = ClassTestSuite
Fred Drake02538202001-03-21 18:09:46 +0000678
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000679 def loadTestsFromTestCase(self, testCaseClass):
Steve Purcell15d89272001-04-12 09:05:01 +0000680 """Return a suite of all tests cases contained in testCaseClass"""
Johannes Gijsbersd7b6ad42004-11-07 15:46:25 +0000681 if issubclass(testCaseClass, TestSuite):
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000682 raise TypeError("Test cases should not be derived from TestSuite." \
683 " Maybe you meant to derive from TestCase?")
Steve Purcell7e743842003-09-22 11:08:12 +0000684 testCaseNames = self.getTestCaseNames(testCaseClass)
685 if not testCaseNames and hasattr(testCaseClass, 'runTest'):
686 testCaseNames = ['runTest']
Benjamin Peterson692428e2009-03-23 21:50:21 +0000687 suite = self.classSuiteClass(map(testCaseClass, testCaseNames),
688 testCaseClass)
689 return suite
Fred Drake02538202001-03-21 18:09:46 +0000690
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000691 def loadTestsFromModule(self, module):
Steve Purcell15d89272001-04-12 09:05:01 +0000692 """Return a suite of all tests cases contained in the given module"""
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000693 tests = []
694 for name in dir(module):
695 obj = getattr(module, name)
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000696 if isinstance(obj, type) and issubclass(obj, TestCase):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000697 tests.append(self.loadTestsFromTestCase(obj))
698 return self.suiteClass(tests)
Fred Drake02538202001-03-21 18:09:46 +0000699
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000700 def loadTestsFromName(self, name, module=None):
Steve Purcell15d89272001-04-12 09:05:01 +0000701 """Return a suite of all tests cases given a string specifier.
702
703 The name may resolve either to a module, a test case class, a
704 test method within a test case class, or a callable object which
705 returns a TestCase or TestSuite instance.
Tim Peters613b2222001-04-13 05:37:27 +0000706
Steve Purcell15d89272001-04-12 09:05:01 +0000707 The method optionally resolves the names relative to a given module.
708 """
Steve Purcell7e743842003-09-22 11:08:12 +0000709 parts = name.split('.')
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000710 if module is None:
Steve Purcell7e743842003-09-22 11:08:12 +0000711 parts_copy = parts[:]
712 while parts_copy:
713 try:
714 module = __import__('.'.join(parts_copy))
715 break
716 except ImportError:
717 del parts_copy[-1]
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000718 if not parts_copy:
719 raise
Armin Rigo1b3c04b2003-10-24 17:15:29 +0000720 parts = parts[1:]
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000721 obj = module
722 for part in parts:
Steve Purcell7e743842003-09-22 11:08:12 +0000723 parent, obj = obj, getattr(obj, part)
Fred Drake02538202001-03-21 18:09:46 +0000724
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000725 if isinstance(obj, types.ModuleType):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000726 return self.loadTestsFromModule(obj)
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000727 elif isinstance(obj, type) and issubclass(obj, TestCase):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000728 return self.loadTestsFromTestCase(obj)
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000729 elif (isinstance(obj, types.UnboundMethodType) and
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000730 isinstance(parent, type) and
Georg Brandl15c5ce92007-03-07 09:09:40 +0000731 issubclass(parent, TestCase)):
732 return TestSuite([parent(obj.__name__)])
Steve Purcell397b45d2003-10-26 10:41:03 +0000733 elif isinstance(obj, TestSuite):
Steve Purcell7e743842003-09-22 11:08:12 +0000734 return obj
Raymond Hettinger5930d8f2008-07-10 16:06:41 +0000735 elif hasattr(obj, '__call__'):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000736 test = obj()
Georg Brandl15c5ce92007-03-07 09:09:40 +0000737 if isinstance(test, TestSuite):
738 return test
739 elif isinstance(test, TestCase):
740 return TestSuite([test])
741 else:
742 raise TypeError("calling %s returned %s, not a test" %
743 (obj, test))
Fred Drake02538202001-03-21 18:09:46 +0000744 else:
Georg Brandl15c5ce92007-03-07 09:09:40 +0000745 raise TypeError("don't know how to make test from: %s" % obj)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000746
747 def loadTestsFromNames(self, names, module=None):
Steve Purcell15d89272001-04-12 09:05:01 +0000748 """Return a suite of all tests cases found using the given sequence
749 of string specifiers. See 'loadTestsFromName()'.
750 """
Steve Purcell7e743842003-09-22 11:08:12 +0000751 suites = [self.loadTestsFromName(name, module) for name in names]
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000752 return self.suiteClass(suites)
753
754 def getTestCaseNames(self, testCaseClass):
Steve Purcell15d89272001-04-12 09:05:01 +0000755 """Return a sorted sequence of method names found within testCaseClass
756 """
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000757 def isTestMethod(attrname, testCaseClass=testCaseClass,
758 prefix=self.testMethodPrefix):
759 return attrname.startswith(prefix) and \
760 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):
Benjamin Petersond0cdb2d2009-03-24 23:07:07 +0000805 if arg:
806 self.write(arg)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000807 self.write('\n') # text-mode streams translate to \r\n if needed
Tim Petersa19a1682001-03-29 04:36:09 +0000808
Fred Drake02538202001-03-21 18:09:46 +0000809
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000810class _TextTestResult(TestResult):
Fred Drake02538202001-03-21 18:09:46 +0000811 """A test result class that can print formatted text results to a stream.
812
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000813 Used by TextTestRunner.
Fred Drake02538202001-03-21 18:09:46 +0000814 """
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000815 separator1 = '=' * 70
816 separator2 = '-' * 70
Fred Drake02538202001-03-21 18:09:46 +0000817
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000818 def __init__(self, stream, descriptions, verbosity):
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000819 super(_TextTestResult, self).__init__()
Fred Drake02538202001-03-21 18:09:46 +0000820 self.stream = stream
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000821 self.showAll = verbosity > 1
822 self.dots = verbosity == 1
Fred Drake02538202001-03-21 18:09:46 +0000823 self.descriptions = descriptions
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000824
825 def getDescription(self, test):
826 if self.descriptions:
827 return test.shortDescription() or str(test)
828 else:
829 return str(test)
830
Fred Drake02538202001-03-21 18:09:46 +0000831 def startTest(self, test):
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000832 super(_TextTestResult, self).startTest(test)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000833 if self.showAll:
834 self.stream.write(self.getDescription(test))
835 self.stream.write(" ... ")
Georg Brandld0632402008-05-11 15:17:41 +0000836 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +0000837
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000838 def addSuccess(self, test):
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000839 super(_TextTestResult, self).addSuccess(test)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000840 if self.showAll:
Fred Drake02538202001-03-21 18:09:46 +0000841 self.stream.writeln("ok")
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000842 elif self.dots:
843 self.stream.write('.')
Georg Brandld0632402008-05-11 15:17:41 +0000844 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +0000845
846 def addError(self, test, err):
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000847 super(_TextTestResult, self).addError(test, err)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000848 if self.showAll:
849 self.stream.writeln("ERROR")
850 elif self.dots:
851 self.stream.write('E')
Georg Brandld0632402008-05-11 15:17:41 +0000852 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +0000853
854 def addFailure(self, test, err):
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000855 super(_TextTestResult, self).addFailure(test, err)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000856 if self.showAll:
857 self.stream.writeln("FAIL")
858 elif self.dots:
859 self.stream.write('F')
Georg Brandld0632402008-05-11 15:17:41 +0000860 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +0000861
Benjamin Peterson692428e2009-03-23 21:50:21 +0000862 def addSkip(self, test, reason):
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000863 super(_TextTestResult, self).addSkip(test, reason)
Benjamin Peterson692428e2009-03-23 21:50:21 +0000864 if self.showAll:
865 self.stream.writeln("skipped {0!r}".format(reason))
866 elif self.dots:
867 self.stream.write("s")
868 self.stream.flush()
869
870 def addExpectedFailure(self, test, err):
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000871 super(_TextTestResult, self).addExpectedFailure(test, err)
Benjamin Peterson692428e2009-03-23 21:50:21 +0000872 if self.showAll:
873 self.stream.writeln("expected failure")
874 elif self.dots:
Benjamin Petersona8adceb2009-03-25 21:24:04 +0000875 self.stream.write("x")
Benjamin Peterson692428e2009-03-23 21:50:21 +0000876 self.stream.flush()
877
878 def addUnexpectedSuccess(self, test):
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000879 super(_TextTestResult, self).addUnexpectedSuccess(test)
Benjamin Peterson692428e2009-03-23 21:50:21 +0000880 if self.showAll:
881 self.stream.writeln("unexpected success")
882 elif self.dots:
Benjamin Petersona8adceb2009-03-25 21:24:04 +0000883 self.stream.write("u")
Benjamin Peterson692428e2009-03-23 21:50:21 +0000884 self.stream.flush()
885
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000886 def printErrors(self):
887 if self.dots or self.showAll:
Fred Drake02538202001-03-21 18:09:46 +0000888 self.stream.writeln()
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000889 self.printErrorList('ERROR', self.errors)
890 self.printErrorList('FAIL', self.failures)
891
892 def printErrorList(self, flavour, errors):
893 for test, err in errors:
894 self.stream.writeln(self.separator1)
895 self.stream.writeln("%s: %s" % (flavour,self.getDescription(test)))
896 self.stream.writeln(self.separator2)
Steve Purcell7b065702001-09-06 08:24:40 +0000897 self.stream.writeln("%s" % err)
Fred Drake02538202001-03-21 18:09:46 +0000898
899
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000900class TextTestRunner(object):
Fred Drake02538202001-03-21 18:09:46 +0000901 """A test runner class that displays results in textual form.
Tim Petersa19a1682001-03-29 04:36:09 +0000902
Fred Drake02538202001-03-21 18:09:46 +0000903 It prints out the names of tests as they are run, errors as they
904 occur, and a summary of the results at the end of the test run.
905 """
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000906 def __init__(self, stream=sys.stderr, descriptions=1, verbosity=1):
Fred Drake02538202001-03-21 18:09:46 +0000907 self.stream = _WritelnDecorator(stream)
908 self.descriptions = descriptions
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000909 self.verbosity = verbosity
910
911 def _makeResult(self):
912 return _TextTestResult(self.stream, self.descriptions, self.verbosity)
Fred Drake02538202001-03-21 18:09:46 +0000913
914 def run(self, test):
915 "Run the given test case or test suite."
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000916 result = self._makeResult()
Fred Drake02538202001-03-21 18:09:46 +0000917 startTime = time.time()
918 test(result)
919 stopTime = time.time()
Steve Purcell397b45d2003-10-26 10:41:03 +0000920 timeTaken = stopTime - startTime
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000921 result.printErrors()
922 self.stream.writeln(result.separator2)
Fred Drake02538202001-03-21 18:09:46 +0000923 run = result.testsRun
924 self.stream.writeln("Ran %d test%s in %.3fs" %
Neal Norwitz76165042002-05-31 14:15:11 +0000925 (run, run != 1 and "s" or "", timeTaken))
Fred Drake02538202001-03-21 18:09:46 +0000926 self.stream.writeln()
Benjamin Petersoncb2b0e42009-03-23 22:29:45 +0000927 results = map(len, (result.expectedFailures,
928 result.unexpectedSuccesses,
Benjamin Peterson692428e2009-03-23 21:50:21 +0000929 result.skipped))
Benjamin Petersoncb2b0e42009-03-23 22:29:45 +0000930 expectedFails, unexpectedSuccesses, skipped = results
Benjamin Peterson692428e2009-03-23 21:50:21 +0000931 infos = []
Fred Drake02538202001-03-21 18:09:46 +0000932 if not result.wasSuccessful():
Benjamin Peterson692428e2009-03-23 21:50:21 +0000933 self.stream.write("FAILED")
Fred Drake02538202001-03-21 18:09:46 +0000934 failed, errored = map(len, (result.failures, result.errors))
935 if failed:
Benjamin Peterson692428e2009-03-23 21:50:21 +0000936 infos.append("failures=%d" % failed)
Fred Drake02538202001-03-21 18:09:46 +0000937 if errored:
Benjamin Peterson692428e2009-03-23 21:50:21 +0000938 infos.append("errors=%d" % errored)
Fred Drake02538202001-03-21 18:09:46 +0000939 else:
Benjamin Petersona473f002009-03-24 22:56:32 +0000940 self.stream.write("OK")
Benjamin Peterson692428e2009-03-23 21:50:21 +0000941 if skipped:
942 infos.append("skipped=%d" % skipped)
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000943 if expectedFails:
944 infos.append("expected failures=%d" % expectedFails)
945 if unexpectedSuccesses:
946 infos.append("unexpected successes=%d" % unexpectedSuccesses)
Benjamin Peterson692428e2009-03-23 21:50:21 +0000947 if infos:
948 self.stream.writeln(" (%s)" % (", ".join(infos),))
Benjamin Petersona473f002009-03-24 22:56:32 +0000949 else:
950 self.stream.write("\n")
Fred Drake02538202001-03-21 18:09:46 +0000951 return result
Tim Petersa19a1682001-03-29 04:36:09 +0000952
Fred Drake02538202001-03-21 18:09:46 +0000953
Fred Drake02538202001-03-21 18:09:46 +0000954
955##############################################################################
956# Facilities for running tests from the command line
957##############################################################################
958
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000959class TestProgram(object):
Fred Drake02538202001-03-21 18:09:46 +0000960 """A command-line program that runs a set of tests; this is primarily
961 for making test modules conveniently executable.
962 """
963 USAGE = """\
Steve Purcell17a781b2001-04-09 15:37:31 +0000964Usage: %(progName)s [options] [test] [...]
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000965
966Options:
967 -h, --help Show this message
968 -v, --verbose Verbose output
969 -q, --quiet Minimal output
Fred Drake02538202001-03-21 18:09:46 +0000970
971Examples:
972 %(progName)s - run default set of tests
973 %(progName)s MyTestSuite - run suite 'MyTestSuite'
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000974 %(progName)s MyTestCase.testSomething - run MyTestCase.testSomething
975 %(progName)s MyTestCase - run all 'test*' test methods
Fred Drake02538202001-03-21 18:09:46 +0000976 in MyTestCase
977"""
978 def __init__(self, module='__main__', defaultTest=None,
Georg Brandld0a96252007-03-07 09:21:06 +0000979 argv=None, testRunner=TextTestRunner,
980 testLoader=defaultTestLoader):
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000981 if isinstance(module, basestring):
Fred Drake02538202001-03-21 18:09:46 +0000982 self.module = __import__(module)
Steve Purcell7e743842003-09-22 11:08:12 +0000983 for part in module.split('.')[1:]:
Fred Drake02538202001-03-21 18:09:46 +0000984 self.module = getattr(self.module, part)
985 else:
986 self.module = module
987 if argv is None:
988 argv = sys.argv
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000989 self.verbosity = 1
Fred Drake02538202001-03-21 18:09:46 +0000990 self.defaultTest = defaultTest
991 self.testRunner = testRunner
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000992 self.testLoader = testLoader
Fred Drake02538202001-03-21 18:09:46 +0000993 self.progName = os.path.basename(argv[0])
994 self.parseArgs(argv)
Fred Drake02538202001-03-21 18:09:46 +0000995 self.runTests()
996
997 def usageExit(self, msg=None):
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000998 if msg:
999 print msg
Fred Drake02538202001-03-21 18:09:46 +00001000 print self.USAGE % self.__dict__
1001 sys.exit(2)
1002
1003 def parseArgs(self, argv):
1004 import getopt
Benjamin Peterson692428e2009-03-23 21:50:21 +00001005 long_opts = ['help','verbose','quiet']
Fred Drake02538202001-03-21 18:09:46 +00001006 try:
Benjamin Peterson692428e2009-03-23 21:50:21 +00001007 options, args = getopt.getopt(argv[1:], 'hHvq', long_opts)
Fred Drake02538202001-03-21 18:09:46 +00001008 for opt, value in options:
1009 if opt in ('-h','-H','--help'):
1010 self.usageExit()
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001011 if opt in ('-q','--quiet'):
1012 self.verbosity = 0
1013 if opt in ('-v','--verbose'):
1014 self.verbosity = 2
Fred Drake02538202001-03-21 18:09:46 +00001015 if len(args) == 0 and self.defaultTest is None:
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001016 self.test = self.testLoader.loadTestsFromModule(self.module)
1017 return
Fred Drake02538202001-03-21 18:09:46 +00001018 if len(args) > 0:
1019 self.testNames = args
1020 else:
1021 self.testNames = (self.defaultTest,)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001022 self.createTests()
Fred Drake02538202001-03-21 18:09:46 +00001023 except getopt.error, msg:
1024 self.usageExit(msg)
1025
1026 def createTests(self):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001027 self.test = self.testLoader.loadTestsFromNames(self.testNames,
1028 self.module)
Fred Drake02538202001-03-21 18:09:46 +00001029
1030 def runTests(self):
Georg Brandld0a96252007-03-07 09:21:06 +00001031 if isinstance(self.testRunner, (type, types.ClassType)):
1032 try:
1033 testRunner = self.testRunner(verbosity=self.verbosity)
1034 except TypeError:
1035 # didn't accept the verbosity argument
1036 testRunner = self.testRunner()
1037 else:
1038 # it is assumed to be a TestRunner instance
1039 testRunner = self.testRunner
1040 result = testRunner.run(self.test)
Tim Petersa19a1682001-03-29 04:36:09 +00001041 sys.exit(not result.wasSuccessful())
Fred Drake02538202001-03-21 18:09:46 +00001042
1043main = TestProgram
1044
1045
1046##############################################################################
1047# Executing this module from the command line
1048##############################################################################
1049
1050if __name__ == "__main__":
1051 main(module=None)