blob: f99f958d913263254dc7d966e4d6074ae4f53cea [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
Michael Foordf2dfef12009-04-05 19:19:28 +0000809 def assertIs(self, expr1, expr2, msg=None):
810 """Just like self.assertTrue(a is b), but with a nicer default message."""
811 if expr1 is not expr2:
812 standardMsg = '%r is not %r' % (expr1, expr2)
813 self.fail(self._formatMessage(msg, standardMsg))
814
815 def assertIsNot(self, expr1, expr2, msg=None):
816 """Just like self.assertTrue(a is not b), but with a nicer default message."""
817 if expr1 is expr2:
818 standardMsg = 'unexpectedly identical: %r' % (expr1,)
819 self.fail(self._formatMessage(msg, standardMsg))
820
Gregory P. Smith28399852009-03-31 16:54:10 +0000821 def assertDictEqual(self, d1, d2, msg=None):
822 self.assert_(isinstance(d1, dict), 'First argument is not a dictionary')
823 self.assert_(isinstance(d2, dict), 'Second argument is not a dictionary')
824
825 if d1 != d2:
Michael Foord345b2fe2009-04-02 03:20:38 +0000826 standardMsg = ('\n' + '\n'.join(difflib.ndiff(
827 pprint.pformat(d1).splitlines(),
828 pprint.pformat(d2).splitlines())))
829 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000830
831 def assertDictContainsSubset(self, expected, actual, msg=None):
832 """Checks whether actual is a superset of expected."""
833 missing = []
834 mismatched = []
835 for key, value in expected.iteritems():
836 if key not in actual:
837 missing.append(key)
838 elif value != actual[key]:
Michael Foord345b2fe2009-04-02 03:20:38 +0000839 mismatched.append('%s, expected: %s, actual: %s' % (key, value, actual[key]))
Gregory P. Smith28399852009-03-31 16:54:10 +0000840
841 if not (missing or mismatched):
842 return
843
Michael Foord345b2fe2009-04-02 03:20:38 +0000844 standardMsg = ''
Gregory P. Smith28399852009-03-31 16:54:10 +0000845 if missing:
Michael Foord345b2fe2009-04-02 03:20:38 +0000846 standardMsg = 'Missing: %r' % ','.join(missing)
Gregory P. Smith28399852009-03-31 16:54:10 +0000847 if mismatched:
Michael Foord345b2fe2009-04-02 03:20:38 +0000848 if standardMsg:
849 standardMsg += '; '
850 standardMsg += 'Mismatched values: %s' % ','.join(mismatched)
Gregory P. Smith28399852009-03-31 16:54:10 +0000851
Michael Foord345b2fe2009-04-02 03:20:38 +0000852 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000853
854 def assertSameElements(self, expected_seq, actual_seq, msg=None):
855 """An unordered sequence specific comparison.
856
857 Raises with an error message listing which elements of expected_seq
858 are missing from actual_seq and vice versa if any.
859 """
860 try:
861 expected = set(expected_seq)
862 actual = set(actual_seq)
863 missing = list(expected.difference(actual))
864 unexpected = list(actual.difference(expected))
865 missing.sort()
866 unexpected.sort()
867 except TypeError:
868 # Fall back to slower list-compare if any of the objects are
869 # not hashable.
870 expected = list(expected_seq)
871 actual = list(actual_seq)
872 expected.sort()
873 actual.sort()
874 missing, unexpected = _SortedListDifference(expected, actual)
875 errors = []
876 if missing:
Michael Foord345b2fe2009-04-02 03:20:38 +0000877 errors.append('Expected, but missing:\n %r' % missing)
Gregory P. Smith28399852009-03-31 16:54:10 +0000878 if unexpected:
Michael Foord345b2fe2009-04-02 03:20:38 +0000879 errors.append('Unexpected, but present:\n %r' % unexpected)
Gregory P. Smith28399852009-03-31 16:54:10 +0000880 if errors:
Michael Foord345b2fe2009-04-02 03:20:38 +0000881 standardMsg = '\n'.join(errors)
882 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000883
884 def assertMultiLineEqual(self, first, second, msg=None):
885 """Assert that two multi-line strings are equal."""
Michael Foord345b2fe2009-04-02 03:20:38 +0000886 self.assert_(isinstance(first, basestring), (
Gregory P. Smith28399852009-03-31 16:54:10 +0000887 'First argument is not a string'))
Michael Foord345b2fe2009-04-02 03:20:38 +0000888 self.assert_(isinstance(second, basestring), (
Gregory P. Smith28399852009-03-31 16:54:10 +0000889 'Second argument is not a string'))
890
891 if first != second:
Michael Foord345b2fe2009-04-02 03:20:38 +0000892 standardMsg = '\n' + ''.join(difflib.ndiff(first.splitlines(True), second.splitlines(True)))
893 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000894
895 def assertLess(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 less than %r' % (a, b)
899 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000900
901 def assertLessEqual(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 less 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 assertGreater(self, a, b, msg=None):
Michael Foord345b2fe2009-04-02 03:20:38 +0000908 """Just like self.assertTrue(a > b), but with a nicer default message."""
909 if not a > b:
910 standardMsg = '%r not greater than %r' % (a, b)
911 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000912
913 def assertGreaterEqual(self, a, b, msg=None):
Michael Foord345b2fe2009-04-02 03:20:38 +0000914 """Just like self.assertTrue(a >= b), but with a nicer default message."""
915 if not a >= b:
916 standardMsg = '%r not greater than or equal to %r' % (a, b)
917 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000918
919 def assertIsNone(self, obj, msg=None):
Michael Foord345b2fe2009-04-02 03:20:38 +0000920 """Same as self.assertTrue(obj is None), with a nicer default message."""
921 if obj is not None:
922 standardMsg = '%r is not None' % obj
923 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000924
Michael Foord345b2fe2009-04-02 03:20:38 +0000925 def assertIsNotNone(self, obj, msg=None):
Gregory P. Smith28399852009-03-31 16:54:10 +0000926 """Included for symmetry with assertIsNone."""
Michael Foord345b2fe2009-04-02 03:20:38 +0000927 if obj is None:
928 standardMsg = 'unexpectedly None'
929 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000930
931 def assertRaisesRegexp(self, expected_exception, expected_regexp,
932 callable_obj=None, *args, **kwargs):
933 """Asserts that the message in a raised exception matches a regexp.
934
935 Args:
936 expected_exception: Exception class expected to be raised.
937 expected_regexp: Regexp (re pattern object or string) expected
938 to be found in error message.
939 callable_obj: Function to be called.
940 args: Extra args.
941 kwargs: Extra kwargs.
942 """
943 context = _AssertRaisesContext(expected_exception, self, expected_regexp)
944 if callable_obj is None:
945 return context
946 with context:
947 callable_obj(*args, **kwargs)
948
949 def assertRegexpMatches(self, text, expected_regex, msg=None):
950 if isinstance(expected_regex, basestring):
951 expected_regex = re.compile(expected_regex)
952 if not expected_regex.search(text):
953 msg = msg or "Regexp didn't match"
954 msg = '%s: %r not found in %r' % (msg, expected_regex.pattern, text)
955 raise self.failureException(msg)
956
957
958def _SortedListDifference(expected, actual):
959 """Finds elements in only one or the other of two, sorted input lists.
960
961 Returns a two-element tuple of lists. The first list contains those
962 elements in the "expected" list but not in the "actual" list, and the
963 second contains those elements in the "actual" list but not in the
964 "expected" list. Duplicate elements in either input list are ignored.
965 """
966 i = j = 0
967 missing = []
968 unexpected = []
969 while True:
970 try:
971 e = expected[i]
972 a = actual[j]
973 if e < a:
974 missing.append(e)
975 i += 1
976 while expected[i] == e:
977 i += 1
978 elif e > a:
979 unexpected.append(a)
980 j += 1
981 while actual[j] == a:
982 j += 1
983 else:
984 i += 1
985 try:
986 while expected[i] == e:
987 i += 1
988 finally:
989 j += 1
990 while actual[j] == a:
991 j += 1
992 except IndexError:
993 missing.extend(expected[i:])
994 unexpected.extend(actual[j:])
995 break
996 return missing, unexpected
997
Fred Drake02538202001-03-21 18:09:46 +0000998
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000999class TestSuite(object):
Fred Drake02538202001-03-21 18:09:46 +00001000 """A test suite is a composite test consisting of a number of TestCases.
1001
1002 For use, create an instance of TestSuite, then add test case instances.
1003 When all tests have been added, the suite can be passed to a test
1004 runner, such as TextTestRunner. It will run the individual test cases
1005 in the order in which they were added, aggregating the results. When
1006 subclassing, do not forget to call the base class constructor.
1007 """
1008 def __init__(self, tests=()):
1009 self._tests = []
1010 self.addTests(tests)
1011
1012 def __repr__(self):
Michael Foord37d89a22009-04-05 01:15:01 +00001013 return "<%s tests=%s>" % (_strclass(self.__class__), list(self))
Fred Drake02538202001-03-21 18:09:46 +00001014
Georg Brandl15c5ce92007-03-07 09:09:40 +00001015 def __eq__(self, other):
Benjamin Peterson692428e2009-03-23 21:50:21 +00001016 if not isinstance(other, self.__class__):
1017 return NotImplemented
Georg Brandl15c5ce92007-03-07 09:09:40 +00001018 return self._tests == other._tests
1019
1020 def __ne__(self, other):
1021 return not self == other
1022
Nick Coghlan48361f52008-08-11 15:45:58 +00001023 # Can't guarantee hash invariant, so flag as unhashable
1024 __hash__ = None
1025
Jim Fultonfafd8742004-08-28 15:22:12 +00001026 def __iter__(self):
1027 return iter(self._tests)
1028
Fred Drake02538202001-03-21 18:09:46 +00001029 def countTestCases(self):
1030 cases = 0
Michael Foord37d89a22009-04-05 01:15:01 +00001031 for test in self:
Steve Purcell7e743842003-09-22 11:08:12 +00001032 cases += test.countTestCases()
Fred Drake02538202001-03-21 18:09:46 +00001033 return cases
1034
1035 def addTest(self, test):
Georg Brandld9e50262007-03-07 11:54:49 +00001036 # sanity checks
Raymond Hettinger5930d8f2008-07-10 16:06:41 +00001037 if not hasattr(test, '__call__'):
Georg Brandld9e50262007-03-07 11:54:49 +00001038 raise TypeError("the test to add must be callable")
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001039 if isinstance(test, type) and issubclass(test, (TestCase, TestSuite)):
Georg Brandld9e50262007-03-07 11:54:49 +00001040 raise TypeError("TestCases and TestSuites must be instantiated "
1041 "before passing them to addTest()")
Fred Drake02538202001-03-21 18:09:46 +00001042 self._tests.append(test)
1043
1044 def addTests(self, tests):
Georg Brandld9e50262007-03-07 11:54:49 +00001045 if isinstance(tests, basestring):
1046 raise TypeError("tests must be an iterable of tests, not a string")
Fred Drake02538202001-03-21 18:09:46 +00001047 for test in tests:
1048 self.addTest(test)
1049
1050 def run(self, result):
Michael Foord37d89a22009-04-05 01:15:01 +00001051 for test in self:
Fred Drake02538202001-03-21 18:09:46 +00001052 if result.shouldStop:
1053 break
1054 test(result)
1055 return result
1056
Raymond Hettinger664347b2004-12-04 21:21:53 +00001057 def __call__(self, *args, **kwds):
1058 return self.run(*args, **kwds)
1059
Fred Drake02538202001-03-21 18:09:46 +00001060 def debug(self):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001061 """Run the tests without collecting errors in a TestResult"""
Michael Foord37d89a22009-04-05 01:15:01 +00001062 for test in self:
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001063 test.debug()
Fred Drake02538202001-03-21 18:09:46 +00001064
1065
Benjamin Peterson692428e2009-03-23 21:50:21 +00001066class ClassTestSuite(TestSuite):
1067 """
1068 Suite of tests derived from a single TestCase class.
1069 """
1070
1071 def __init__(self, tests, class_collected_from):
1072 super(ClassTestSuite, self).__init__(tests)
1073 self.collected_from = class_collected_from
1074
1075 def id(self):
1076 module = getattr(self.collected_from, "__module__", None)
1077 if module is not None:
1078 return "{0}.{1}".format(module, self.collected_from.__name__)
1079 return self.collected_from.__name__
1080
1081 def run(self, result):
1082 if getattr(self.collected_from, "__unittest_skip__", False):
1083 # ClassTestSuite result pretends to be a TestCase enough to be
1084 # reported.
1085 result.startTest(self)
1086 try:
1087 result.addSkip(self, self.collected_from.__unittest_skip_why__)
1088 finally:
1089 result.stopTest(self)
1090 else:
1091 result = super(ClassTestSuite, self).run(result)
1092 return result
1093
1094 shortDescription = id
1095
1096
Fred Drake02538202001-03-21 18:09:46 +00001097class FunctionTestCase(TestCase):
1098 """A test case that wraps a test function.
1099
1100 This is useful for slipping pre-existing test functions into the
Georg Brandl15c5ce92007-03-07 09:09:40 +00001101 unittest framework. Optionally, set-up and tidy-up functions can be
Fred Drake02538202001-03-21 18:09:46 +00001102 supplied. As with TestCase, the tidy-up ('tearDown') function will
1103 always be called if the set-up ('setUp') function ran successfully.
1104 """
1105
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001106 def __init__(self, testFunc, setUp=None, tearDown=None, description=None):
1107 super(FunctionTestCase, self).__init__()
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001108 self._setUpFunc = setUp
1109 self._tearDownFunc = tearDown
1110 self._testFunc = testFunc
1111 self._description = description
Fred Drake02538202001-03-21 18:09:46 +00001112
1113 def setUp(self):
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001114 if self._setUpFunc is not None:
1115 self._setUpFunc()
Fred Drake02538202001-03-21 18:09:46 +00001116
1117 def tearDown(self):
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001118 if self._tearDownFunc is not None:
1119 self._tearDownFunc()
Fred Drake02538202001-03-21 18:09:46 +00001120
1121 def runTest(self):
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001122 self._testFunc()
Fred Drake02538202001-03-21 18:09:46 +00001123
1124 def id(self):
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001125 return self._testFunc.__name__
Fred Drake02538202001-03-21 18:09:46 +00001126
Georg Brandl15c5ce92007-03-07 09:09:40 +00001127 def __eq__(self, other):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001128 if not isinstance(other, self.__class__):
1129 return NotImplemented
Georg Brandl15c5ce92007-03-07 09:09:40 +00001130
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001131 return self._setUpFunc == other._setUpFunc and \
1132 self._tearDownFunc == other._tearDownFunc and \
1133 self._testFunc == other._testFunc and \
1134 self._description == other._description
Georg Brandl15c5ce92007-03-07 09:09:40 +00001135
1136 def __ne__(self, other):
1137 return not self == other
1138
1139 def __hash__(self):
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001140 return hash((type(self), self._setUpFunc, self._tearDownFunc,
1141 self._testFunc, self._description))
Georg Brandl15c5ce92007-03-07 09:09:40 +00001142
Fred Drake02538202001-03-21 18:09:46 +00001143 def __str__(self):
Steve Purcelldc391a62002-08-09 09:46:23 +00001144 return "%s (%s)" % (_strclass(self.__class__), self.__testFunc.__name__)
Fred Drake02538202001-03-21 18:09:46 +00001145
1146 def __repr__(self):
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001147 return "<%s testFunc=%s>" % (_strclass(self.__class__), self._testFunc)
Fred Drake02538202001-03-21 18:09:46 +00001148
1149 def shortDescription(self):
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001150 if self._description is not None:
1151 return self._description
1152 doc = self._testFunc.__doc__
Steve Purcell7e743842003-09-22 11:08:12 +00001153 return doc and doc.split("\n")[0].strip() or None
Fred Drake02538202001-03-21 18:09:46 +00001154
1155
1156
1157##############################################################################
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001158# Locating and loading tests
Fred Drake02538202001-03-21 18:09:46 +00001159##############################################################################
1160
Antoine Pitroudae1a6a2008-12-28 16:01:11 +00001161class TestLoader(object):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001162 """
1163 This class is responsible for loading tests according to various criteria
1164 and returning them wrapped in a TestSuite
Fred Drake02538202001-03-21 18:09:46 +00001165 """
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001166 testMethodPrefix = 'test'
1167 sortTestMethodsUsing = cmp
1168 suiteClass = TestSuite
Benjamin Peterson692428e2009-03-23 21:50:21 +00001169 classSuiteClass = ClassTestSuite
Fred Drake02538202001-03-21 18:09:46 +00001170
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001171 def loadTestsFromTestCase(self, testCaseClass):
Steve Purcell15d89272001-04-12 09:05:01 +00001172 """Return a suite of all tests cases contained in testCaseClass"""
Johannes Gijsbersd7b6ad42004-11-07 15:46:25 +00001173 if issubclass(testCaseClass, TestSuite):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001174 raise TypeError("Test cases should not be derived from TestSuite." \
1175 " Maybe you meant to derive from TestCase?")
Steve Purcell7e743842003-09-22 11:08:12 +00001176 testCaseNames = self.getTestCaseNames(testCaseClass)
1177 if not testCaseNames and hasattr(testCaseClass, 'runTest'):
1178 testCaseNames = ['runTest']
Benjamin Peterson692428e2009-03-23 21:50:21 +00001179 suite = self.classSuiteClass(map(testCaseClass, testCaseNames),
1180 testCaseClass)
1181 return suite
Fred Drake02538202001-03-21 18:09:46 +00001182
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001183 def loadTestsFromModule(self, module):
Steve Purcell15d89272001-04-12 09:05:01 +00001184 """Return a suite of all tests cases contained in the given module"""
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001185 tests = []
1186 for name in dir(module):
1187 obj = getattr(module, name)
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001188 if isinstance(obj, type) and issubclass(obj, TestCase):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001189 tests.append(self.loadTestsFromTestCase(obj))
1190 return self.suiteClass(tests)
Fred Drake02538202001-03-21 18:09:46 +00001191
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001192 def loadTestsFromName(self, name, module=None):
Steve Purcell15d89272001-04-12 09:05:01 +00001193 """Return a suite of all tests cases given a string specifier.
1194
1195 The name may resolve either to a module, a test case class, a
1196 test method within a test case class, or a callable object which
1197 returns a TestCase or TestSuite instance.
Tim Peters613b2222001-04-13 05:37:27 +00001198
Steve Purcell15d89272001-04-12 09:05:01 +00001199 The method optionally resolves the names relative to a given module.
1200 """
Steve Purcell7e743842003-09-22 11:08:12 +00001201 parts = name.split('.')
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001202 if module is None:
Steve Purcell7e743842003-09-22 11:08:12 +00001203 parts_copy = parts[:]
1204 while parts_copy:
1205 try:
1206 module = __import__('.'.join(parts_copy))
1207 break
1208 except ImportError:
1209 del parts_copy[-1]
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001210 if not parts_copy:
1211 raise
Armin Rigo1b3c04b2003-10-24 17:15:29 +00001212 parts = parts[1:]
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001213 obj = module
1214 for part in parts:
Steve Purcell7e743842003-09-22 11:08:12 +00001215 parent, obj = obj, getattr(obj, part)
Fred Drake02538202001-03-21 18:09:46 +00001216
Antoine Pitroudae1a6a2008-12-28 16:01:11 +00001217 if isinstance(obj, types.ModuleType):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001218 return self.loadTestsFromModule(obj)
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001219 elif isinstance(obj, type) and issubclass(obj, TestCase):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001220 return self.loadTestsFromTestCase(obj)
Antoine Pitroudae1a6a2008-12-28 16:01:11 +00001221 elif (isinstance(obj, types.UnboundMethodType) and
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001222 isinstance(parent, type) and
Georg Brandl15c5ce92007-03-07 09:09:40 +00001223 issubclass(parent, TestCase)):
1224 return TestSuite([parent(obj.__name__)])
Steve Purcell397b45d2003-10-26 10:41:03 +00001225 elif isinstance(obj, TestSuite):
Steve Purcell7e743842003-09-22 11:08:12 +00001226 return obj
Raymond Hettinger5930d8f2008-07-10 16:06:41 +00001227 elif hasattr(obj, '__call__'):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001228 test = obj()
Georg Brandl15c5ce92007-03-07 09:09:40 +00001229 if isinstance(test, TestSuite):
1230 return test
1231 elif isinstance(test, TestCase):
1232 return TestSuite([test])
1233 else:
1234 raise TypeError("calling %s returned %s, not a test" %
1235 (obj, test))
Fred Drake02538202001-03-21 18:09:46 +00001236 else:
Georg Brandl15c5ce92007-03-07 09:09:40 +00001237 raise TypeError("don't know how to make test from: %s" % obj)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001238
1239 def loadTestsFromNames(self, names, module=None):
Steve Purcell15d89272001-04-12 09:05:01 +00001240 """Return a suite of all tests cases found using the given sequence
1241 of string specifiers. See 'loadTestsFromName()'.
1242 """
Steve Purcell7e743842003-09-22 11:08:12 +00001243 suites = [self.loadTestsFromName(name, module) for name in names]
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001244 return self.suiteClass(suites)
1245
1246 def getTestCaseNames(self, testCaseClass):
Steve Purcell15d89272001-04-12 09:05:01 +00001247 """Return a sorted sequence of method names found within testCaseClass
1248 """
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001249 def isTestMethod(attrname, testCaseClass=testCaseClass,
1250 prefix=self.testMethodPrefix):
1251 return attrname.startswith(prefix) and \
1252 hasattr(getattr(testCaseClass, attrname), '__call__')
Steve Purcell7e743842003-09-22 11:08:12 +00001253 testFnNames = filter(isTestMethod, dir(testCaseClass))
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001254 if self.sortTestMethodsUsing:
Raymond Hettinger5930d8f2008-07-10 16:06:41 +00001255 testFnNames.sort(key=_CmpToKey(self.sortTestMethodsUsing))
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001256 return testFnNames
1257
1258
1259
1260defaultTestLoader = TestLoader()
1261
1262
1263##############################################################################
1264# Patches for old functions: these functions should be considered obsolete
1265##############################################################################
1266
1267def _makeLoader(prefix, sortUsing, suiteClass=None):
1268 loader = TestLoader()
1269 loader.sortTestMethodsUsing = sortUsing
1270 loader.testMethodPrefix = prefix
1271 if suiteClass: loader.suiteClass = suiteClass
1272 return loader
1273
1274def getTestCaseNames(testCaseClass, prefix, sortUsing=cmp):
1275 return _makeLoader(prefix, sortUsing).getTestCaseNames(testCaseClass)
1276
1277def makeSuite(testCaseClass, prefix='test', sortUsing=cmp, suiteClass=TestSuite):
1278 return _makeLoader(prefix, sortUsing, suiteClass).loadTestsFromTestCase(testCaseClass)
1279
1280def findTestCases(module, prefix='test', sortUsing=cmp, suiteClass=TestSuite):
1281 return _makeLoader(prefix, sortUsing, suiteClass).loadTestsFromModule(module)
Fred Drake02538202001-03-21 18:09:46 +00001282
1283
1284##############################################################################
1285# Text UI
1286##############################################################################
1287
Antoine Pitroudae1a6a2008-12-28 16:01:11 +00001288class _WritelnDecorator(object):
Fred Drake02538202001-03-21 18:09:46 +00001289 """Used to decorate file-like objects with a handy 'writeln' method"""
1290 def __init__(self,stream):
1291 self.stream = stream
Fred Drake02538202001-03-21 18:09:46 +00001292
1293 def __getattr__(self, attr):
1294 return getattr(self.stream,attr)
1295
Raymond Hettinger91dd19d2003-09-13 02:58:00 +00001296 def writeln(self, arg=None):
Benjamin Petersond0cdb2d2009-03-24 23:07:07 +00001297 if arg:
1298 self.write(arg)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001299 self.write('\n') # text-mode streams translate to \r\n if needed
Tim Petersa19a1682001-03-29 04:36:09 +00001300
Fred Drake02538202001-03-21 18:09:46 +00001301
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001302class _TextTestResult(TestResult):
Fred Drake02538202001-03-21 18:09:46 +00001303 """A test result class that can print formatted text results to a stream.
1304
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001305 Used by TextTestRunner.
Fred Drake02538202001-03-21 18:09:46 +00001306 """
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001307 separator1 = '=' * 70
1308 separator2 = '-' * 70
Fred Drake02538202001-03-21 18:09:46 +00001309
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001310 def __init__(self, stream, descriptions, verbosity):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001311 super(_TextTestResult, self).__init__()
Fred Drake02538202001-03-21 18:09:46 +00001312 self.stream = stream
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001313 self.showAll = verbosity > 1
1314 self.dots = verbosity == 1
Fred Drake02538202001-03-21 18:09:46 +00001315 self.descriptions = descriptions
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001316
1317 def getDescription(self, test):
1318 if self.descriptions:
1319 return test.shortDescription() or str(test)
1320 else:
1321 return str(test)
1322
Fred Drake02538202001-03-21 18:09:46 +00001323 def startTest(self, test):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001324 super(_TextTestResult, self).startTest(test)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001325 if self.showAll:
1326 self.stream.write(self.getDescription(test))
1327 self.stream.write(" ... ")
Georg Brandld0632402008-05-11 15:17:41 +00001328 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +00001329
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001330 def addSuccess(self, test):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001331 super(_TextTestResult, self).addSuccess(test)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001332 if self.showAll:
Fred Drake02538202001-03-21 18:09:46 +00001333 self.stream.writeln("ok")
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001334 elif self.dots:
1335 self.stream.write('.')
Georg Brandld0632402008-05-11 15:17:41 +00001336 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +00001337
1338 def addError(self, test, err):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001339 super(_TextTestResult, self).addError(test, err)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001340 if self.showAll:
1341 self.stream.writeln("ERROR")
1342 elif self.dots:
1343 self.stream.write('E')
Georg Brandld0632402008-05-11 15:17:41 +00001344 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +00001345
1346 def addFailure(self, test, err):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001347 super(_TextTestResult, self).addFailure(test, err)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001348 if self.showAll:
1349 self.stream.writeln("FAIL")
1350 elif self.dots:
1351 self.stream.write('F')
Georg Brandld0632402008-05-11 15:17:41 +00001352 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +00001353
Benjamin Peterson692428e2009-03-23 21:50:21 +00001354 def addSkip(self, test, reason):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001355 super(_TextTestResult, self).addSkip(test, reason)
Benjamin Peterson692428e2009-03-23 21:50:21 +00001356 if self.showAll:
1357 self.stream.writeln("skipped {0!r}".format(reason))
1358 elif self.dots:
1359 self.stream.write("s")
1360 self.stream.flush()
1361
1362 def addExpectedFailure(self, test, err):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001363 super(_TextTestResult, self).addExpectedFailure(test, err)
Benjamin Peterson692428e2009-03-23 21:50:21 +00001364 if self.showAll:
1365 self.stream.writeln("expected failure")
1366 elif self.dots:
Benjamin Petersona8adceb2009-03-25 21:24:04 +00001367 self.stream.write("x")
Benjamin Peterson692428e2009-03-23 21:50:21 +00001368 self.stream.flush()
1369
1370 def addUnexpectedSuccess(self, test):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001371 super(_TextTestResult, self).addUnexpectedSuccess(test)
Benjamin Peterson692428e2009-03-23 21:50:21 +00001372 if self.showAll:
1373 self.stream.writeln("unexpected success")
1374 elif self.dots:
Benjamin Petersona8adceb2009-03-25 21:24:04 +00001375 self.stream.write("u")
Benjamin Peterson692428e2009-03-23 21:50:21 +00001376 self.stream.flush()
1377
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001378 def printErrors(self):
1379 if self.dots or self.showAll:
Fred Drake02538202001-03-21 18:09:46 +00001380 self.stream.writeln()
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001381 self.printErrorList('ERROR', self.errors)
1382 self.printErrorList('FAIL', self.failures)
1383
1384 def printErrorList(self, flavour, errors):
1385 for test, err in errors:
1386 self.stream.writeln(self.separator1)
1387 self.stream.writeln("%s: %s" % (flavour,self.getDescription(test)))
1388 self.stream.writeln(self.separator2)
Steve Purcell7b065702001-09-06 08:24:40 +00001389 self.stream.writeln("%s" % err)
Fred Drake02538202001-03-21 18:09:46 +00001390
1391
Antoine Pitroudae1a6a2008-12-28 16:01:11 +00001392class TextTestRunner(object):
Fred Drake02538202001-03-21 18:09:46 +00001393 """A test runner class that displays results in textual form.
Tim Petersa19a1682001-03-29 04:36:09 +00001394
Fred Drake02538202001-03-21 18:09:46 +00001395 It prints out the names of tests as they are run, errors as they
1396 occur, and a summary of the results at the end of the test run.
1397 """
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001398 def __init__(self, stream=sys.stderr, descriptions=1, verbosity=1):
Fred Drake02538202001-03-21 18:09:46 +00001399 self.stream = _WritelnDecorator(stream)
1400 self.descriptions = descriptions
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001401 self.verbosity = verbosity
1402
1403 def _makeResult(self):
1404 return _TextTestResult(self.stream, self.descriptions, self.verbosity)
Fred Drake02538202001-03-21 18:09:46 +00001405
1406 def run(self, test):
1407 "Run the given test case or test suite."
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001408 result = self._makeResult()
Fred Drake02538202001-03-21 18:09:46 +00001409 startTime = time.time()
1410 test(result)
1411 stopTime = time.time()
Steve Purcell397b45d2003-10-26 10:41:03 +00001412 timeTaken = stopTime - startTime
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001413 result.printErrors()
1414 self.stream.writeln(result.separator2)
Fred Drake02538202001-03-21 18:09:46 +00001415 run = result.testsRun
1416 self.stream.writeln("Ran %d test%s in %.3fs" %
Neal Norwitz76165042002-05-31 14:15:11 +00001417 (run, run != 1 and "s" or "", timeTaken))
Fred Drake02538202001-03-21 18:09:46 +00001418 self.stream.writeln()
Benjamin Petersoncb2b0e42009-03-23 22:29:45 +00001419 results = map(len, (result.expectedFailures,
1420 result.unexpectedSuccesses,
Benjamin Peterson692428e2009-03-23 21:50:21 +00001421 result.skipped))
Benjamin Petersoncb2b0e42009-03-23 22:29:45 +00001422 expectedFails, unexpectedSuccesses, skipped = results
Benjamin Peterson692428e2009-03-23 21:50:21 +00001423 infos = []
Fred Drake02538202001-03-21 18:09:46 +00001424 if not result.wasSuccessful():
Benjamin Peterson692428e2009-03-23 21:50:21 +00001425 self.stream.write("FAILED")
Fred Drake02538202001-03-21 18:09:46 +00001426 failed, errored = map(len, (result.failures, result.errors))
1427 if failed:
Benjamin Peterson692428e2009-03-23 21:50:21 +00001428 infos.append("failures=%d" % failed)
Fred Drake02538202001-03-21 18:09:46 +00001429 if errored:
Benjamin Peterson692428e2009-03-23 21:50:21 +00001430 infos.append("errors=%d" % errored)
Fred Drake02538202001-03-21 18:09:46 +00001431 else:
Benjamin Petersona473f002009-03-24 22:56:32 +00001432 self.stream.write("OK")
Benjamin Peterson692428e2009-03-23 21:50:21 +00001433 if skipped:
1434 infos.append("skipped=%d" % skipped)
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001435 if expectedFails:
1436 infos.append("expected failures=%d" % expectedFails)
1437 if unexpectedSuccesses:
1438 infos.append("unexpected successes=%d" % unexpectedSuccesses)
Benjamin Peterson692428e2009-03-23 21:50:21 +00001439 if infos:
1440 self.stream.writeln(" (%s)" % (", ".join(infos),))
Benjamin Petersona473f002009-03-24 22:56:32 +00001441 else:
1442 self.stream.write("\n")
Fred Drake02538202001-03-21 18:09:46 +00001443 return result
Tim Petersa19a1682001-03-29 04:36:09 +00001444
Fred Drake02538202001-03-21 18:09:46 +00001445
Fred Drake02538202001-03-21 18:09:46 +00001446
1447##############################################################################
1448# Facilities for running tests from the command line
1449##############################################################################
1450
Antoine Pitroudae1a6a2008-12-28 16:01:11 +00001451class TestProgram(object):
Fred Drake02538202001-03-21 18:09:46 +00001452 """A command-line program that runs a set of tests; this is primarily
1453 for making test modules conveniently executable.
1454 """
1455 USAGE = """\
Steve Purcell17a781b2001-04-09 15:37:31 +00001456Usage: %(progName)s [options] [test] [...]
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001457
1458Options:
1459 -h, --help Show this message
1460 -v, --verbose Verbose output
1461 -q, --quiet Minimal output
Fred Drake02538202001-03-21 18:09:46 +00001462
1463Examples:
1464 %(progName)s - run default set of tests
1465 %(progName)s MyTestSuite - run suite 'MyTestSuite'
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001466 %(progName)s MyTestCase.testSomething - run MyTestCase.testSomething
1467 %(progName)s MyTestCase - run all 'test*' test methods
Fred Drake02538202001-03-21 18:09:46 +00001468 in MyTestCase
1469"""
1470 def __init__(self, module='__main__', defaultTest=None,
Georg Brandld0a96252007-03-07 09:21:06 +00001471 argv=None, testRunner=TextTestRunner,
1472 testLoader=defaultTestLoader):
Antoine Pitroudae1a6a2008-12-28 16:01:11 +00001473 if isinstance(module, basestring):
Fred Drake02538202001-03-21 18:09:46 +00001474 self.module = __import__(module)
Steve Purcell7e743842003-09-22 11:08:12 +00001475 for part in module.split('.')[1:]:
Fred Drake02538202001-03-21 18:09:46 +00001476 self.module = getattr(self.module, part)
1477 else:
1478 self.module = module
1479 if argv is None:
1480 argv = sys.argv
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001481 self.verbosity = 1
Fred Drake02538202001-03-21 18:09:46 +00001482 self.defaultTest = defaultTest
1483 self.testRunner = testRunner
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001484 self.testLoader = testLoader
Fred Drake02538202001-03-21 18:09:46 +00001485 self.progName = os.path.basename(argv[0])
1486 self.parseArgs(argv)
Fred Drake02538202001-03-21 18:09:46 +00001487 self.runTests()
1488
1489 def usageExit(self, msg=None):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001490 if msg:
1491 print msg
Fred Drake02538202001-03-21 18:09:46 +00001492 print self.USAGE % self.__dict__
1493 sys.exit(2)
1494
1495 def parseArgs(self, argv):
1496 import getopt
Benjamin Peterson692428e2009-03-23 21:50:21 +00001497 long_opts = ['help','verbose','quiet']
Fred Drake02538202001-03-21 18:09:46 +00001498 try:
Benjamin Peterson692428e2009-03-23 21:50:21 +00001499 options, args = getopt.getopt(argv[1:], 'hHvq', long_opts)
Fred Drake02538202001-03-21 18:09:46 +00001500 for opt, value in options:
1501 if opt in ('-h','-H','--help'):
1502 self.usageExit()
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001503 if opt in ('-q','--quiet'):
1504 self.verbosity = 0
1505 if opt in ('-v','--verbose'):
1506 self.verbosity = 2
Fred Drake02538202001-03-21 18:09:46 +00001507 if len(args) == 0 and self.defaultTest is None:
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001508 self.test = self.testLoader.loadTestsFromModule(self.module)
1509 return
Fred Drake02538202001-03-21 18:09:46 +00001510 if len(args) > 0:
1511 self.testNames = args
1512 else:
1513 self.testNames = (self.defaultTest,)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001514 self.createTests()
Fred Drake02538202001-03-21 18:09:46 +00001515 except getopt.error, msg:
1516 self.usageExit(msg)
1517
1518 def createTests(self):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001519 self.test = self.testLoader.loadTestsFromNames(self.testNames,
1520 self.module)
Fred Drake02538202001-03-21 18:09:46 +00001521
1522 def runTests(self):
Georg Brandld0a96252007-03-07 09:21:06 +00001523 if isinstance(self.testRunner, (type, types.ClassType)):
1524 try:
1525 testRunner = self.testRunner(verbosity=self.verbosity)
1526 except TypeError:
1527 # didn't accept the verbosity argument
1528 testRunner = self.testRunner()
1529 else:
1530 # it is assumed to be a TestRunner instance
1531 testRunner = self.testRunner
1532 result = testRunner.run(self.test)
Tim Petersa19a1682001-03-29 04:36:09 +00001533 sys.exit(not result.wasSuccessful())
Fred Drake02538202001-03-21 18:09:46 +00001534
1535main = TestProgram
1536
1537
1538##############################################################################
1539# Executing this module from the command line
1540##############################################################################
1541
1542if __name__ == "__main__":
1543 main(module=None)