blob: 3eedd56511c2abc147b09fac2f2a509e5a3c346d [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*'
Gregory P. Smith28399852009-03-31 16:54:10 +000017 self.assertEqual((1 + 2), 3)
18 self.assertEqual(0 + 1, 1)
Steve Purcell7b065702001-09-06 08:24:40 +000019 def testMultiply(self):
Gregory P. Smith28399852009-03-31 16:54:10 +000020 self.assertEqual((0 * 10), 0)
21 self.assertEqual((5 * 8), 40)
Steve Purcell5ddd1a82001-03-22 08:45:36 +000022
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
Gregory P. Smith28399852009-03-31 16:54:10 +000048import difflib
Benjamin Peterson692428e2009-03-23 21:50:21 +000049import functools
Gregory P. Smith28399852009-03-31 16:54:10 +000050import os
51import pprint
52import re
53import sys
54import time
55import traceback
56import types
Gregory P. Smith65ff0052009-03-31 19:59:14 +000057import warnings
Fred Drake02538202001-03-21 18:09:46 +000058
59##############################################################################
Steve Purcelld75e7e42003-09-15 11:01:21 +000060# Exported classes and functions
61##############################################################################
Benjamin Petersonc750d4d2009-03-24 00:39:24 +000062__all__ = ['TestResult', 'TestCase', 'TestSuite', 'ClassTestSuite',
63 'TextTestRunner', 'TestLoader', 'FunctionTestCase', 'main',
Benjamin Peterson03715482009-03-24 01:11:37 +000064 'defaultTestLoader', 'SkipTest', 'skip', 'skipIf', 'skipUnless',
Benjamin Petersonc750d4d2009-03-24 00:39:24 +000065 'expectedFailure']
Steve Purcelld75e7e42003-09-15 11:01:21 +000066
Steve Purcell7e743842003-09-22 11:08:12 +000067# Expose obsolete functions for backwards compatibility
Steve Purcelld75e7e42003-09-15 11:01:21 +000068__all__.extend(['getTestCaseNames', 'makeSuite', 'findTestCases'])
69
70
71##############################################################################
Steve Purcell7e743842003-09-22 11:08:12 +000072# Backward compatibility
73##############################################################################
Steve Purcell7e743842003-09-22 11:08:12 +000074
Raymond Hettinger5930d8f2008-07-10 16:06:41 +000075def _CmpToKey(mycmp):
76 'Convert a cmp= function into a key= function'
77 class K(object):
78 def __init__(self, obj):
79 self.obj = obj
80 def __lt__(self, other):
81 return mycmp(self.obj, other.obj) == -1
82 return K
Steve Purcell7e743842003-09-22 11:08:12 +000083
84##############################################################################
Fred Drake02538202001-03-21 18:09:46 +000085# Test framework core
86##############################################################################
87
Steve Purcelldc391a62002-08-09 09:46:23 +000088def _strclass(cls):
89 return "%s.%s" % (cls.__module__, cls.__name__)
90
Benjamin Peterson692428e2009-03-23 21:50:21 +000091
92class SkipTest(Exception):
93 """
94 Raise this exception in a test to skip it.
95
96 Usually you can use TestResult.skip() or one of the skipping decorators
97 instead of raising this directly.
98 """
99 pass
100
101class _ExpectedFailure(Exception):
102 """
103 Raise this when a test is expected to fail.
104
105 This is an implementation detail.
106 """
107
108 def __init__(self, exc_info):
109 super(_ExpectedFailure, self).__init__()
110 self.exc_info = exc_info
111
112class _UnexpectedSuccess(Exception):
113 """
114 The test was supposed to fail, but it didn't!
115 """
116 pass
117
118def _id(obj):
119 return obj
120
121def skip(reason):
122 """
123 Unconditionally skip a test.
124 """
125 def decorator(test_item):
126 if isinstance(test_item, type) and issubclass(test_item, TestCase):
127 test_item.__unittest_skip__ = True
128 test_item.__unittest_skip_why__ = reason
129 return test_item
130 @functools.wraps(test_item)
131 def skip_wrapper(*args, **kwargs):
132 raise SkipTest(reason)
133 return skip_wrapper
134 return decorator
135
136def skipIf(condition, reason):
137 """
138 Skip a test if the condition is true.
139 """
140 if condition:
141 return skip(reason)
142 return _id
143
144def skipUnless(condition, reason):
145 """
146 Skip a test unless the condition is true.
147 """
148 if not condition:
149 return skip(reason)
150 return _id
151
152
153def expectedFailure(func):
154 @functools.wraps(func)
155 def wrapper(*args, **kwargs):
156 try:
157 func(*args, **kwargs)
158 except Exception:
159 raise _ExpectedFailure(sys.exc_info())
160 raise _UnexpectedSuccess
161 return wrapper
162
Steve Purcellb8d5f242003-12-06 13:03:13 +0000163__unittest = 1
164
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000165class TestResult(object):
Fred Drake02538202001-03-21 18:09:46 +0000166 """Holder for test result information.
167
168 Test results are automatically managed by the TestCase and TestSuite
169 classes, and do not need to be explicitly manipulated by writers of tests.
170
171 Each instance holds the total number of tests run, and collections of
172 failures and errors that occurred among those test runs. The collections
Steve Purcell7b065702001-09-06 08:24:40 +0000173 contain tuples of (testcase, exceptioninfo), where exceptioninfo is the
Fred Drake656f9ec2001-09-06 19:13:14 +0000174 formatted traceback of the error that occurred.
Fred Drake02538202001-03-21 18:09:46 +0000175 """
176 def __init__(self):
177 self.failures = []
178 self.errors = []
179 self.testsRun = 0
Benjamin Peterson692428e2009-03-23 21:50:21 +0000180 self.skipped = []
Benjamin Petersoncb2b0e42009-03-23 22:29:45 +0000181 self.expectedFailures = []
182 self.unexpectedSuccesses = []
Georg Brandl15c5ce92007-03-07 09:09:40 +0000183 self.shouldStop = False
Fred Drake02538202001-03-21 18:09:46 +0000184
185 def startTest(self, test):
186 "Called when the given test is about to be run"
187 self.testsRun = self.testsRun + 1
188
189 def stopTest(self, test):
190 "Called when the given test has been run"
191 pass
192
193 def addError(self, test, err):
Steve Purcell7b065702001-09-06 08:24:40 +0000194 """Called when an error has occurred. 'err' is a tuple of values as
195 returned by sys.exc_info().
196 """
Steve Purcellb8d5f242003-12-06 13:03:13 +0000197 self.errors.append((test, self._exc_info_to_string(err, test)))
Fred Drake02538202001-03-21 18:09:46 +0000198
199 def addFailure(self, test, err):
Steve Purcell7b065702001-09-06 08:24:40 +0000200 """Called when an error has occurred. 'err' is a tuple of values as
201 returned by sys.exc_info()."""
Steve Purcellb8d5f242003-12-06 13:03:13 +0000202 self.failures.append((test, self._exc_info_to_string(err, test)))
Fred Drake02538202001-03-21 18:09:46 +0000203
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000204 def addSuccess(self, test):
205 "Called when a test has completed successfully"
206 pass
207
Benjamin Peterson692428e2009-03-23 21:50:21 +0000208 def addSkip(self, test, reason):
209 """Called when a test is skipped."""
210 self.skipped.append((test, reason))
211
212 def addExpectedFailure(self, test, err):
213 """Called when an expected failure/error occured."""
Benjamin Petersoncb2b0e42009-03-23 22:29:45 +0000214 self.expectedFailures.append(
Benjamin Peterson692428e2009-03-23 21:50:21 +0000215 (test, self._exc_info_to_string(err, test)))
216
217 def addUnexpectedSuccess(self, test):
218 """Called when a test was expected to fail, but succeed."""
Benjamin Petersoncb2b0e42009-03-23 22:29:45 +0000219 self.unexpectedSuccesses.append(test)
Benjamin Peterson692428e2009-03-23 21:50:21 +0000220
Fred Drake02538202001-03-21 18:09:46 +0000221 def wasSuccessful(self):
222 "Tells whether or not this result was a success"
223 return len(self.failures) == len(self.errors) == 0
224
225 def stop(self):
226 "Indicates that the tests should be aborted"
Steve Purcell7e743842003-09-22 11:08:12 +0000227 self.shouldStop = True
Tim Petersa19a1682001-03-29 04:36:09 +0000228
Steve Purcellb8d5f242003-12-06 13:03:13 +0000229 def _exc_info_to_string(self, err, test):
Steve Purcell7b065702001-09-06 08:24:40 +0000230 """Converts a sys.exc_info()-style tuple of values into a string."""
Steve Purcellb8d5f242003-12-06 13:03:13 +0000231 exctype, value, tb = err
232 # Skip test runner traceback levels
233 while tb and self._is_relevant_tb_level(tb):
234 tb = tb.tb_next
235 if exctype is test.failureException:
236 # Skip assert*() traceback levels
237 length = self._count_relevant_tb_levels(tb)
238 return ''.join(traceback.format_exception(exctype, value, tb, length))
239 return ''.join(traceback.format_exception(exctype, value, tb))
240
241 def _is_relevant_tb_level(self, tb):
Georg Brandl56af5fc2008-07-18 19:30:10 +0000242 return '__unittest' in tb.tb_frame.f_globals
Steve Purcellb8d5f242003-12-06 13:03:13 +0000243
244 def _count_relevant_tb_levels(self, tb):
245 length = 0
246 while tb and not self._is_relevant_tb_level(tb):
247 length += 1
248 tb = tb.tb_next
249 return length
Steve Purcell7b065702001-09-06 08:24:40 +0000250
Fred Drake02538202001-03-21 18:09:46 +0000251 def __repr__(self):
252 return "<%s run=%i errors=%i failures=%i>" % \
Steve Purcelldc391a62002-08-09 09:46:23 +0000253 (_strclass(self.__class__), self.testsRun, len(self.errors),
Fred Drake02538202001-03-21 18:09:46 +0000254 len(self.failures))
255
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000256
Gregory P. Smith28399852009-03-31 16:54:10 +0000257class _AssertRaisesContext(object):
258 """A context manager used to implement TestCase.assertRaises* methods."""
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000259
Gregory P. Smith28399852009-03-31 16:54:10 +0000260 def __init__(self, expected, test_case, expected_regexp=None):
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000261 self.expected = expected
262 self.failureException = test_case.failureException
Gregory P. Smith28399852009-03-31 16:54:10 +0000263 self.expected_regex = expected_regexp
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000264
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000265 def __enter__(self):
266 pass
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000267
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000268 def __exit__(self, exc_type, exc_value, traceback):
269 if exc_type is None:
270 try:
271 exc_name = self.expected.__name__
272 except AttributeError:
273 exc_name = str(self.expected)
274 raise self.failureException(
275 "{0} not raised".format(exc_name))
Gregory P. Smith28399852009-03-31 16:54:10 +0000276 if not issubclass(exc_type, self.expected):
Michael Foord345b2fe2009-04-02 03:20:38 +0000277 # let unexpected exceptions pass through
Gregory P. Smith28399852009-03-31 16:54:10 +0000278 return False
279 if self.expected_regex is None:
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000280 return True
Gregory P. Smith28399852009-03-31 16:54:10 +0000281
282 expected_regexp = self.expected_regex
283 if isinstance(expected_regexp, basestring):
284 expected_regexp = re.compile(expected_regexp)
285 if not expected_regexp.search(str(exc_value)):
286 raise self.failureException('"%s" does not match "%s"' %
287 (expected_regexp.pattern, str(exc_value)))
288 return True
289
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000290
Michael Foorde2942d02009-04-02 05:51:54 +0000291class _AssertWrapper(object):
292 """Wrap entries in the _type_equality_funcs registry to make them deep
293 copyable."""
294
295 def __init__(self, function):
296 self.function = function
297
298 def __deepcopy__(self, memo):
299 memo[id(self)] = self
300
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000301
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000302class TestCase(object):
Fred Drake02538202001-03-21 18:09:46 +0000303 """A class whose instances are single test cases.
304
Fred Drake02538202001-03-21 18:09:46 +0000305 By default, the test code itself should be placed in a method named
306 'runTest'.
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000307
Tim Petersa19a1682001-03-29 04:36:09 +0000308 If the fixture may be used for many test cases, create as
Fred Drake02538202001-03-21 18:09:46 +0000309 many test methods as are needed. When instantiating such a TestCase
310 subclass, specify in the constructor arguments the name of the test method
311 that the instance is to execute.
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000312
Tim Petersa19a1682001-03-29 04:36:09 +0000313 Test authors should subclass TestCase for their own tests. Construction
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000314 and deconstruction of the test's environment ('fixture') can be
315 implemented by overriding the 'setUp' and 'tearDown' methods respectively.
316
317 If it is necessary to override the __init__ method, the base class
318 __init__ method must always be called. It is important that subclasses
319 should not change the signature of their __init__ method, since instances
320 of the classes are instantiated automatically by parts of the framework
321 in order to be run.
Fred Drake02538202001-03-21 18:09:46 +0000322 """
Steve Purcell15d89272001-04-12 09:05:01 +0000323
324 # This attribute determines which exception will be raised when
325 # the instance's assertion methods fail; test methods raising this
326 # exception will be deemed to have 'failed' rather than 'errored'
327
328 failureException = AssertionError
329
Michael Foord345b2fe2009-04-02 03:20:38 +0000330 # This attribute determines whether long messages (including repr of
331 # objects used in assert methods) will be printed on failure in *addition*
332 # to any explicit message passed.
333
334 longMessage = False
335
336
Fred Drake02538202001-03-21 18:09:46 +0000337 def __init__(self, methodName='runTest'):
338 """Create an instance of the class that will use the named test
339 method when executed. Raises a ValueError if the instance does
340 not have a method with the specified name.
341 """
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000342 self._testMethodName = methodName
Fred Drake02538202001-03-21 18:09:46 +0000343 try:
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000344 testMethod = getattr(self, methodName)
Fred Drake02538202001-03-21 18:09:46 +0000345 except AttributeError:
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000346 raise ValueError("no such test method in %s: %s" % \
347 (self.__class__, methodName))
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000348 self._testMethodDoc = testMethod.__doc__
Fred Drake02538202001-03-21 18:09:46 +0000349
Gregory P. Smith28399852009-03-31 16:54:10 +0000350 # Map types to custom assertEqual functions that will compare
351 # instances of said type in more detail to generate a more useful
352 # error message.
Benjamin Peterson71095ae2009-04-01 23:15:49 +0000353 self._type_equality_funcs = {}
Gregory P. Smith28399852009-03-31 16:54:10 +0000354 self.addTypeEqualityFunc(dict, self.assertDictEqual)
355 self.addTypeEqualityFunc(list, self.assertListEqual)
356 self.addTypeEqualityFunc(tuple, self.assertTupleEqual)
357 self.addTypeEqualityFunc(set, self.assertSetEqual)
358 self.addTypeEqualityFunc(frozenset, self.assertSetEqual)
359
360 def addTypeEqualityFunc(self, typeobj, function):
361 """Add a type specific assertEqual style function to compare a type.
362
363 This method is for use by TestCase subclasses that need to register
364 their own type equality functions to provide nicer error messages.
365
366 Args:
367 typeobj: The data type to call this function on when both values
368 are of the same type in assertEqual().
369 function: The callable taking two arguments and an optional
370 msg= argument that raises self.failureException with a
371 useful error message when the two arguments are not equal.
372 """
Michael Foorde2942d02009-04-02 05:51:54 +0000373 self._type_equality_funcs[typeobj] = _AssertWrapper(function)
Gregory P. Smith28399852009-03-31 16:54:10 +0000374
Fred Drake02538202001-03-21 18:09:46 +0000375 def setUp(self):
376 "Hook method for setting up the test fixture before exercising it."
377 pass
378
379 def tearDown(self):
380 "Hook method for deconstructing the test fixture after testing it."
381 pass
382
383 def countTestCases(self):
384 return 1
385
386 def defaultTestResult(self):
387 return TestResult()
388
389 def shortDescription(self):
Gregory P. Smith28399852009-03-31 16:54:10 +0000390 """Returns both the test method name and first line of its docstring.
Fred Drake02538202001-03-21 18:09:46 +0000391
Gregory P. Smith28399852009-03-31 16:54:10 +0000392 If no docstring is given, only returns the method name.
393
394 This method overrides unittest.TestCase.shortDescription(), which
395 only returns the first line of the docstring, obscuring the name
396 of the test upon failure.
Fred Drake02538202001-03-21 18:09:46 +0000397 """
Gregory P. Smith28399852009-03-31 16:54:10 +0000398 desc = str(self)
399 doc_first_line = None
400
401 if self._testMethodDoc:
402 doc_first_line = self._testMethodDoc.split("\n")[0].strip()
403 if doc_first_line:
404 desc = '\n'.join((desc, doc_first_line))
405 return desc
Fred Drake02538202001-03-21 18:09:46 +0000406
407 def id(self):
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000408 return "%s.%s" % (_strclass(self.__class__), self._testMethodName)
Fred Drake02538202001-03-21 18:09:46 +0000409
Georg Brandl15c5ce92007-03-07 09:09:40 +0000410 def __eq__(self, other):
411 if type(self) is not type(other):
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000412 return NotImplemented
Georg Brandl15c5ce92007-03-07 09:09:40 +0000413
414 return self._testMethodName == other._testMethodName
415
416 def __ne__(self, other):
417 return not self == other
418
419 def __hash__(self):
Collin Winter9453e5d2007-03-09 23:30:39 +0000420 return hash((type(self), self._testMethodName))
Georg Brandl15c5ce92007-03-07 09:09:40 +0000421
Fred Drake02538202001-03-21 18:09:46 +0000422 def __str__(self):
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000423 return "%s (%s)" % (self._testMethodName, _strclass(self.__class__))
Fred Drake02538202001-03-21 18:09:46 +0000424
425 def __repr__(self):
426 return "<%s testMethod=%s>" % \
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000427 (_strclass(self.__class__), self._testMethodName)
Fred Drake02538202001-03-21 18:09:46 +0000428
429 def run(self, result=None):
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000430 if result is None:
431 result = self.defaultTestResult()
Fred Drake02538202001-03-21 18:09:46 +0000432 result.startTest(self)
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000433 testMethod = getattr(self, self._testMethodName)
Fred Drake02538202001-03-21 18:09:46 +0000434 try:
435 try:
436 self.setUp()
Benjamin Peterson692428e2009-03-23 21:50:21 +0000437 except SkipTest as e:
438 result.addSkip(self, str(e))
439 return
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000440 except Exception:
Benjamin Petersonc9301352009-03-26 16:32:23 +0000441 result.addError(self, sys.exc_info())
Fred Drake02538202001-03-21 18:09:46 +0000442 return
443
Benjamin Peterson692428e2009-03-23 21:50:21 +0000444 success = False
Fred Drake02538202001-03-21 18:09:46 +0000445 try:
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000446 testMethod()
Skip Montanaroae5c37b2003-07-13 15:18:12 +0000447 except self.failureException:
Benjamin Petersonc9301352009-03-26 16:32:23 +0000448 result.addFailure(self, sys.exc_info())
Benjamin Peterson692428e2009-03-23 21:50:21 +0000449 except _ExpectedFailure as e:
450 result.addExpectedFailure(self, e.exc_info)
451 except _UnexpectedSuccess:
452 result.addUnexpectedSuccess(self)
453 except SkipTest as e:
454 result.addSkip(self, str(e))
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000455 except Exception:
Benjamin Petersonc9301352009-03-26 16:32:23 +0000456 result.addError(self, sys.exc_info())
Benjamin Peterson692428e2009-03-23 21:50:21 +0000457 else:
458 success = True
Fred Drake02538202001-03-21 18:09:46 +0000459
460 try:
461 self.tearDown()
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000462 except Exception:
Benjamin Petersonc9301352009-03-26 16:32:23 +0000463 result.addError(self, sys.exc_info())
Benjamin Peterson692428e2009-03-23 21:50:21 +0000464 success = False
465 if success:
466 result.addSuccess(self)
Fred Drake02538202001-03-21 18:09:46 +0000467 finally:
468 result.stopTest(self)
469
Raymond Hettinger664347b2004-12-04 21:21:53 +0000470 def __call__(self, *args, **kwds):
471 return self.run(*args, **kwds)
Steve Purcell7e743842003-09-22 11:08:12 +0000472
Fred Drake02538202001-03-21 18:09:46 +0000473 def debug(self):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000474 """Run the test without collecting errors in a TestResult"""
Fred Drake02538202001-03-21 18:09:46 +0000475 self.setUp()
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000476 getattr(self, self._testMethodName)()
Fred Drake02538202001-03-21 18:09:46 +0000477 self.tearDown()
478
Benjamin Peterson47d97382009-03-26 20:05:50 +0000479 def skipTest(self, reason):
Benjamin Peterson692428e2009-03-23 21:50:21 +0000480 """Skip this test."""
481 raise SkipTest(reason)
482
Steve Purcell15d89272001-04-12 09:05:01 +0000483 def fail(self, msg=None):
484 """Fail immediately, with the given message."""
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000485 raise self.failureException(msg)
Fred Drake02538202001-03-21 18:09:46 +0000486
Gregory P. Smith7558d572009-03-31 19:03:28 +0000487 def assertFalse(self, expr, msg=None):
Fred Drake02538202001-03-21 18:09:46 +0000488 "Fail the test if the expression is true."
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000489 if expr:
Michael Foord345b2fe2009-04-02 03:20:38 +0000490 msg = self._formatMessage(msg, "%r is not False" % expr)
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000491 raise self.failureException(msg)
Fred Drake02538202001-03-21 18:09:46 +0000492
Gregory P. Smith7558d572009-03-31 19:03:28 +0000493 def assertTrue(self, expr, msg=None):
Steve Purcell15d89272001-04-12 09:05:01 +0000494 """Fail the test unless the expression is true."""
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000495 if not expr:
Michael Foord345b2fe2009-04-02 03:20:38 +0000496 msg = self._formatMessage(msg, "%r is not True" % expr)
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000497 raise self.failureException(msg)
Steve Purcell15d89272001-04-12 09:05:01 +0000498
Michael Foord345b2fe2009-04-02 03:20:38 +0000499 def _formatMessage(self, msg, standardMsg):
500 """Honour the longMessage attribute when generating failure messages.
501 If longMessage is False this means:
502 * Use only an explicit message if it is provided
503 * Otherwise use the standard message for the assert
504
505 If longMessage is True:
506 * Use the standard message
507 * If an explicit message is provided, plus ' : ' and the explicit message
508 """
509 if not self.longMessage:
510 return msg or standardMsg
511 if msg is None:
512 return standardMsg
513 return standardMsg + ' : ' + msg
514
515
Gregory P. Smith7558d572009-03-31 19:03:28 +0000516 def assertRaises(self, excClass, callableObj=None, *args, **kwargs):
Steve Purcell15d89272001-04-12 09:05:01 +0000517 """Fail unless an exception of class excClass is thrown
Fred Drake02538202001-03-21 18:09:46 +0000518 by callableObj when invoked with arguments args and keyword
519 arguments kwargs. If a different type of exception is
520 thrown, it will not be caught, and the test case will be
521 deemed to have suffered an error, exactly as for an
522 unexpected exception.
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000523
524 If called with callableObj omitted or None, will return a
525 context object used like this::
526
Gregory P. Smith7558d572009-03-31 19:03:28 +0000527 with self.assertRaises(some_error_class):
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000528 do_something()
Fred Drake02538202001-03-21 18:09:46 +0000529 """
Gregory P. Smith28399852009-03-31 16:54:10 +0000530 context = _AssertRaisesContext(excClass, self)
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000531 if callableObj is None:
532 return context
533 with context:
Guido van Rossum68468eb2003-02-27 20:14:51 +0000534 callableObj(*args, **kwargs)
Fred Drake02538202001-03-21 18:09:46 +0000535
Gregory P. Smith28399852009-03-31 16:54:10 +0000536 def _getAssertEqualityFunc(self, first, second):
537 """Get a detailed comparison function for the types of the two args.
538
539 Returns: A callable accepting (first, second, msg=None) that will
540 raise a failure exception if first != second with a useful human
541 readable error message for those types.
542 """
543 #
544 # NOTE(gregory.p.smith): I considered isinstance(first, type(second))
545 # and vice versa. I opted for the conservative approach in case
546 # subclasses are not intended to be compared in detail to their super
547 # class instances using a type equality func. This means testing
548 # subtypes won't automagically use the detailed comparison. Callers
549 # should use their type specific assertSpamEqual method to compare
550 # subclasses if the detailed comparison is desired and appropriate.
551 # See the discussion in http://bugs.python.org/issue2578.
552 #
553 if type(first) is type(second):
Michael Foorde2942d02009-04-02 05:51:54 +0000554 asserter = self._type_equality_funcs.get(type(first))
555 if asserter is not None:
556 return asserter.function
557
Gregory P. Smith28399852009-03-31 16:54:10 +0000558 return self._baseAssertEqual
559
560 def _baseAssertEqual(self, first, second, msg=None):
561 """The default assertEqual implementation, not type specific."""
562 if not first == second:
Michael Foord345b2fe2009-04-02 03:20:38 +0000563 standardMsg = '%r != %r' % (first, second)
564 msg = self._formatMessage(msg, standardMsg)
565 raise self.failureException(msg)
Gregory P. Smith28399852009-03-31 16:54:10 +0000566
Gregory P. Smith7558d572009-03-31 19:03:28 +0000567 def assertEqual(self, first, second, msg=None):
Raymond Hettingerc377cbf2003-04-04 22:56:42 +0000568 """Fail if the two objects are unequal as determined by the '=='
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000569 operator.
570 """
Gregory P. Smith28399852009-03-31 16:54:10 +0000571 assertion_func = self._getAssertEqualityFunc(first, second)
572 assertion_func(first, second, msg=msg)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000573
Gregory P. Smith7558d572009-03-31 19:03:28 +0000574 def assertNotEqual(self, first, second, msg=None):
Steve Purcell15d89272001-04-12 09:05:01 +0000575 """Fail if the two objects are equal as determined by the '=='
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000576 operator.
577 """
Michael Foord345b2fe2009-04-02 03:20:38 +0000578 if not first != second:
579 msg = self._formatMessage(msg, '%r == %r' % (first, second))
580 raise self.failureException(msg)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000581
Gregory P. Smith7558d572009-03-31 19:03:28 +0000582 def assertAlmostEqual(self, first, second, places=7, msg=None):
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000583 """Fail if the two objects are unequal as determined by their
584 difference rounded to the given number of decimal places
585 (default 7) and comparing to zero.
586
Steve Purcell397b45d2003-10-26 10:41:03 +0000587 Note that decimal places (from zero) are usually not the same
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000588 as significant digits (measured from the most signficant digit).
589 """
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000590 if round(abs(second-first), places) != 0:
Michael Foord345b2fe2009-04-02 03:20:38 +0000591 standardMsg = '%r != %r within %r places' % (first, second, places)
592 msg = self._formatMessage(msg, standardMsg)
593 raise self.failureException(msg)
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000594
Gregory P. Smith7558d572009-03-31 19:03:28 +0000595 def assertNotAlmostEqual(self, first, second, places=7, msg=None):
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000596 """Fail if the two objects are equal as determined by their
597 difference rounded to the given number of decimal places
598 (default 7) and comparing to zero.
599
Steve Purcellcca34912003-10-26 16:38:16 +0000600 Note that decimal places (from zero) are usually not the same
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000601 as significant digits (measured from the most signficant digit).
602 """
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000603 if round(abs(second-first), places) == 0:
Michael Foord345b2fe2009-04-02 03:20:38 +0000604 standardMsg = '%r == %r within %r places' % (first, second, places)
605 msg = self._formatMessage(msg, standardMsg)
606 raise self.failureException(msg)
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000607
Steve Purcell7e743842003-09-22 11:08:12 +0000608 # Synonyms for assertion methods
609
Gregory P. Smith7558d572009-03-31 19:03:28 +0000610 # The plurals are undocumented. Keep them that way to discourage use.
611 # Do not add more. Do not remove.
612 # Going through a deprecation cycle on these would annoy many people.
613 assertEquals = assertEqual
614 assertNotEquals = assertNotEqual
615 assertAlmostEquals = assertAlmostEqual
616 assertNotAlmostEquals = assertNotAlmostEqual
617 assert_ = assertTrue
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000618
Gregory P. Smith7558d572009-03-31 19:03:28 +0000619 # These fail* assertion method names are pending deprecation and will
Gregory P. Smith65ff0052009-03-31 19:59:14 +0000620 # be a DeprecationWarning in 3.2; http://bugs.python.org/issue2578
Benjamin Peterson71095ae2009-04-01 23:15:49 +0000621 def _deprecate(original_func):
Gregory P. Smith65ff0052009-03-31 19:59:14 +0000622 def deprecated_func(*args, **kwargs):
623 warnings.warn(
624 'Please use {0} instead.'.format(original_func.__name__),
625 PendingDeprecationWarning, 2)
626 return original_func(*args, **kwargs)
627 return deprecated_func
Steve Purcell15d89272001-04-12 09:05:01 +0000628
Benjamin Peterson71095ae2009-04-01 23:15:49 +0000629 failUnlessEqual = _deprecate(assertEqual)
630 failIfEqual = _deprecate(assertNotEqual)
631 failUnlessAlmostEqual = _deprecate(assertAlmostEqual)
632 failIfAlmostEqual = _deprecate(assertNotAlmostEqual)
633 failUnless = _deprecate(assertTrue)
634 failUnlessRaises = _deprecate(assertRaises)
635 failIf = _deprecate(assertFalse)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000636
Gregory P. Smith28399852009-03-31 16:54:10 +0000637 def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None):
638 """An equality assertion for ordered sequences (like lists and tuples).
639
640 For the purposes of this function, a valid orderd sequence type is one
641 which can be indexed, has a length, and has an equality operator.
642
643 Args:
644 seq1: The first sequence to compare.
645 seq2: The second sequence to compare.
646 seq_type: The expected datatype of the sequences, or None if no
647 datatype should be enforced.
648 msg: Optional message to use on failure instead of a list of
649 differences.
650 """
651 if seq_type != None:
652 seq_type_name = seq_type.__name__
653 if not isinstance(seq1, seq_type):
654 raise self.failureException('First sequence is not a %s: %r'
655 % (seq_type_name, seq1))
656 if not isinstance(seq2, seq_type):
657 raise self.failureException('Second sequence is not a %s: %r'
658 % (seq_type_name, seq2))
659 else:
660 seq_type_name = "sequence"
661
662 differing = None
663 try:
664 len1 = len(seq1)
665 except (TypeError, NotImplementedError):
666 differing = 'First %s has no length. Non-sequence?' % (
667 seq_type_name)
668
669 if differing is None:
670 try:
671 len2 = len(seq2)
672 except (TypeError, NotImplementedError):
673 differing = 'Second %s has no length. Non-sequence?' % (
674 seq_type_name)
675
676 if differing is None:
677 if seq1 == seq2:
678 return
679
680 for i in xrange(min(len1, len2)):
681 try:
682 item1 = seq1[i]
683 except (TypeError, IndexError, NotImplementedError):
684 differing = ('Unable to index element %d of first %s\n' %
685 (i, seq_type_name))
686 break
687
688 try:
689 item2 = seq2[i]
690 except (TypeError, IndexError, NotImplementedError):
691 differing = ('Unable to index element %d of second %s\n' %
692 (i, seq_type_name))
693 break
694
695 if item1 != item2:
696 differing = ('First differing element %d:\n%s\n%s\n' %
697 (i, item1, item2))
698 break
699 else:
700 if (len1 == len2 and seq_type is None and
701 type(seq1) != type(seq2)):
702 # The sequences are the same, but have differing types.
703 return
704 # A catch-all message for handling arbitrary user-defined
705 # sequences.
706 differing = '%ss differ:\n' % seq_type_name.capitalize()
707 if len1 > len2:
708 differing = ('First %s contains %d additional '
709 'elements.\n' % (seq_type_name, len1 - len2))
710 try:
711 differing += ('First extra element %d:\n%s\n' %
712 (len2, seq1[len2]))
713 except (TypeError, IndexError, NotImplementedError):
714 differing += ('Unable to index element %d '
715 'of first %s\n' % (len2, seq_type_name))
716 elif len1 < len2:
717 differing = ('Second %s contains %d additional '
718 'elements.\n' % (seq_type_name, len2 - len1))
719 try:
720 differing += ('First extra element %d:\n%s\n' %
721 (len1, seq2[len1]))
722 except (TypeError, IndexError, NotImplementedError):
723 differing += ('Unable to index element %d '
724 'of second %s\n' % (len1, seq_type_name))
Michael Foord345b2fe2009-04-02 03:20:38 +0000725 standardMsg = differing + '\n'.join(difflib.ndiff(pprint.pformat(seq1).splitlines(),
726 pprint.pformat(seq2).splitlines()))
727 msg = self._formatMessage(msg, standardMsg)
728 self.fail(msg)
Gregory P. Smith28399852009-03-31 16:54:10 +0000729
730 def assertListEqual(self, list1, list2, msg=None):
731 """A list-specific equality assertion.
732
733 Args:
734 list1: The first list to compare.
735 list2: The second list to compare.
736 msg: Optional message to use on failure instead of a list of
737 differences.
738
739 """
740 self.assertSequenceEqual(list1, list2, msg, seq_type=list)
741
742 def assertTupleEqual(self, tuple1, tuple2, msg=None):
743 """A tuple-specific equality assertion.
744
745 Args:
746 tuple1: The first tuple to compare.
747 tuple2: The second tuple to compare.
748 msg: Optional message to use on failure instead of a list of
749 differences.
750 """
751 self.assertSequenceEqual(tuple1, tuple2, msg, seq_type=tuple)
752
753 def assertSetEqual(self, set1, set2, msg=None):
754 """A set-specific equality assertion.
755
756 Args:
757 set1: The first set to compare.
758 set2: The second set to compare.
759 msg: Optional message to use on failure instead of a list of
760 differences.
761
762 For more general containership equality, assertSameElements will work
763 with things other than sets. This uses ducktyping to support
764 different types of sets, and is optimized for sets specifically
765 (parameters must support a difference method).
766 """
767 try:
768 difference1 = set1.difference(set2)
769 except TypeError, e:
770 self.fail('invalid type when attempting set difference: %s' % e)
771 except AttributeError, e:
772 self.fail('first argument does not support set difference: %s' % e)
773
774 try:
775 difference2 = set2.difference(set1)
776 except TypeError, e:
777 self.fail('invalid type when attempting set difference: %s' % e)
778 except AttributeError, e:
779 self.fail('second argument does not support set difference: %s' % e)
780
781 if not (difference1 or difference2):
782 return
783
Gregory P. Smith28399852009-03-31 16:54:10 +0000784 lines = []
785 if difference1:
786 lines.append('Items in the first set but not the second:')
787 for item in difference1:
788 lines.append(repr(item))
789 if difference2:
790 lines.append('Items in the second set but not the first:')
791 for item in difference2:
792 lines.append(repr(item))
Gregory P. Smith28399852009-03-31 16:54:10 +0000793
Michael Foord345b2fe2009-04-02 03:20:38 +0000794 standardMsg = '\n'.join(lines)
795 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000796
Michael Foord345b2fe2009-04-02 03:20:38 +0000797 def assertIn(self, member, container, msg=None):
798 """Just like self.assertTrue(a in b), but with a nicer default message."""
799 if member not in container:
800 standardMsg = '%r not found in %r' % (member, container)
801 self.fail(self._formatMessage(msg, standardMsg))
802
803 def assertNotIn(self, member, container, msg=None):
804 """Just like self.assertTrue(a not in b), but with a nicer default message."""
805 if member in container:
806 standardMsg = '%r unexpectedly found in %r' % (member, container)
807 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000808
809 def assertDictEqual(self, d1, d2, msg=None):
810 self.assert_(isinstance(d1, dict), 'First argument is not a dictionary')
811 self.assert_(isinstance(d2, dict), 'Second argument is not a dictionary')
812
813 if d1 != d2:
Michael Foord345b2fe2009-04-02 03:20:38 +0000814 standardMsg = ('\n' + '\n'.join(difflib.ndiff(
815 pprint.pformat(d1).splitlines(),
816 pprint.pformat(d2).splitlines())))
817 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000818
819 def assertDictContainsSubset(self, expected, actual, msg=None):
820 """Checks whether actual is a superset of expected."""
821 missing = []
822 mismatched = []
823 for key, value in expected.iteritems():
824 if key not in actual:
825 missing.append(key)
826 elif value != actual[key]:
Michael Foord345b2fe2009-04-02 03:20:38 +0000827 mismatched.append('%s, expected: %s, actual: %s' % (key, value, actual[key]))
Gregory P. Smith28399852009-03-31 16:54:10 +0000828
829 if not (missing or mismatched):
830 return
831
Michael Foord345b2fe2009-04-02 03:20:38 +0000832 standardMsg = ''
Gregory P. Smith28399852009-03-31 16:54:10 +0000833 if missing:
Michael Foord345b2fe2009-04-02 03:20:38 +0000834 standardMsg = 'Missing: %r' % ','.join(missing)
Gregory P. Smith28399852009-03-31 16:54:10 +0000835 if mismatched:
Michael Foord345b2fe2009-04-02 03:20:38 +0000836 if standardMsg:
837 standardMsg += '; '
838 standardMsg += 'Mismatched values: %s' % ','.join(mismatched)
Gregory P. Smith28399852009-03-31 16:54:10 +0000839
Michael Foord345b2fe2009-04-02 03:20:38 +0000840 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000841
842 def assertSameElements(self, expected_seq, actual_seq, msg=None):
843 """An unordered sequence specific comparison.
844
845 Raises with an error message listing which elements of expected_seq
846 are missing from actual_seq and vice versa if any.
847 """
848 try:
849 expected = set(expected_seq)
850 actual = set(actual_seq)
851 missing = list(expected.difference(actual))
852 unexpected = list(actual.difference(expected))
853 missing.sort()
854 unexpected.sort()
855 except TypeError:
856 # Fall back to slower list-compare if any of the objects are
857 # not hashable.
858 expected = list(expected_seq)
859 actual = list(actual_seq)
860 expected.sort()
861 actual.sort()
862 missing, unexpected = _SortedListDifference(expected, actual)
863 errors = []
864 if missing:
Michael Foord345b2fe2009-04-02 03:20:38 +0000865 errors.append('Expected, but missing:\n %r' % missing)
Gregory P. Smith28399852009-03-31 16:54:10 +0000866 if unexpected:
Michael Foord345b2fe2009-04-02 03:20:38 +0000867 errors.append('Unexpected, but present:\n %r' % unexpected)
Gregory P. Smith28399852009-03-31 16:54:10 +0000868 if errors:
Michael Foord345b2fe2009-04-02 03:20:38 +0000869 standardMsg = '\n'.join(errors)
870 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000871
872 def assertMultiLineEqual(self, first, second, msg=None):
873 """Assert that two multi-line strings are equal."""
Michael Foord345b2fe2009-04-02 03:20:38 +0000874 self.assert_(isinstance(first, basestring), (
Gregory P. Smith28399852009-03-31 16:54:10 +0000875 'First argument is not a string'))
Michael Foord345b2fe2009-04-02 03:20:38 +0000876 self.assert_(isinstance(second, basestring), (
Gregory P. Smith28399852009-03-31 16:54:10 +0000877 'Second argument is not a string'))
878
879 if first != second:
Michael Foord345b2fe2009-04-02 03:20:38 +0000880 standardMsg = '\n' + ''.join(difflib.ndiff(first.splitlines(True), second.splitlines(True)))
881 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000882
883 def assertLess(self, a, b, msg=None):
Michael Foord345b2fe2009-04-02 03:20:38 +0000884 """Just like self.assertTrue(a < b), but with a nicer default message."""
885 if not a < b:
886 standardMsg = '%r not less than %r' % (a, b)
887 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000888
889 def assertLessEqual(self, a, b, msg=None):
Michael Foord345b2fe2009-04-02 03:20:38 +0000890 """Just like self.assertTrue(a <= b), but with a nicer default message."""
891 if not a <= b:
892 standardMsg = '%r not less than or equal to %r' % (a, b)
893 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000894
895 def assertGreater(self, a, b, msg=None):
Michael Foord345b2fe2009-04-02 03:20:38 +0000896 """Just like self.assertTrue(a > b), but with a nicer default message."""
897 if not a > b:
898 standardMsg = '%r not greater than %r' % (a, b)
899 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000900
901 def assertGreaterEqual(self, a, b, msg=None):
Michael Foord345b2fe2009-04-02 03:20:38 +0000902 """Just like self.assertTrue(a >= b), but with a nicer default message."""
903 if not a >= b:
904 standardMsg = '%r not greater than or equal to %r' % (a, b)
905 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000906
907 def assertIsNone(self, obj, msg=None):
Michael Foord345b2fe2009-04-02 03:20:38 +0000908 """Same as self.assertTrue(obj is None), with a nicer default message."""
909 if obj is not None:
910 standardMsg = '%r is not None' % obj
911 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000912
Michael Foord345b2fe2009-04-02 03:20:38 +0000913 def assertIsNotNone(self, obj, msg=None):
Gregory P. Smith28399852009-03-31 16:54:10 +0000914 """Included for symmetry with assertIsNone."""
Michael Foord345b2fe2009-04-02 03:20:38 +0000915 if obj is None:
916 standardMsg = 'unexpectedly None'
917 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000918
919 def assertRaisesRegexp(self, expected_exception, expected_regexp,
920 callable_obj=None, *args, **kwargs):
921 """Asserts that the message in a raised exception matches a regexp.
922
923 Args:
924 expected_exception: Exception class expected to be raised.
925 expected_regexp: Regexp (re pattern object or string) expected
926 to be found in error message.
927 callable_obj: Function to be called.
928 args: Extra args.
929 kwargs: Extra kwargs.
930 """
931 context = _AssertRaisesContext(expected_exception, self, expected_regexp)
932 if callable_obj is None:
933 return context
934 with context:
935 callable_obj(*args, **kwargs)
936
937 def assertRegexpMatches(self, text, expected_regex, msg=None):
938 if isinstance(expected_regex, basestring):
939 expected_regex = re.compile(expected_regex)
940 if not expected_regex.search(text):
941 msg = msg or "Regexp didn't match"
942 msg = '%s: %r not found in %r' % (msg, expected_regex.pattern, text)
943 raise self.failureException(msg)
944
945
946def _SortedListDifference(expected, actual):
947 """Finds elements in only one or the other of two, sorted input lists.
948
949 Returns a two-element tuple of lists. The first list contains those
950 elements in the "expected" list but not in the "actual" list, and the
951 second contains those elements in the "actual" list but not in the
952 "expected" list. Duplicate elements in either input list are ignored.
953 """
954 i = j = 0
955 missing = []
956 unexpected = []
957 while True:
958 try:
959 e = expected[i]
960 a = actual[j]
961 if e < a:
962 missing.append(e)
963 i += 1
964 while expected[i] == e:
965 i += 1
966 elif e > a:
967 unexpected.append(a)
968 j += 1
969 while actual[j] == a:
970 j += 1
971 else:
972 i += 1
973 try:
974 while expected[i] == e:
975 i += 1
976 finally:
977 j += 1
978 while actual[j] == a:
979 j += 1
980 except IndexError:
981 missing.extend(expected[i:])
982 unexpected.extend(actual[j:])
983 break
984 return missing, unexpected
985
Fred Drake02538202001-03-21 18:09:46 +0000986
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000987class TestSuite(object):
Fred Drake02538202001-03-21 18:09:46 +0000988 """A test suite is a composite test consisting of a number of TestCases.
989
990 For use, create an instance of TestSuite, then add test case instances.
991 When all tests have been added, the suite can be passed to a test
992 runner, such as TextTestRunner. It will run the individual test cases
993 in the order in which they were added, aggregating the results. When
994 subclassing, do not forget to call the base class constructor.
995 """
996 def __init__(self, tests=()):
997 self._tests = []
998 self.addTests(tests)
999
1000 def __repr__(self):
Steve Purcelldc391a62002-08-09 09:46:23 +00001001 return "<%s tests=%s>" % (_strclass(self.__class__), self._tests)
Fred Drake02538202001-03-21 18:09:46 +00001002
Georg Brandl15c5ce92007-03-07 09:09:40 +00001003 def __eq__(self, other):
Benjamin Peterson692428e2009-03-23 21:50:21 +00001004 if not isinstance(other, self.__class__):
1005 return NotImplemented
Georg Brandl15c5ce92007-03-07 09:09:40 +00001006 return self._tests == other._tests
1007
1008 def __ne__(self, other):
1009 return not self == other
1010
Nick Coghlan48361f52008-08-11 15:45:58 +00001011 # Can't guarantee hash invariant, so flag as unhashable
1012 __hash__ = None
1013
Jim Fultonfafd8742004-08-28 15:22:12 +00001014 def __iter__(self):
1015 return iter(self._tests)
1016
Fred Drake02538202001-03-21 18:09:46 +00001017 def countTestCases(self):
1018 cases = 0
1019 for test in self._tests:
Steve Purcell7e743842003-09-22 11:08:12 +00001020 cases += test.countTestCases()
Fred Drake02538202001-03-21 18:09:46 +00001021 return cases
1022
1023 def addTest(self, test):
Georg Brandld9e50262007-03-07 11:54:49 +00001024 # sanity checks
Raymond Hettinger5930d8f2008-07-10 16:06:41 +00001025 if not hasattr(test, '__call__'):
Georg Brandld9e50262007-03-07 11:54:49 +00001026 raise TypeError("the test to add must be callable")
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001027 if isinstance(test, type) and issubclass(test, (TestCase, TestSuite)):
Georg Brandld9e50262007-03-07 11:54:49 +00001028 raise TypeError("TestCases and TestSuites must be instantiated "
1029 "before passing them to addTest()")
Fred Drake02538202001-03-21 18:09:46 +00001030 self._tests.append(test)
1031
1032 def addTests(self, tests):
Georg Brandld9e50262007-03-07 11:54:49 +00001033 if isinstance(tests, basestring):
1034 raise TypeError("tests must be an iterable of tests, not a string")
Fred Drake02538202001-03-21 18:09:46 +00001035 for test in tests:
1036 self.addTest(test)
1037
1038 def run(self, result):
Fred Drake02538202001-03-21 18:09:46 +00001039 for test in self._tests:
1040 if result.shouldStop:
1041 break
1042 test(result)
1043 return result
1044
Raymond Hettinger664347b2004-12-04 21:21:53 +00001045 def __call__(self, *args, **kwds):
1046 return self.run(*args, **kwds)
1047
Fred Drake02538202001-03-21 18:09:46 +00001048 def debug(self):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001049 """Run the tests without collecting errors in a TestResult"""
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001050 for test in self._tests:
1051 test.debug()
Fred Drake02538202001-03-21 18:09:46 +00001052
1053
Benjamin Peterson692428e2009-03-23 21:50:21 +00001054class ClassTestSuite(TestSuite):
1055 """
1056 Suite of tests derived from a single TestCase class.
1057 """
1058
1059 def __init__(self, tests, class_collected_from):
1060 super(ClassTestSuite, self).__init__(tests)
1061 self.collected_from = class_collected_from
1062
1063 def id(self):
1064 module = getattr(self.collected_from, "__module__", None)
1065 if module is not None:
1066 return "{0}.{1}".format(module, self.collected_from.__name__)
1067 return self.collected_from.__name__
1068
1069 def run(self, result):
1070 if getattr(self.collected_from, "__unittest_skip__", False):
1071 # ClassTestSuite result pretends to be a TestCase enough to be
1072 # reported.
1073 result.startTest(self)
1074 try:
1075 result.addSkip(self, self.collected_from.__unittest_skip_why__)
1076 finally:
1077 result.stopTest(self)
1078 else:
1079 result = super(ClassTestSuite, self).run(result)
1080 return result
1081
1082 shortDescription = id
1083
1084
Fred Drake02538202001-03-21 18:09:46 +00001085class FunctionTestCase(TestCase):
1086 """A test case that wraps a test function.
1087
1088 This is useful for slipping pre-existing test functions into the
Georg Brandl15c5ce92007-03-07 09:09:40 +00001089 unittest framework. Optionally, set-up and tidy-up functions can be
Fred Drake02538202001-03-21 18:09:46 +00001090 supplied. As with TestCase, the tidy-up ('tearDown') function will
1091 always be called if the set-up ('setUp') function ran successfully.
1092 """
1093
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001094 def __init__(self, testFunc, setUp=None, tearDown=None, description=None):
1095 super(FunctionTestCase, self).__init__()
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001096 self._setUpFunc = setUp
1097 self._tearDownFunc = tearDown
1098 self._testFunc = testFunc
1099 self._description = description
Fred Drake02538202001-03-21 18:09:46 +00001100
1101 def setUp(self):
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001102 if self._setUpFunc is not None:
1103 self._setUpFunc()
Fred Drake02538202001-03-21 18:09:46 +00001104
1105 def tearDown(self):
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001106 if self._tearDownFunc is not None:
1107 self._tearDownFunc()
Fred Drake02538202001-03-21 18:09:46 +00001108
1109 def runTest(self):
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001110 self._testFunc()
Fred Drake02538202001-03-21 18:09:46 +00001111
1112 def id(self):
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001113 return self._testFunc.__name__
Fred Drake02538202001-03-21 18:09:46 +00001114
Georg Brandl15c5ce92007-03-07 09:09:40 +00001115 def __eq__(self, other):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001116 if not isinstance(other, self.__class__):
1117 return NotImplemented
Georg Brandl15c5ce92007-03-07 09:09:40 +00001118
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001119 return self._setUpFunc == other._setUpFunc and \
1120 self._tearDownFunc == other._tearDownFunc and \
1121 self._testFunc == other._testFunc and \
1122 self._description == other._description
Georg Brandl15c5ce92007-03-07 09:09:40 +00001123
1124 def __ne__(self, other):
1125 return not self == other
1126
1127 def __hash__(self):
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001128 return hash((type(self), self._setUpFunc, self._tearDownFunc,
1129 self._testFunc, self._description))
Georg Brandl15c5ce92007-03-07 09:09:40 +00001130
Fred Drake02538202001-03-21 18:09:46 +00001131 def __str__(self):
Steve Purcelldc391a62002-08-09 09:46:23 +00001132 return "%s (%s)" % (_strclass(self.__class__), self.__testFunc.__name__)
Fred Drake02538202001-03-21 18:09:46 +00001133
1134 def __repr__(self):
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001135 return "<%s testFunc=%s>" % (_strclass(self.__class__), self._testFunc)
Fred Drake02538202001-03-21 18:09:46 +00001136
1137 def shortDescription(self):
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001138 if self._description is not None:
1139 return self._description
1140 doc = self._testFunc.__doc__
Steve Purcell7e743842003-09-22 11:08:12 +00001141 return doc and doc.split("\n")[0].strip() or None
Fred Drake02538202001-03-21 18:09:46 +00001142
1143
1144
1145##############################################################################
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001146# Locating and loading tests
Fred Drake02538202001-03-21 18:09:46 +00001147##############################################################################
1148
Antoine Pitroudae1a6a2008-12-28 16:01:11 +00001149class TestLoader(object):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001150 """
1151 This class is responsible for loading tests according to various criteria
1152 and returning them wrapped in a TestSuite
Fred Drake02538202001-03-21 18:09:46 +00001153 """
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001154 testMethodPrefix = 'test'
1155 sortTestMethodsUsing = cmp
1156 suiteClass = TestSuite
Benjamin Peterson692428e2009-03-23 21:50:21 +00001157 classSuiteClass = ClassTestSuite
Fred Drake02538202001-03-21 18:09:46 +00001158
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001159 def loadTestsFromTestCase(self, testCaseClass):
Steve Purcell15d89272001-04-12 09:05:01 +00001160 """Return a suite of all tests cases contained in testCaseClass"""
Johannes Gijsbersd7b6ad42004-11-07 15:46:25 +00001161 if issubclass(testCaseClass, TestSuite):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001162 raise TypeError("Test cases should not be derived from TestSuite." \
1163 " Maybe you meant to derive from TestCase?")
Steve Purcell7e743842003-09-22 11:08:12 +00001164 testCaseNames = self.getTestCaseNames(testCaseClass)
1165 if not testCaseNames and hasattr(testCaseClass, 'runTest'):
1166 testCaseNames = ['runTest']
Benjamin Peterson692428e2009-03-23 21:50:21 +00001167 suite = self.classSuiteClass(map(testCaseClass, testCaseNames),
1168 testCaseClass)
1169 return suite
Fred Drake02538202001-03-21 18:09:46 +00001170
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001171 def loadTestsFromModule(self, module):
Steve Purcell15d89272001-04-12 09:05:01 +00001172 """Return a suite of all tests cases contained in the given module"""
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001173 tests = []
1174 for name in dir(module):
1175 obj = getattr(module, name)
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001176 if isinstance(obj, type) and issubclass(obj, TestCase):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001177 tests.append(self.loadTestsFromTestCase(obj))
1178 return self.suiteClass(tests)
Fred Drake02538202001-03-21 18:09:46 +00001179
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001180 def loadTestsFromName(self, name, module=None):
Steve Purcell15d89272001-04-12 09:05:01 +00001181 """Return a suite of all tests cases given a string specifier.
1182
1183 The name may resolve either to a module, a test case class, a
1184 test method within a test case class, or a callable object which
1185 returns a TestCase or TestSuite instance.
Tim Peters613b2222001-04-13 05:37:27 +00001186
Steve Purcell15d89272001-04-12 09:05:01 +00001187 The method optionally resolves the names relative to a given module.
1188 """
Steve Purcell7e743842003-09-22 11:08:12 +00001189 parts = name.split('.')
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001190 if module is None:
Steve Purcell7e743842003-09-22 11:08:12 +00001191 parts_copy = parts[:]
1192 while parts_copy:
1193 try:
1194 module = __import__('.'.join(parts_copy))
1195 break
1196 except ImportError:
1197 del parts_copy[-1]
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001198 if not parts_copy:
1199 raise
Armin Rigo1b3c04b2003-10-24 17:15:29 +00001200 parts = parts[1:]
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001201 obj = module
1202 for part in parts:
Steve Purcell7e743842003-09-22 11:08:12 +00001203 parent, obj = obj, getattr(obj, part)
Fred Drake02538202001-03-21 18:09:46 +00001204
Antoine Pitroudae1a6a2008-12-28 16:01:11 +00001205 if isinstance(obj, types.ModuleType):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001206 return self.loadTestsFromModule(obj)
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001207 elif isinstance(obj, type) and issubclass(obj, TestCase):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001208 return self.loadTestsFromTestCase(obj)
Antoine Pitroudae1a6a2008-12-28 16:01:11 +00001209 elif (isinstance(obj, types.UnboundMethodType) and
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001210 isinstance(parent, type) and
Georg Brandl15c5ce92007-03-07 09:09:40 +00001211 issubclass(parent, TestCase)):
1212 return TestSuite([parent(obj.__name__)])
Steve Purcell397b45d2003-10-26 10:41:03 +00001213 elif isinstance(obj, TestSuite):
Steve Purcell7e743842003-09-22 11:08:12 +00001214 return obj
Raymond Hettinger5930d8f2008-07-10 16:06:41 +00001215 elif hasattr(obj, '__call__'):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001216 test = obj()
Georg Brandl15c5ce92007-03-07 09:09:40 +00001217 if isinstance(test, TestSuite):
1218 return test
1219 elif isinstance(test, TestCase):
1220 return TestSuite([test])
1221 else:
1222 raise TypeError("calling %s returned %s, not a test" %
1223 (obj, test))
Fred Drake02538202001-03-21 18:09:46 +00001224 else:
Georg Brandl15c5ce92007-03-07 09:09:40 +00001225 raise TypeError("don't know how to make test from: %s" % obj)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001226
1227 def loadTestsFromNames(self, names, module=None):
Steve Purcell15d89272001-04-12 09:05:01 +00001228 """Return a suite of all tests cases found using the given sequence
1229 of string specifiers. See 'loadTestsFromName()'.
1230 """
Steve Purcell7e743842003-09-22 11:08:12 +00001231 suites = [self.loadTestsFromName(name, module) for name in names]
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001232 return self.suiteClass(suites)
1233
1234 def getTestCaseNames(self, testCaseClass):
Steve Purcell15d89272001-04-12 09:05:01 +00001235 """Return a sorted sequence of method names found within testCaseClass
1236 """
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001237 def isTestMethod(attrname, testCaseClass=testCaseClass,
1238 prefix=self.testMethodPrefix):
1239 return attrname.startswith(prefix) and \
1240 hasattr(getattr(testCaseClass, attrname), '__call__')
Steve Purcell7e743842003-09-22 11:08:12 +00001241 testFnNames = filter(isTestMethod, dir(testCaseClass))
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001242 if self.sortTestMethodsUsing:
Raymond Hettinger5930d8f2008-07-10 16:06:41 +00001243 testFnNames.sort(key=_CmpToKey(self.sortTestMethodsUsing))
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001244 return testFnNames
1245
1246
1247
1248defaultTestLoader = TestLoader()
1249
1250
1251##############################################################################
1252# Patches for old functions: these functions should be considered obsolete
1253##############################################################################
1254
1255def _makeLoader(prefix, sortUsing, suiteClass=None):
1256 loader = TestLoader()
1257 loader.sortTestMethodsUsing = sortUsing
1258 loader.testMethodPrefix = prefix
1259 if suiteClass: loader.suiteClass = suiteClass
1260 return loader
1261
1262def getTestCaseNames(testCaseClass, prefix, sortUsing=cmp):
1263 return _makeLoader(prefix, sortUsing).getTestCaseNames(testCaseClass)
1264
1265def makeSuite(testCaseClass, prefix='test', sortUsing=cmp, suiteClass=TestSuite):
1266 return _makeLoader(prefix, sortUsing, suiteClass).loadTestsFromTestCase(testCaseClass)
1267
1268def findTestCases(module, prefix='test', sortUsing=cmp, suiteClass=TestSuite):
1269 return _makeLoader(prefix, sortUsing, suiteClass).loadTestsFromModule(module)
Fred Drake02538202001-03-21 18:09:46 +00001270
1271
1272##############################################################################
1273# Text UI
1274##############################################################################
1275
Antoine Pitroudae1a6a2008-12-28 16:01:11 +00001276class _WritelnDecorator(object):
Fred Drake02538202001-03-21 18:09:46 +00001277 """Used to decorate file-like objects with a handy 'writeln' method"""
1278 def __init__(self,stream):
1279 self.stream = stream
Fred Drake02538202001-03-21 18:09:46 +00001280
1281 def __getattr__(self, attr):
1282 return getattr(self.stream,attr)
1283
Raymond Hettinger91dd19d2003-09-13 02:58:00 +00001284 def writeln(self, arg=None):
Benjamin Petersond0cdb2d2009-03-24 23:07:07 +00001285 if arg:
1286 self.write(arg)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001287 self.write('\n') # text-mode streams translate to \r\n if needed
Tim Petersa19a1682001-03-29 04:36:09 +00001288
Fred Drake02538202001-03-21 18:09:46 +00001289
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001290class _TextTestResult(TestResult):
Fred Drake02538202001-03-21 18:09:46 +00001291 """A test result class that can print formatted text results to a stream.
1292
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001293 Used by TextTestRunner.
Fred Drake02538202001-03-21 18:09:46 +00001294 """
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001295 separator1 = '=' * 70
1296 separator2 = '-' * 70
Fred Drake02538202001-03-21 18:09:46 +00001297
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001298 def __init__(self, stream, descriptions, verbosity):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001299 super(_TextTestResult, self).__init__()
Fred Drake02538202001-03-21 18:09:46 +00001300 self.stream = stream
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001301 self.showAll = verbosity > 1
1302 self.dots = verbosity == 1
Fred Drake02538202001-03-21 18:09:46 +00001303 self.descriptions = descriptions
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001304
1305 def getDescription(self, test):
1306 if self.descriptions:
1307 return test.shortDescription() or str(test)
1308 else:
1309 return str(test)
1310
Fred Drake02538202001-03-21 18:09:46 +00001311 def startTest(self, test):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001312 super(_TextTestResult, self).startTest(test)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001313 if self.showAll:
1314 self.stream.write(self.getDescription(test))
1315 self.stream.write(" ... ")
Georg Brandld0632402008-05-11 15:17:41 +00001316 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +00001317
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001318 def addSuccess(self, test):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001319 super(_TextTestResult, self).addSuccess(test)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001320 if self.showAll:
Fred Drake02538202001-03-21 18:09:46 +00001321 self.stream.writeln("ok")
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001322 elif self.dots:
1323 self.stream.write('.')
Georg Brandld0632402008-05-11 15:17:41 +00001324 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +00001325
1326 def addError(self, test, err):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001327 super(_TextTestResult, self).addError(test, err)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001328 if self.showAll:
1329 self.stream.writeln("ERROR")
1330 elif self.dots:
1331 self.stream.write('E')
Georg Brandld0632402008-05-11 15:17:41 +00001332 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +00001333
1334 def addFailure(self, test, err):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001335 super(_TextTestResult, self).addFailure(test, err)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001336 if self.showAll:
1337 self.stream.writeln("FAIL")
1338 elif self.dots:
1339 self.stream.write('F')
Georg Brandld0632402008-05-11 15:17:41 +00001340 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +00001341
Benjamin Peterson692428e2009-03-23 21:50:21 +00001342 def addSkip(self, test, reason):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001343 super(_TextTestResult, self).addSkip(test, reason)
Benjamin Peterson692428e2009-03-23 21:50:21 +00001344 if self.showAll:
1345 self.stream.writeln("skipped {0!r}".format(reason))
1346 elif self.dots:
1347 self.stream.write("s")
1348 self.stream.flush()
1349
1350 def addExpectedFailure(self, test, err):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001351 super(_TextTestResult, self).addExpectedFailure(test, err)
Benjamin Peterson692428e2009-03-23 21:50:21 +00001352 if self.showAll:
1353 self.stream.writeln("expected failure")
1354 elif self.dots:
Benjamin Petersona8adceb2009-03-25 21:24:04 +00001355 self.stream.write("x")
Benjamin Peterson692428e2009-03-23 21:50:21 +00001356 self.stream.flush()
1357
1358 def addUnexpectedSuccess(self, test):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001359 super(_TextTestResult, self).addUnexpectedSuccess(test)
Benjamin Peterson692428e2009-03-23 21:50:21 +00001360 if self.showAll:
1361 self.stream.writeln("unexpected success")
1362 elif self.dots:
Benjamin Petersona8adceb2009-03-25 21:24:04 +00001363 self.stream.write("u")
Benjamin Peterson692428e2009-03-23 21:50:21 +00001364 self.stream.flush()
1365
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001366 def printErrors(self):
1367 if self.dots or self.showAll:
Fred Drake02538202001-03-21 18:09:46 +00001368 self.stream.writeln()
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001369 self.printErrorList('ERROR', self.errors)
1370 self.printErrorList('FAIL', self.failures)
1371
1372 def printErrorList(self, flavour, errors):
1373 for test, err in errors:
1374 self.stream.writeln(self.separator1)
1375 self.stream.writeln("%s: %s" % (flavour,self.getDescription(test)))
1376 self.stream.writeln(self.separator2)
Steve Purcell7b065702001-09-06 08:24:40 +00001377 self.stream.writeln("%s" % err)
Fred Drake02538202001-03-21 18:09:46 +00001378
1379
Antoine Pitroudae1a6a2008-12-28 16:01:11 +00001380class TextTestRunner(object):
Fred Drake02538202001-03-21 18:09:46 +00001381 """A test runner class that displays results in textual form.
Tim Petersa19a1682001-03-29 04:36:09 +00001382
Fred Drake02538202001-03-21 18:09:46 +00001383 It prints out the names of tests as they are run, errors as they
1384 occur, and a summary of the results at the end of the test run.
1385 """
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001386 def __init__(self, stream=sys.stderr, descriptions=1, verbosity=1):
Fred Drake02538202001-03-21 18:09:46 +00001387 self.stream = _WritelnDecorator(stream)
1388 self.descriptions = descriptions
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001389 self.verbosity = verbosity
1390
1391 def _makeResult(self):
1392 return _TextTestResult(self.stream, self.descriptions, self.verbosity)
Fred Drake02538202001-03-21 18:09:46 +00001393
1394 def run(self, test):
1395 "Run the given test case or test suite."
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001396 result = self._makeResult()
Fred Drake02538202001-03-21 18:09:46 +00001397 startTime = time.time()
1398 test(result)
1399 stopTime = time.time()
Steve Purcell397b45d2003-10-26 10:41:03 +00001400 timeTaken = stopTime - startTime
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001401 result.printErrors()
1402 self.stream.writeln(result.separator2)
Fred Drake02538202001-03-21 18:09:46 +00001403 run = result.testsRun
1404 self.stream.writeln("Ran %d test%s in %.3fs" %
Neal Norwitz76165042002-05-31 14:15:11 +00001405 (run, run != 1 and "s" or "", timeTaken))
Fred Drake02538202001-03-21 18:09:46 +00001406 self.stream.writeln()
Benjamin Petersoncb2b0e42009-03-23 22:29:45 +00001407 results = map(len, (result.expectedFailures,
1408 result.unexpectedSuccesses,
Benjamin Peterson692428e2009-03-23 21:50:21 +00001409 result.skipped))
Benjamin Petersoncb2b0e42009-03-23 22:29:45 +00001410 expectedFails, unexpectedSuccesses, skipped = results
Benjamin Peterson692428e2009-03-23 21:50:21 +00001411 infos = []
Fred Drake02538202001-03-21 18:09:46 +00001412 if not result.wasSuccessful():
Benjamin Peterson692428e2009-03-23 21:50:21 +00001413 self.stream.write("FAILED")
Fred Drake02538202001-03-21 18:09:46 +00001414 failed, errored = map(len, (result.failures, result.errors))
1415 if failed:
Benjamin Peterson692428e2009-03-23 21:50:21 +00001416 infos.append("failures=%d" % failed)
Fred Drake02538202001-03-21 18:09:46 +00001417 if errored:
Benjamin Peterson692428e2009-03-23 21:50:21 +00001418 infos.append("errors=%d" % errored)
Fred Drake02538202001-03-21 18:09:46 +00001419 else:
Benjamin Petersona473f002009-03-24 22:56:32 +00001420 self.stream.write("OK")
Benjamin Peterson692428e2009-03-23 21:50:21 +00001421 if skipped:
1422 infos.append("skipped=%d" % skipped)
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001423 if expectedFails:
1424 infos.append("expected failures=%d" % expectedFails)
1425 if unexpectedSuccesses:
1426 infos.append("unexpected successes=%d" % unexpectedSuccesses)
Benjamin Peterson692428e2009-03-23 21:50:21 +00001427 if infos:
1428 self.stream.writeln(" (%s)" % (", ".join(infos),))
Benjamin Petersona473f002009-03-24 22:56:32 +00001429 else:
1430 self.stream.write("\n")
Fred Drake02538202001-03-21 18:09:46 +00001431 return result
Tim Petersa19a1682001-03-29 04:36:09 +00001432
Fred Drake02538202001-03-21 18:09:46 +00001433
Fred Drake02538202001-03-21 18:09:46 +00001434
1435##############################################################################
1436# Facilities for running tests from the command line
1437##############################################################################
1438
Antoine Pitroudae1a6a2008-12-28 16:01:11 +00001439class TestProgram(object):
Fred Drake02538202001-03-21 18:09:46 +00001440 """A command-line program that runs a set of tests; this is primarily
1441 for making test modules conveniently executable.
1442 """
1443 USAGE = """\
Steve Purcell17a781b2001-04-09 15:37:31 +00001444Usage: %(progName)s [options] [test] [...]
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001445
1446Options:
1447 -h, --help Show this message
1448 -v, --verbose Verbose output
1449 -q, --quiet Minimal output
Fred Drake02538202001-03-21 18:09:46 +00001450
1451Examples:
1452 %(progName)s - run default set of tests
1453 %(progName)s MyTestSuite - run suite 'MyTestSuite'
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001454 %(progName)s MyTestCase.testSomething - run MyTestCase.testSomething
1455 %(progName)s MyTestCase - run all 'test*' test methods
Fred Drake02538202001-03-21 18:09:46 +00001456 in MyTestCase
1457"""
1458 def __init__(self, module='__main__', defaultTest=None,
Georg Brandld0a96252007-03-07 09:21:06 +00001459 argv=None, testRunner=TextTestRunner,
1460 testLoader=defaultTestLoader):
Antoine Pitroudae1a6a2008-12-28 16:01:11 +00001461 if isinstance(module, basestring):
Fred Drake02538202001-03-21 18:09:46 +00001462 self.module = __import__(module)
Steve Purcell7e743842003-09-22 11:08:12 +00001463 for part in module.split('.')[1:]:
Fred Drake02538202001-03-21 18:09:46 +00001464 self.module = getattr(self.module, part)
1465 else:
1466 self.module = module
1467 if argv is None:
1468 argv = sys.argv
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001469 self.verbosity = 1
Fred Drake02538202001-03-21 18:09:46 +00001470 self.defaultTest = defaultTest
1471 self.testRunner = testRunner
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001472 self.testLoader = testLoader
Fred Drake02538202001-03-21 18:09:46 +00001473 self.progName = os.path.basename(argv[0])
1474 self.parseArgs(argv)
Fred Drake02538202001-03-21 18:09:46 +00001475 self.runTests()
1476
1477 def usageExit(self, msg=None):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001478 if msg:
1479 print msg
Fred Drake02538202001-03-21 18:09:46 +00001480 print self.USAGE % self.__dict__
1481 sys.exit(2)
1482
1483 def parseArgs(self, argv):
1484 import getopt
Benjamin Peterson692428e2009-03-23 21:50:21 +00001485 long_opts = ['help','verbose','quiet']
Fred Drake02538202001-03-21 18:09:46 +00001486 try:
Benjamin Peterson692428e2009-03-23 21:50:21 +00001487 options, args = getopt.getopt(argv[1:], 'hHvq', long_opts)
Fred Drake02538202001-03-21 18:09:46 +00001488 for opt, value in options:
1489 if opt in ('-h','-H','--help'):
1490 self.usageExit()
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001491 if opt in ('-q','--quiet'):
1492 self.verbosity = 0
1493 if opt in ('-v','--verbose'):
1494 self.verbosity = 2
Fred Drake02538202001-03-21 18:09:46 +00001495 if len(args) == 0 and self.defaultTest is None:
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001496 self.test = self.testLoader.loadTestsFromModule(self.module)
1497 return
Fred Drake02538202001-03-21 18:09:46 +00001498 if len(args) > 0:
1499 self.testNames = args
1500 else:
1501 self.testNames = (self.defaultTest,)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001502 self.createTests()
Fred Drake02538202001-03-21 18:09:46 +00001503 except getopt.error, msg:
1504 self.usageExit(msg)
1505
1506 def createTests(self):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001507 self.test = self.testLoader.loadTestsFromNames(self.testNames,
1508 self.module)
Fred Drake02538202001-03-21 18:09:46 +00001509
1510 def runTests(self):
Georg Brandld0a96252007-03-07 09:21:06 +00001511 if isinstance(self.testRunner, (type, types.ClassType)):
1512 try:
1513 testRunner = self.testRunner(verbosity=self.verbosity)
1514 except TypeError:
1515 # didn't accept the verbosity argument
1516 testRunner = self.testRunner()
1517 else:
1518 # it is assumed to be a TestRunner instance
1519 testRunner = self.testRunner
1520 result = testRunner.run(self.test)
Tim Petersa19a1682001-03-29 04:36:09 +00001521 sys.exit(not result.wasSuccessful())
Fred Drake02538202001-03-21 18:09:46 +00001522
1523main = TestProgram
1524
1525
1526##############################################################################
1527# Executing this module from the command line
1528##############################################################################
1529
1530if __name__ == "__main__":
1531 main(module=None)