blob: d2716753e71136c3f630067ea539b5ab58af9353 [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 Peterson176a56c2009-05-25 00:48:58 +000062__all__ = ['TestResult', 'TestCase', 'TestSuite',
Benjamin Petersonc750d4d2009-03-24 00:39:24 +000063 '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
Michael Foord07ef4872009-05-02 22:43:34 +0000189 def startTestRun(self):
190 """Called once before any tests are executed.
191
192 See startTest for a method called before each test.
193 """
194
Fred Drake02538202001-03-21 18:09:46 +0000195 def stopTest(self, test):
196 "Called when the given test has been run"
197 pass
198
Michael Foord07ef4872009-05-02 22:43:34 +0000199 def stopTestRun(self):
200 """Called once after all tests are executed.
201
202 See stopTest for a method called after each test.
203 """
204
Fred Drake02538202001-03-21 18:09:46 +0000205 def addError(self, test, err):
Steve Purcell7b065702001-09-06 08:24:40 +0000206 """Called when an error has occurred. 'err' is a tuple of values as
207 returned by sys.exc_info().
208 """
Steve Purcellb8d5f242003-12-06 13:03:13 +0000209 self.errors.append((test, self._exc_info_to_string(err, test)))
Fred Drake02538202001-03-21 18:09:46 +0000210
211 def addFailure(self, test, err):
Steve Purcell7b065702001-09-06 08:24:40 +0000212 """Called when an error has occurred. 'err' is a tuple of values as
213 returned by sys.exc_info()."""
Steve Purcellb8d5f242003-12-06 13:03:13 +0000214 self.failures.append((test, self._exc_info_to_string(err, test)))
Fred Drake02538202001-03-21 18:09:46 +0000215
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000216 def addSuccess(self, test):
217 "Called when a test has completed successfully"
218 pass
219
Benjamin Peterson692428e2009-03-23 21:50:21 +0000220 def addSkip(self, test, reason):
221 """Called when a test is skipped."""
222 self.skipped.append((test, reason))
223
224 def addExpectedFailure(self, test, err):
225 """Called when an expected failure/error occured."""
Benjamin Petersoncb2b0e42009-03-23 22:29:45 +0000226 self.expectedFailures.append(
Benjamin Peterson692428e2009-03-23 21:50:21 +0000227 (test, self._exc_info_to_string(err, test)))
228
229 def addUnexpectedSuccess(self, test):
230 """Called when a test was expected to fail, but succeed."""
Benjamin Petersoncb2b0e42009-03-23 22:29:45 +0000231 self.unexpectedSuccesses.append(test)
Benjamin Peterson692428e2009-03-23 21:50:21 +0000232
Fred Drake02538202001-03-21 18:09:46 +0000233 def wasSuccessful(self):
234 "Tells whether or not this result was a success"
235 return len(self.failures) == len(self.errors) == 0
236
237 def stop(self):
238 "Indicates that the tests should be aborted"
Steve Purcell7e743842003-09-22 11:08:12 +0000239 self.shouldStop = True
Tim Petersa19a1682001-03-29 04:36:09 +0000240
Steve Purcellb8d5f242003-12-06 13:03:13 +0000241 def _exc_info_to_string(self, err, test):
Steve Purcell7b065702001-09-06 08:24:40 +0000242 """Converts a sys.exc_info()-style tuple of values into a string."""
Steve Purcellb8d5f242003-12-06 13:03:13 +0000243 exctype, value, tb = err
244 # Skip test runner traceback levels
245 while tb and self._is_relevant_tb_level(tb):
246 tb = tb.tb_next
247 if exctype is test.failureException:
248 # Skip assert*() traceback levels
249 length = self._count_relevant_tb_levels(tb)
250 return ''.join(traceback.format_exception(exctype, value, tb, length))
251 return ''.join(traceback.format_exception(exctype, value, tb))
252
253 def _is_relevant_tb_level(self, tb):
Georg Brandl56af5fc2008-07-18 19:30:10 +0000254 return '__unittest' in tb.tb_frame.f_globals
Steve Purcellb8d5f242003-12-06 13:03:13 +0000255
256 def _count_relevant_tb_levels(self, tb):
257 length = 0
258 while tb and not self._is_relevant_tb_level(tb):
259 length += 1
260 tb = tb.tb_next
261 return length
Steve Purcell7b065702001-09-06 08:24:40 +0000262
Fred Drake02538202001-03-21 18:09:46 +0000263 def __repr__(self):
264 return "<%s run=%i errors=%i failures=%i>" % \
Steve Purcelldc391a62002-08-09 09:46:23 +0000265 (_strclass(self.__class__), self.testsRun, len(self.errors),
Fred Drake02538202001-03-21 18:09:46 +0000266 len(self.failures))
267
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000268
Gregory P. Smith28399852009-03-31 16:54:10 +0000269class _AssertRaisesContext(object):
270 """A context manager used to implement TestCase.assertRaises* methods."""
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000271
Gregory P. Smith28399852009-03-31 16:54:10 +0000272 def __init__(self, expected, test_case, expected_regexp=None):
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000273 self.expected = expected
274 self.failureException = test_case.failureException
Gregory P. Smith28399852009-03-31 16:54:10 +0000275 self.expected_regex = expected_regexp
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000276
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000277 def __enter__(self):
278 pass
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000279
Benjamin Petersonbaba1952009-04-18 19:26:19 +0000280 def __exit__(self, exc_type, exc_value, tb):
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000281 if exc_type is None:
282 try:
283 exc_name = self.expected.__name__
284 except AttributeError:
285 exc_name = str(self.expected)
286 raise self.failureException(
287 "{0} not raised".format(exc_name))
Gregory P. Smith28399852009-03-31 16:54:10 +0000288 if not issubclass(exc_type, self.expected):
Michael Foord345b2fe2009-04-02 03:20:38 +0000289 # let unexpected exceptions pass through
Gregory P. Smith28399852009-03-31 16:54:10 +0000290 return False
291 if self.expected_regex is None:
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000292 return True
Gregory P. Smith28399852009-03-31 16:54:10 +0000293
294 expected_regexp = self.expected_regex
295 if isinstance(expected_regexp, basestring):
296 expected_regexp = re.compile(expected_regexp)
297 if not expected_regexp.search(str(exc_value)):
298 raise self.failureException('"%s" does not match "%s"' %
299 (expected_regexp.pattern, str(exc_value)))
300 return True
301
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000302
Michael Foorde2942d02009-04-02 05:51:54 +0000303class _AssertWrapper(object):
304 """Wrap entries in the _type_equality_funcs registry to make them deep
305 copyable."""
306
307 def __init__(self, function):
308 self.function = function
309
310 def __deepcopy__(self, memo):
311 memo[id(self)] = self
312
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000313
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000314class TestCase(object):
Fred Drake02538202001-03-21 18:09:46 +0000315 """A class whose instances are single test cases.
316
Fred Drake02538202001-03-21 18:09:46 +0000317 By default, the test code itself should be placed in a method named
318 'runTest'.
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000319
Tim Petersa19a1682001-03-29 04:36:09 +0000320 If the fixture may be used for many test cases, create as
Fred Drake02538202001-03-21 18:09:46 +0000321 many test methods as are needed. When instantiating such a TestCase
322 subclass, specify in the constructor arguments the name of the test method
323 that the instance is to execute.
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000324
Tim Petersa19a1682001-03-29 04:36:09 +0000325 Test authors should subclass TestCase for their own tests. Construction
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000326 and deconstruction of the test's environment ('fixture') can be
327 implemented by overriding the 'setUp' and 'tearDown' methods respectively.
328
329 If it is necessary to override the __init__ method, the base class
330 __init__ method must always be called. It is important that subclasses
331 should not change the signature of their __init__ method, since instances
332 of the classes are instantiated automatically by parts of the framework
333 in order to be run.
Fred Drake02538202001-03-21 18:09:46 +0000334 """
Steve Purcell15d89272001-04-12 09:05:01 +0000335
336 # This attribute determines which exception will be raised when
337 # the instance's assertion methods fail; test methods raising this
338 # exception will be deemed to have 'failed' rather than 'errored'
339
340 failureException = AssertionError
341
Michael Foord345b2fe2009-04-02 03:20:38 +0000342 # This attribute determines whether long messages (including repr of
343 # objects used in assert methods) will be printed on failure in *addition*
344 # to any explicit message passed.
345
346 longMessage = False
347
348
Fred Drake02538202001-03-21 18:09:46 +0000349 def __init__(self, methodName='runTest'):
350 """Create an instance of the class that will use the named test
351 method when executed. Raises a ValueError if the instance does
352 not have a method with the specified name.
353 """
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000354 self._testMethodName = methodName
Michael Foorda50af062009-05-21 22:57:02 +0000355 self._resultForDoCleanups = None
Fred Drake02538202001-03-21 18:09:46 +0000356 try:
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000357 testMethod = getattr(self, methodName)
Fred Drake02538202001-03-21 18:09:46 +0000358 except AttributeError:
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000359 raise ValueError("no such test method in %s: %s" % \
360 (self.__class__, methodName))
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000361 self._testMethodDoc = testMethod.__doc__
Michael Foorde2fb98f2009-05-02 20:15:05 +0000362 self._cleanups = []
Fred Drake02538202001-03-21 18:09:46 +0000363
Gregory P. Smith28399852009-03-31 16:54:10 +0000364 # Map types to custom assertEqual functions that will compare
365 # instances of said type in more detail to generate a more useful
366 # error message.
Benjamin Peterson71095ae2009-04-01 23:15:49 +0000367 self._type_equality_funcs = {}
Gregory P. Smith28399852009-03-31 16:54:10 +0000368 self.addTypeEqualityFunc(dict, self.assertDictEqual)
369 self.addTypeEqualityFunc(list, self.assertListEqual)
370 self.addTypeEqualityFunc(tuple, self.assertTupleEqual)
371 self.addTypeEqualityFunc(set, self.assertSetEqual)
372 self.addTypeEqualityFunc(frozenset, self.assertSetEqual)
373
374 def addTypeEqualityFunc(self, typeobj, function):
375 """Add a type specific assertEqual style function to compare a type.
376
377 This method is for use by TestCase subclasses that need to register
378 their own type equality functions to provide nicer error messages.
379
380 Args:
381 typeobj: The data type to call this function on when both values
382 are of the same type in assertEqual().
383 function: The callable taking two arguments and an optional
384 msg= argument that raises self.failureException with a
385 useful error message when the two arguments are not equal.
386 """
Michael Foorde2942d02009-04-02 05:51:54 +0000387 self._type_equality_funcs[typeobj] = _AssertWrapper(function)
Gregory P. Smith28399852009-03-31 16:54:10 +0000388
Michael Foorde2fb98f2009-05-02 20:15:05 +0000389 def addCleanup(self, function, *args, **kwargs):
390 """Add a function, with arguments, to be called when the test is
391 completed. Functions added are called on a LIFO basis and are
392 called after tearDown on test failure or success.
393
394 Cleanup items are called even if setUp fails (unlike tearDown)."""
395 self._cleanups.append((function, args, kwargs))
396
Fred Drake02538202001-03-21 18:09:46 +0000397 def setUp(self):
398 "Hook method for setting up the test fixture before exercising it."
399 pass
400
401 def tearDown(self):
402 "Hook method for deconstructing the test fixture after testing it."
403 pass
404
405 def countTestCases(self):
406 return 1
407
408 def defaultTestResult(self):
409 return TestResult()
410
411 def shortDescription(self):
Gregory P. Smith28399852009-03-31 16:54:10 +0000412 """Returns both the test method name and first line of its docstring.
Fred Drake02538202001-03-21 18:09:46 +0000413
Gregory P. Smith28399852009-03-31 16:54:10 +0000414 If no docstring is given, only returns the method name.
415
416 This method overrides unittest.TestCase.shortDescription(), which
417 only returns the first line of the docstring, obscuring the name
418 of the test upon failure.
Fred Drake02538202001-03-21 18:09:46 +0000419 """
Gregory P. Smith28399852009-03-31 16:54:10 +0000420 desc = str(self)
421 doc_first_line = None
422
423 if self._testMethodDoc:
424 doc_first_line = self._testMethodDoc.split("\n")[0].strip()
425 if doc_first_line:
426 desc = '\n'.join((desc, doc_first_line))
427 return desc
Fred Drake02538202001-03-21 18:09:46 +0000428
429 def id(self):
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000430 return "%s.%s" % (_strclass(self.__class__), self._testMethodName)
Fred Drake02538202001-03-21 18:09:46 +0000431
Georg Brandl15c5ce92007-03-07 09:09:40 +0000432 def __eq__(self, other):
433 if type(self) is not type(other):
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000434 return NotImplemented
Georg Brandl15c5ce92007-03-07 09:09:40 +0000435
436 return self._testMethodName == other._testMethodName
437
438 def __ne__(self, other):
439 return not self == other
440
441 def __hash__(self):
Collin Winter9453e5d2007-03-09 23:30:39 +0000442 return hash((type(self), self._testMethodName))
Georg Brandl15c5ce92007-03-07 09:09:40 +0000443
Fred Drake02538202001-03-21 18:09:46 +0000444 def __str__(self):
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000445 return "%s (%s)" % (self._testMethodName, _strclass(self.__class__))
Fred Drake02538202001-03-21 18:09:46 +0000446
447 def __repr__(self):
448 return "<%s testMethod=%s>" % \
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000449 (_strclass(self.__class__), self._testMethodName)
Fred Drake02538202001-03-21 18:09:46 +0000450
451 def run(self, result=None):
Michael Foord07ef4872009-05-02 22:43:34 +0000452 orig_result = result
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000453 if result is None:
454 result = self.defaultTestResult()
Michael Foord07ef4872009-05-02 22:43:34 +0000455 startTestRun = getattr(result, 'startTestRun', None)
456 if startTestRun is not None:
457 startTestRun()
458
Michael Foorda50af062009-05-21 22:57:02 +0000459 self._resultForDoCleanups = result
Fred Drake02538202001-03-21 18:09:46 +0000460 result.startTest(self)
Benjamin Peterson176a56c2009-05-25 00:48:58 +0000461 if getattr(self.__class__, "__unittest_skip__", False):
462 # If the whole class was skipped.
463 try:
464 result.addSkip(self, self.__class__.__unittest_skip_why__)
465 finally:
466 result.stopTest(self)
467 return
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000468 testMethod = getattr(self, self._testMethodName)
Fred Drake02538202001-03-21 18:09:46 +0000469 try:
Benjamin Peterson692428e2009-03-23 21:50:21 +0000470 success = False
Fred Drake02538202001-03-21 18:09:46 +0000471 try:
Michael Foorde2fb98f2009-05-02 20:15:05 +0000472 self.setUp()
Benjamin Peterson692428e2009-03-23 21:50:21 +0000473 except SkipTest as e:
474 result.addSkip(self, str(e))
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000475 except Exception:
Benjamin Petersonc9301352009-03-26 16:32:23 +0000476 result.addError(self, sys.exc_info())
Benjamin Peterson692428e2009-03-23 21:50:21 +0000477 else:
Michael Foorde2fb98f2009-05-02 20:15:05 +0000478 try:
479 testMethod()
480 except self.failureException:
481 result.addFailure(self, sys.exc_info())
482 except _ExpectedFailure as e:
483 result.addExpectedFailure(self, e.exc_info)
484 except _UnexpectedSuccess:
485 result.addUnexpectedSuccess(self)
486 except SkipTest as e:
487 result.addSkip(self, str(e))
488 except Exception:
489 result.addError(self, sys.exc_info())
490 else:
491 success = True
Fred Drake02538202001-03-21 18:09:46 +0000492
Michael Foorde2fb98f2009-05-02 20:15:05 +0000493 try:
494 self.tearDown()
495 except Exception:
496 result.addError(self, sys.exc_info())
497 success = False
498
499 cleanUpSuccess = self.doCleanups()
500 success = success and cleanUpSuccess
Benjamin Peterson692428e2009-03-23 21:50:21 +0000501 if success:
502 result.addSuccess(self)
Fred Drake02538202001-03-21 18:09:46 +0000503 finally:
504 result.stopTest(self)
Michael Foord07ef4872009-05-02 22:43:34 +0000505 if orig_result is None:
506 stopTestRun = getattr(result, 'stopTestRun', None)
507 if stopTestRun is not None:
508 stopTestRun()
Fred Drake02538202001-03-21 18:09:46 +0000509
Michael Foorde2fb98f2009-05-02 20:15:05 +0000510 def doCleanups(self):
511 """Execute all cleanup functions. Normally called for you after
512 tearDown."""
Michael Foorda50af062009-05-21 22:57:02 +0000513 result = self._resultForDoCleanups
Michael Foorde2fb98f2009-05-02 20:15:05 +0000514 ok = True
515 while self._cleanups:
516 function, args, kwargs = self._cleanups.pop(-1)
517 try:
518 function(*args, **kwargs)
519 except Exception:
520 ok = False
521 result.addError(self, sys.exc_info())
522 return ok
523
Raymond Hettinger664347b2004-12-04 21:21:53 +0000524 def __call__(self, *args, **kwds):
525 return self.run(*args, **kwds)
Steve Purcell7e743842003-09-22 11:08:12 +0000526
Fred Drake02538202001-03-21 18:09:46 +0000527 def debug(self):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000528 """Run the test without collecting errors in a TestResult"""
Fred Drake02538202001-03-21 18:09:46 +0000529 self.setUp()
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000530 getattr(self, self._testMethodName)()
Fred Drake02538202001-03-21 18:09:46 +0000531 self.tearDown()
532
Benjamin Peterson47d97382009-03-26 20:05:50 +0000533 def skipTest(self, reason):
Benjamin Peterson692428e2009-03-23 21:50:21 +0000534 """Skip this test."""
535 raise SkipTest(reason)
536
Steve Purcell15d89272001-04-12 09:05:01 +0000537 def fail(self, msg=None):
538 """Fail immediately, with the given message."""
Antoine Pitroudae1a6a2008-12-28 16:01:11 +0000539 raise self.failureException(msg)
Fred Drake02538202001-03-21 18:09:46 +0000540
Gregory P. Smith7558d572009-03-31 19:03:28 +0000541 def assertFalse(self, expr, msg=None):
Fred Drake02538202001-03-21 18:09:46 +0000542 "Fail the test if the expression is true."
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000543 if expr:
Michael Foord345b2fe2009-04-02 03:20:38 +0000544 msg = self._formatMessage(msg, "%r is not False" % expr)
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000545 raise self.failureException(msg)
Fred Drake02538202001-03-21 18:09:46 +0000546
Gregory P. Smith7558d572009-03-31 19:03:28 +0000547 def assertTrue(self, expr, msg=None):
Steve Purcell15d89272001-04-12 09:05:01 +0000548 """Fail the test unless the expression is true."""
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000549 if not expr:
Michael Foord345b2fe2009-04-02 03:20:38 +0000550 msg = self._formatMessage(msg, "%r is not True" % expr)
Benjamin Petersona7d441d2009-03-24 00:35:20 +0000551 raise self.failureException(msg)
Steve Purcell15d89272001-04-12 09:05:01 +0000552
Michael Foord345b2fe2009-04-02 03:20:38 +0000553 def _formatMessage(self, msg, standardMsg):
554 """Honour the longMessage attribute when generating failure messages.
555 If longMessage is False this means:
556 * Use only an explicit message if it is provided
557 * Otherwise use the standard message for the assert
558
559 If longMessage is True:
560 * Use the standard message
561 * If an explicit message is provided, plus ' : ' and the explicit message
562 """
563 if not self.longMessage:
564 return msg or standardMsg
565 if msg is None:
566 return standardMsg
567 return standardMsg + ' : ' + msg
568
569
Gregory P. Smith7558d572009-03-31 19:03:28 +0000570 def assertRaises(self, excClass, callableObj=None, *args, **kwargs):
Steve Purcell15d89272001-04-12 09:05:01 +0000571 """Fail unless an exception of class excClass is thrown
Fred Drake02538202001-03-21 18:09:46 +0000572 by callableObj when invoked with arguments args and keyword
573 arguments kwargs. If a different type of exception is
574 thrown, it will not be caught, and the test case will be
575 deemed to have suffered an error, exactly as for an
576 unexpected exception.
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000577
578 If called with callableObj omitted or None, will return a
579 context object used like this::
580
Gregory P. Smith7558d572009-03-31 19:03:28 +0000581 with self.assertRaises(some_error_class):
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000582 do_something()
Fred Drake02538202001-03-21 18:09:46 +0000583 """
Gregory P. Smith28399852009-03-31 16:54:10 +0000584 context = _AssertRaisesContext(excClass, self)
Antoine Pitrou697ca3d2008-12-28 14:09:36 +0000585 if callableObj is None:
586 return context
587 with context:
Guido van Rossum68468eb2003-02-27 20:14:51 +0000588 callableObj(*args, **kwargs)
Fred Drake02538202001-03-21 18:09:46 +0000589
Gregory P. Smith28399852009-03-31 16:54:10 +0000590 def _getAssertEqualityFunc(self, first, second):
591 """Get a detailed comparison function for the types of the two args.
592
593 Returns: A callable accepting (first, second, msg=None) that will
594 raise a failure exception if first != second with a useful human
595 readable error message for those types.
596 """
597 #
598 # NOTE(gregory.p.smith): I considered isinstance(first, type(second))
599 # and vice versa. I opted for the conservative approach in case
600 # subclasses are not intended to be compared in detail to their super
601 # class instances using a type equality func. This means testing
602 # subtypes won't automagically use the detailed comparison. Callers
603 # should use their type specific assertSpamEqual method to compare
604 # subclasses if the detailed comparison is desired and appropriate.
605 # See the discussion in http://bugs.python.org/issue2578.
606 #
607 if type(first) is type(second):
Michael Foorde2942d02009-04-02 05:51:54 +0000608 asserter = self._type_equality_funcs.get(type(first))
609 if asserter is not None:
610 return asserter.function
611
Gregory P. Smith28399852009-03-31 16:54:10 +0000612 return self._baseAssertEqual
613
614 def _baseAssertEqual(self, first, second, msg=None):
615 """The default assertEqual implementation, not type specific."""
616 if not first == second:
Michael Foord345b2fe2009-04-02 03:20:38 +0000617 standardMsg = '%r != %r' % (first, second)
618 msg = self._formatMessage(msg, standardMsg)
619 raise self.failureException(msg)
Gregory P. Smith28399852009-03-31 16:54:10 +0000620
Gregory P. Smith7558d572009-03-31 19:03:28 +0000621 def assertEqual(self, first, second, msg=None):
Raymond Hettingerc377cbf2003-04-04 22:56:42 +0000622 """Fail if the two objects are unequal as determined by the '=='
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000623 operator.
624 """
Gregory P. Smith28399852009-03-31 16:54:10 +0000625 assertion_func = self._getAssertEqualityFunc(first, second)
626 assertion_func(first, second, msg=msg)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000627
Gregory P. Smith7558d572009-03-31 19:03:28 +0000628 def assertNotEqual(self, first, second, msg=None):
Steve Purcell15d89272001-04-12 09:05:01 +0000629 """Fail if the two objects are equal as determined by the '=='
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000630 operator.
631 """
Michael Foord345b2fe2009-04-02 03:20:38 +0000632 if not first != second:
633 msg = self._formatMessage(msg, '%r == %r' % (first, second))
634 raise self.failureException(msg)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000635
Gregory P. Smith7558d572009-03-31 19:03:28 +0000636 def assertAlmostEqual(self, first, second, places=7, msg=None):
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000637 """Fail if the two objects are unequal as determined by their
638 difference rounded to the given number of decimal places
639 (default 7) and comparing to zero.
640
Steve Purcell397b45d2003-10-26 10:41:03 +0000641 Note that decimal places (from zero) are usually not the same
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000642 as significant digits (measured from the most signficant digit).
643 """
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000644 if round(abs(second-first), places) != 0:
Michael Foord345b2fe2009-04-02 03:20:38 +0000645 standardMsg = '%r != %r within %r places' % (first, second, places)
646 msg = self._formatMessage(msg, standardMsg)
647 raise self.failureException(msg)
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000648
Gregory P. Smith7558d572009-03-31 19:03:28 +0000649 def assertNotAlmostEqual(self, first, second, places=7, msg=None):
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000650 """Fail if the two objects are equal as determined by their
651 difference rounded to the given number of decimal places
652 (default 7) and comparing to zero.
653
Steve Purcellcca34912003-10-26 16:38:16 +0000654 Note that decimal places (from zero) are usually not the same
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000655 as significant digits (measured from the most signficant digit).
656 """
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000657 if round(abs(second-first), places) == 0:
Michael Foord345b2fe2009-04-02 03:20:38 +0000658 standardMsg = '%r == %r within %r places' % (first, second, places)
659 msg = self._formatMessage(msg, standardMsg)
660 raise self.failureException(msg)
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000661
Steve Purcell7e743842003-09-22 11:08:12 +0000662 # Synonyms for assertion methods
663
Gregory P. Smith7558d572009-03-31 19:03:28 +0000664 # The plurals are undocumented. Keep them that way to discourage use.
665 # Do not add more. Do not remove.
666 # Going through a deprecation cycle on these would annoy many people.
667 assertEquals = assertEqual
668 assertNotEquals = assertNotEqual
669 assertAlmostEquals = assertAlmostEqual
670 assertNotAlmostEquals = assertNotAlmostEqual
671 assert_ = assertTrue
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000672
Gregory P. Smith7558d572009-03-31 19:03:28 +0000673 # These fail* assertion method names are pending deprecation and will
Gregory P. Smith65ff0052009-03-31 19:59:14 +0000674 # be a DeprecationWarning in 3.2; http://bugs.python.org/issue2578
Benjamin Peterson71095ae2009-04-01 23:15:49 +0000675 def _deprecate(original_func):
Gregory P. Smith65ff0052009-03-31 19:59:14 +0000676 def deprecated_func(*args, **kwargs):
677 warnings.warn(
678 'Please use {0} instead.'.format(original_func.__name__),
679 PendingDeprecationWarning, 2)
680 return original_func(*args, **kwargs)
681 return deprecated_func
Steve Purcell15d89272001-04-12 09:05:01 +0000682
Benjamin Peterson71095ae2009-04-01 23:15:49 +0000683 failUnlessEqual = _deprecate(assertEqual)
684 failIfEqual = _deprecate(assertNotEqual)
685 failUnlessAlmostEqual = _deprecate(assertAlmostEqual)
686 failIfAlmostEqual = _deprecate(assertNotAlmostEqual)
687 failUnless = _deprecate(assertTrue)
688 failUnlessRaises = _deprecate(assertRaises)
689 failIf = _deprecate(assertFalse)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000690
Gregory P. Smith28399852009-03-31 16:54:10 +0000691 def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None):
692 """An equality assertion for ordered sequences (like lists and tuples).
693
694 For the purposes of this function, a valid orderd sequence type is one
695 which can be indexed, has a length, and has an equality operator.
696
697 Args:
698 seq1: The first sequence to compare.
699 seq2: The second sequence to compare.
700 seq_type: The expected datatype of the sequences, or None if no
701 datatype should be enforced.
702 msg: Optional message to use on failure instead of a list of
703 differences.
704 """
705 if seq_type != None:
706 seq_type_name = seq_type.__name__
707 if not isinstance(seq1, seq_type):
708 raise self.failureException('First sequence is not a %s: %r'
709 % (seq_type_name, seq1))
710 if not isinstance(seq2, seq_type):
711 raise self.failureException('Second sequence is not a %s: %r'
712 % (seq_type_name, seq2))
713 else:
714 seq_type_name = "sequence"
715
716 differing = None
717 try:
718 len1 = len(seq1)
719 except (TypeError, NotImplementedError):
720 differing = 'First %s has no length. Non-sequence?' % (
721 seq_type_name)
722
723 if differing is None:
724 try:
725 len2 = len(seq2)
726 except (TypeError, NotImplementedError):
727 differing = 'Second %s has no length. Non-sequence?' % (
728 seq_type_name)
729
730 if differing is None:
731 if seq1 == seq2:
732 return
733
734 for i in xrange(min(len1, len2)):
735 try:
736 item1 = seq1[i]
737 except (TypeError, IndexError, NotImplementedError):
738 differing = ('Unable to index element %d of first %s\n' %
739 (i, seq_type_name))
740 break
741
742 try:
743 item2 = seq2[i]
744 except (TypeError, IndexError, NotImplementedError):
745 differing = ('Unable to index element %d of second %s\n' %
746 (i, seq_type_name))
747 break
748
749 if item1 != item2:
750 differing = ('First differing element %d:\n%s\n%s\n' %
751 (i, item1, item2))
752 break
753 else:
754 if (len1 == len2 and seq_type is None and
755 type(seq1) != type(seq2)):
756 # The sequences are the same, but have differing types.
757 return
758 # A catch-all message for handling arbitrary user-defined
759 # sequences.
760 differing = '%ss differ:\n' % seq_type_name.capitalize()
761 if len1 > len2:
762 differing = ('First %s contains %d additional '
763 'elements.\n' % (seq_type_name, len1 - len2))
764 try:
765 differing += ('First extra element %d:\n%s\n' %
766 (len2, seq1[len2]))
767 except (TypeError, IndexError, NotImplementedError):
768 differing += ('Unable to index element %d '
769 'of first %s\n' % (len2, seq_type_name))
770 elif len1 < len2:
771 differing = ('Second %s contains %d additional '
772 'elements.\n' % (seq_type_name, len2 - len1))
773 try:
774 differing += ('First extra element %d:\n%s\n' %
775 (len1, seq2[len1]))
776 except (TypeError, IndexError, NotImplementedError):
777 differing += ('Unable to index element %d '
778 'of second %s\n' % (len1, seq_type_name))
Michael Foord345b2fe2009-04-02 03:20:38 +0000779 standardMsg = differing + '\n'.join(difflib.ndiff(pprint.pformat(seq1).splitlines(),
780 pprint.pformat(seq2).splitlines()))
781 msg = self._formatMessage(msg, standardMsg)
782 self.fail(msg)
Gregory P. Smith28399852009-03-31 16:54:10 +0000783
784 def assertListEqual(self, list1, list2, msg=None):
785 """A list-specific equality assertion.
786
787 Args:
788 list1: The first list to compare.
789 list2: The second list to compare.
790 msg: Optional message to use on failure instead of a list of
791 differences.
792
793 """
794 self.assertSequenceEqual(list1, list2, msg, seq_type=list)
795
796 def assertTupleEqual(self, tuple1, tuple2, msg=None):
797 """A tuple-specific equality assertion.
798
799 Args:
800 tuple1: The first tuple to compare.
801 tuple2: The second tuple to compare.
802 msg: Optional message to use on failure instead of a list of
803 differences.
804 """
805 self.assertSequenceEqual(tuple1, tuple2, msg, seq_type=tuple)
806
807 def assertSetEqual(self, set1, set2, msg=None):
808 """A set-specific equality assertion.
809
810 Args:
811 set1: The first set to compare.
812 set2: The second set to compare.
813 msg: Optional message to use on failure instead of a list of
814 differences.
815
816 For more general containership equality, assertSameElements will work
817 with things other than sets. This uses ducktyping to support
818 different types of sets, and is optimized for sets specifically
819 (parameters must support a difference method).
820 """
821 try:
822 difference1 = set1.difference(set2)
823 except TypeError, e:
824 self.fail('invalid type when attempting set difference: %s' % e)
825 except AttributeError, e:
826 self.fail('first argument does not support set difference: %s' % e)
827
828 try:
829 difference2 = set2.difference(set1)
830 except TypeError, e:
831 self.fail('invalid type when attempting set difference: %s' % e)
832 except AttributeError, e:
833 self.fail('second argument does not support set difference: %s' % e)
834
835 if not (difference1 or difference2):
836 return
837
Gregory P. Smith28399852009-03-31 16:54:10 +0000838 lines = []
839 if difference1:
840 lines.append('Items in the first set but not the second:')
841 for item in difference1:
842 lines.append(repr(item))
843 if difference2:
844 lines.append('Items in the second set but not the first:')
845 for item in difference2:
846 lines.append(repr(item))
Gregory P. Smith28399852009-03-31 16:54:10 +0000847
Michael Foord345b2fe2009-04-02 03:20:38 +0000848 standardMsg = '\n'.join(lines)
849 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000850
Michael Foord345b2fe2009-04-02 03:20:38 +0000851 def assertIn(self, member, container, msg=None):
852 """Just like self.assertTrue(a in b), but with a nicer default message."""
853 if member not in container:
854 standardMsg = '%r not found in %r' % (member, container)
855 self.fail(self._formatMessage(msg, standardMsg))
856
857 def assertNotIn(self, member, container, msg=None):
858 """Just like self.assertTrue(a not in b), but with a nicer default message."""
859 if member in container:
860 standardMsg = '%r unexpectedly found in %r' % (member, container)
861 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000862
Michael Foordf2dfef12009-04-05 19:19:28 +0000863 def assertIs(self, expr1, expr2, msg=None):
864 """Just like self.assertTrue(a is b), but with a nicer default message."""
865 if expr1 is not expr2:
866 standardMsg = '%r is not %r' % (expr1, expr2)
867 self.fail(self._formatMessage(msg, standardMsg))
868
869 def assertIsNot(self, expr1, expr2, msg=None):
870 """Just like self.assertTrue(a is not b), but with a nicer default message."""
871 if expr1 is expr2:
872 standardMsg = 'unexpectedly identical: %r' % (expr1,)
873 self.fail(self._formatMessage(msg, standardMsg))
874
Gregory P. Smith28399852009-03-31 16:54:10 +0000875 def assertDictEqual(self, d1, d2, msg=None):
876 self.assert_(isinstance(d1, dict), 'First argument is not a dictionary')
877 self.assert_(isinstance(d2, dict), 'Second argument is not a dictionary')
878
879 if d1 != d2:
Michael Foord345b2fe2009-04-02 03:20:38 +0000880 standardMsg = ('\n' + '\n'.join(difflib.ndiff(
881 pprint.pformat(d1).splitlines(),
882 pprint.pformat(d2).splitlines())))
883 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000884
885 def assertDictContainsSubset(self, expected, actual, msg=None):
886 """Checks whether actual is a superset of expected."""
887 missing = []
888 mismatched = []
889 for key, value in expected.iteritems():
890 if key not in actual:
891 missing.append(key)
892 elif value != actual[key]:
Michael Foord345b2fe2009-04-02 03:20:38 +0000893 mismatched.append('%s, expected: %s, actual: %s' % (key, value, actual[key]))
Gregory P. Smith28399852009-03-31 16:54:10 +0000894
895 if not (missing or mismatched):
896 return
897
Michael Foord345b2fe2009-04-02 03:20:38 +0000898 standardMsg = ''
Gregory P. Smith28399852009-03-31 16:54:10 +0000899 if missing:
Michael Foord345b2fe2009-04-02 03:20:38 +0000900 standardMsg = 'Missing: %r' % ','.join(missing)
Gregory P. Smith28399852009-03-31 16:54:10 +0000901 if mismatched:
Michael Foord345b2fe2009-04-02 03:20:38 +0000902 if standardMsg:
903 standardMsg += '; '
904 standardMsg += 'Mismatched values: %s' % ','.join(mismatched)
Gregory P. Smith28399852009-03-31 16:54:10 +0000905
Michael Foord345b2fe2009-04-02 03:20:38 +0000906 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000907
908 def assertSameElements(self, expected_seq, actual_seq, msg=None):
909 """An unordered sequence specific comparison.
910
911 Raises with an error message listing which elements of expected_seq
912 are missing from actual_seq and vice versa if any.
913 """
914 try:
915 expected = set(expected_seq)
916 actual = set(actual_seq)
917 missing = list(expected.difference(actual))
918 unexpected = list(actual.difference(expected))
919 missing.sort()
920 unexpected.sort()
921 except TypeError:
922 # Fall back to slower list-compare if any of the objects are
923 # not hashable.
924 expected = list(expected_seq)
925 actual = list(actual_seq)
926 expected.sort()
927 actual.sort()
928 missing, unexpected = _SortedListDifference(expected, actual)
929 errors = []
930 if missing:
Michael Foord345b2fe2009-04-02 03:20:38 +0000931 errors.append('Expected, but missing:\n %r' % missing)
Gregory P. Smith28399852009-03-31 16:54:10 +0000932 if unexpected:
Michael Foord345b2fe2009-04-02 03:20:38 +0000933 errors.append('Unexpected, but present:\n %r' % unexpected)
Gregory P. Smith28399852009-03-31 16:54:10 +0000934 if errors:
Michael Foord345b2fe2009-04-02 03:20:38 +0000935 standardMsg = '\n'.join(errors)
936 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000937
938 def assertMultiLineEqual(self, first, second, msg=None):
939 """Assert that two multi-line strings are equal."""
Michael Foord345b2fe2009-04-02 03:20:38 +0000940 self.assert_(isinstance(first, basestring), (
Gregory P. Smith28399852009-03-31 16:54:10 +0000941 'First argument is not a string'))
Michael Foord345b2fe2009-04-02 03:20:38 +0000942 self.assert_(isinstance(second, basestring), (
Gregory P. Smith28399852009-03-31 16:54:10 +0000943 'Second argument is not a string'))
944
945 if first != second:
Michael Foord345b2fe2009-04-02 03:20:38 +0000946 standardMsg = '\n' + ''.join(difflib.ndiff(first.splitlines(True), second.splitlines(True)))
947 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000948
949 def assertLess(self, a, b, msg=None):
Michael Foord345b2fe2009-04-02 03:20:38 +0000950 """Just like self.assertTrue(a < b), but with a nicer default message."""
951 if not a < b:
952 standardMsg = '%r not less than %r' % (a, b)
953 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000954
955 def assertLessEqual(self, a, b, msg=None):
Michael Foord345b2fe2009-04-02 03:20:38 +0000956 """Just like self.assertTrue(a <= b), but with a nicer default message."""
957 if not a <= b:
958 standardMsg = '%r not less than or equal to %r' % (a, b)
959 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000960
961 def assertGreater(self, a, b, msg=None):
Michael Foord345b2fe2009-04-02 03:20:38 +0000962 """Just like self.assertTrue(a > b), but with a nicer default message."""
963 if not a > b:
964 standardMsg = '%r not greater than %r' % (a, b)
965 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000966
967 def assertGreaterEqual(self, a, b, msg=None):
Michael Foord345b2fe2009-04-02 03:20:38 +0000968 """Just like self.assertTrue(a >= b), but with a nicer default message."""
969 if not a >= b:
970 standardMsg = '%r not greater than or equal to %r' % (a, b)
971 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000972
973 def assertIsNone(self, obj, msg=None):
Michael Foord345b2fe2009-04-02 03:20:38 +0000974 """Same as self.assertTrue(obj is None), with a nicer default message."""
975 if obj is not None:
976 standardMsg = '%r is not None' % obj
977 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000978
Michael Foord345b2fe2009-04-02 03:20:38 +0000979 def assertIsNotNone(self, obj, msg=None):
Gregory P. Smith28399852009-03-31 16:54:10 +0000980 """Included for symmetry with assertIsNone."""
Michael Foord345b2fe2009-04-02 03:20:38 +0000981 if obj is None:
982 standardMsg = 'unexpectedly None'
983 self.fail(self._formatMessage(msg, standardMsg))
Gregory P. Smith28399852009-03-31 16:54:10 +0000984
985 def assertRaisesRegexp(self, expected_exception, expected_regexp,
986 callable_obj=None, *args, **kwargs):
987 """Asserts that the message in a raised exception matches a regexp.
988
989 Args:
990 expected_exception: Exception class expected to be raised.
991 expected_regexp: Regexp (re pattern object or string) expected
992 to be found in error message.
993 callable_obj: Function to be called.
994 args: Extra args.
995 kwargs: Extra kwargs.
996 """
997 context = _AssertRaisesContext(expected_exception, self, expected_regexp)
998 if callable_obj is None:
999 return context
1000 with context:
1001 callable_obj(*args, **kwargs)
1002
1003 def assertRegexpMatches(self, text, expected_regex, msg=None):
1004 if isinstance(expected_regex, basestring):
1005 expected_regex = re.compile(expected_regex)
1006 if not expected_regex.search(text):
1007 msg = msg or "Regexp didn't match"
1008 msg = '%s: %r not found in %r' % (msg, expected_regex.pattern, text)
1009 raise self.failureException(msg)
1010
1011
1012def _SortedListDifference(expected, actual):
1013 """Finds elements in only one or the other of two, sorted input lists.
1014
1015 Returns a two-element tuple of lists. The first list contains those
1016 elements in the "expected" list but not in the "actual" list, and the
1017 second contains those elements in the "actual" list but not in the
1018 "expected" list. Duplicate elements in either input list are ignored.
1019 """
1020 i = j = 0
1021 missing = []
1022 unexpected = []
1023 while True:
1024 try:
1025 e = expected[i]
1026 a = actual[j]
1027 if e < a:
1028 missing.append(e)
1029 i += 1
1030 while expected[i] == e:
1031 i += 1
1032 elif e > a:
1033 unexpected.append(a)
1034 j += 1
1035 while actual[j] == a:
1036 j += 1
1037 else:
1038 i += 1
1039 try:
1040 while expected[i] == e:
1041 i += 1
1042 finally:
1043 j += 1
1044 while actual[j] == a:
1045 j += 1
1046 except IndexError:
1047 missing.extend(expected[i:])
1048 unexpected.extend(actual[j:])
1049 break
1050 return missing, unexpected
1051
Fred Drake02538202001-03-21 18:09:46 +00001052
Antoine Pitroudae1a6a2008-12-28 16:01:11 +00001053class TestSuite(object):
Fred Drake02538202001-03-21 18:09:46 +00001054 """A test suite is a composite test consisting of a number of TestCases.
1055
1056 For use, create an instance of TestSuite, then add test case instances.
1057 When all tests have been added, the suite can be passed to a test
1058 runner, such as TextTestRunner. It will run the individual test cases
1059 in the order in which they were added, aggregating the results. When
1060 subclassing, do not forget to call the base class constructor.
1061 """
1062 def __init__(self, tests=()):
1063 self._tests = []
1064 self.addTests(tests)
1065
1066 def __repr__(self):
Michael Foord37d89a22009-04-05 01:15:01 +00001067 return "<%s tests=%s>" % (_strclass(self.__class__), list(self))
Fred Drake02538202001-03-21 18:09:46 +00001068
Georg Brandl15c5ce92007-03-07 09:09:40 +00001069 def __eq__(self, other):
Benjamin Peterson692428e2009-03-23 21:50:21 +00001070 if not isinstance(other, self.__class__):
1071 return NotImplemented
Michael Foord829f6b82009-05-02 11:43:06 +00001072 return list(self) == list(other)
Georg Brandl15c5ce92007-03-07 09:09:40 +00001073
1074 def __ne__(self, other):
1075 return not self == other
1076
Nick Coghlan48361f52008-08-11 15:45:58 +00001077 # Can't guarantee hash invariant, so flag as unhashable
1078 __hash__ = None
1079
Jim Fultonfafd8742004-08-28 15:22:12 +00001080 def __iter__(self):
1081 return iter(self._tests)
1082
Fred Drake02538202001-03-21 18:09:46 +00001083 def countTestCases(self):
1084 cases = 0
Michael Foord37d89a22009-04-05 01:15:01 +00001085 for test in self:
Steve Purcell7e743842003-09-22 11:08:12 +00001086 cases += test.countTestCases()
Fred Drake02538202001-03-21 18:09:46 +00001087 return cases
1088
1089 def addTest(self, test):
Georg Brandld9e50262007-03-07 11:54:49 +00001090 # sanity checks
Raymond Hettinger5930d8f2008-07-10 16:06:41 +00001091 if not hasattr(test, '__call__'):
Georg Brandld9e50262007-03-07 11:54:49 +00001092 raise TypeError("the test to add must be callable")
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001093 if isinstance(test, type) and issubclass(test, (TestCase, TestSuite)):
Georg Brandld9e50262007-03-07 11:54:49 +00001094 raise TypeError("TestCases and TestSuites must be instantiated "
1095 "before passing them to addTest()")
Fred Drake02538202001-03-21 18:09:46 +00001096 self._tests.append(test)
1097
1098 def addTests(self, tests):
Georg Brandld9e50262007-03-07 11:54:49 +00001099 if isinstance(tests, basestring):
1100 raise TypeError("tests must be an iterable of tests, not a string")
Fred Drake02538202001-03-21 18:09:46 +00001101 for test in tests:
1102 self.addTest(test)
1103
1104 def run(self, result):
Michael Foord37d89a22009-04-05 01:15:01 +00001105 for test in self:
Fred Drake02538202001-03-21 18:09:46 +00001106 if result.shouldStop:
1107 break
1108 test(result)
1109 return result
1110
Raymond Hettinger664347b2004-12-04 21:21:53 +00001111 def __call__(self, *args, **kwds):
1112 return self.run(*args, **kwds)
1113
Fred Drake02538202001-03-21 18:09:46 +00001114 def debug(self):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001115 """Run the tests without collecting errors in a TestResult"""
Michael Foord37d89a22009-04-05 01:15:01 +00001116 for test in self:
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001117 test.debug()
Fred Drake02538202001-03-21 18:09:46 +00001118
1119
1120class FunctionTestCase(TestCase):
1121 """A test case that wraps a test function.
1122
1123 This is useful for slipping pre-existing test functions into the
Georg Brandl15c5ce92007-03-07 09:09:40 +00001124 unittest framework. Optionally, set-up and tidy-up functions can be
Fred Drake02538202001-03-21 18:09:46 +00001125 supplied. As with TestCase, the tidy-up ('tearDown') function will
1126 always be called if the set-up ('setUp') function ran successfully.
1127 """
1128
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001129 def __init__(self, testFunc, setUp=None, tearDown=None, description=None):
1130 super(FunctionTestCase, self).__init__()
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001131 self._setUpFunc = setUp
1132 self._tearDownFunc = tearDown
1133 self._testFunc = testFunc
1134 self._description = description
Fred Drake02538202001-03-21 18:09:46 +00001135
1136 def setUp(self):
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001137 if self._setUpFunc is not None:
1138 self._setUpFunc()
Fred Drake02538202001-03-21 18:09:46 +00001139
1140 def tearDown(self):
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001141 if self._tearDownFunc is not None:
1142 self._tearDownFunc()
Fred Drake02538202001-03-21 18:09:46 +00001143
1144 def runTest(self):
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001145 self._testFunc()
Fred Drake02538202001-03-21 18:09:46 +00001146
1147 def id(self):
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001148 return self._testFunc.__name__
Fred Drake02538202001-03-21 18:09:46 +00001149
Georg Brandl15c5ce92007-03-07 09:09:40 +00001150 def __eq__(self, other):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001151 if not isinstance(other, self.__class__):
1152 return NotImplemented
Georg Brandl15c5ce92007-03-07 09:09:40 +00001153
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001154 return self._setUpFunc == other._setUpFunc and \
1155 self._tearDownFunc == other._tearDownFunc and \
1156 self._testFunc == other._testFunc and \
1157 self._description == other._description
Georg Brandl15c5ce92007-03-07 09:09:40 +00001158
1159 def __ne__(self, other):
1160 return not self == other
1161
1162 def __hash__(self):
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001163 return hash((type(self), self._setUpFunc, self._tearDownFunc,
1164 self._testFunc, self._description))
Georg Brandl15c5ce92007-03-07 09:09:40 +00001165
Fred Drake02538202001-03-21 18:09:46 +00001166 def __str__(self):
Benjamin Petersonbaba1952009-04-18 19:26:19 +00001167 return "%s (%s)" % (_strclass(self.__class__), self._testFunc.__name__)
Fred Drake02538202001-03-21 18:09:46 +00001168
1169 def __repr__(self):
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001170 return "<%s testFunc=%s>" % (_strclass(self.__class__), self._testFunc)
Fred Drake02538202001-03-21 18:09:46 +00001171
1172 def shortDescription(self):
Benjamin Peterson71095ae2009-04-01 23:15:49 +00001173 if self._description is not None:
1174 return self._description
1175 doc = self._testFunc.__doc__
Steve Purcell7e743842003-09-22 11:08:12 +00001176 return doc and doc.split("\n")[0].strip() or None
Fred Drake02538202001-03-21 18:09:46 +00001177
1178
1179
1180##############################################################################
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001181# Locating and loading tests
Fred Drake02538202001-03-21 18:09:46 +00001182##############################################################################
1183
Antoine Pitroudae1a6a2008-12-28 16:01:11 +00001184class TestLoader(object):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001185 """
1186 This class is responsible for loading tests according to various criteria
1187 and returning them wrapped in a TestSuite
Fred Drake02538202001-03-21 18:09:46 +00001188 """
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001189 testMethodPrefix = 'test'
1190 sortTestMethodsUsing = cmp
1191 suiteClass = TestSuite
Fred Drake02538202001-03-21 18:09:46 +00001192
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001193 def loadTestsFromTestCase(self, testCaseClass):
Steve Purcell15d89272001-04-12 09:05:01 +00001194 """Return a suite of all tests cases contained in testCaseClass"""
Johannes Gijsbersd7b6ad42004-11-07 15:46:25 +00001195 if issubclass(testCaseClass, TestSuite):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001196 raise TypeError("Test cases should not be derived from TestSuite." \
1197 " Maybe you meant to derive from TestCase?")
Steve Purcell7e743842003-09-22 11:08:12 +00001198 testCaseNames = self.getTestCaseNames(testCaseClass)
1199 if not testCaseNames and hasattr(testCaseClass, 'runTest'):
1200 testCaseNames = ['runTest']
Benjamin Peterson176a56c2009-05-25 00:48:58 +00001201 suite = self.suiteClass(map(testCaseClass, testCaseNames))
Benjamin Peterson692428e2009-03-23 21:50:21 +00001202 return suite
Fred Drake02538202001-03-21 18:09:46 +00001203
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001204 def loadTestsFromModule(self, module):
Steve Purcell15d89272001-04-12 09:05:01 +00001205 """Return a suite of all tests cases contained in the given module"""
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001206 tests = []
1207 for name in dir(module):
1208 obj = getattr(module, name)
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001209 if isinstance(obj, type) and issubclass(obj, TestCase):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001210 tests.append(self.loadTestsFromTestCase(obj))
1211 return self.suiteClass(tests)
Fred Drake02538202001-03-21 18:09:46 +00001212
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001213 def loadTestsFromName(self, name, module=None):
Steve Purcell15d89272001-04-12 09:05:01 +00001214 """Return a suite of all tests cases given a string specifier.
1215
1216 The name may resolve either to a module, a test case class, a
1217 test method within a test case class, or a callable object which
1218 returns a TestCase or TestSuite instance.
Tim Peters613b2222001-04-13 05:37:27 +00001219
Steve Purcell15d89272001-04-12 09:05:01 +00001220 The method optionally resolves the names relative to a given module.
1221 """
Steve Purcell7e743842003-09-22 11:08:12 +00001222 parts = name.split('.')
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001223 if module is None:
Steve Purcell7e743842003-09-22 11:08:12 +00001224 parts_copy = parts[:]
1225 while parts_copy:
1226 try:
1227 module = __import__('.'.join(parts_copy))
1228 break
1229 except ImportError:
1230 del parts_copy[-1]
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001231 if not parts_copy:
1232 raise
Armin Rigo1b3c04b2003-10-24 17:15:29 +00001233 parts = parts[1:]
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001234 obj = module
1235 for part in parts:
Steve Purcell7e743842003-09-22 11:08:12 +00001236 parent, obj = obj, getattr(obj, part)
Fred Drake02538202001-03-21 18:09:46 +00001237
Antoine Pitroudae1a6a2008-12-28 16:01:11 +00001238 if isinstance(obj, types.ModuleType):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001239 return self.loadTestsFromModule(obj)
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001240 elif isinstance(obj, type) and issubclass(obj, TestCase):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001241 return self.loadTestsFromTestCase(obj)
Antoine Pitroudae1a6a2008-12-28 16:01:11 +00001242 elif (isinstance(obj, types.UnboundMethodType) and
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001243 isinstance(parent, type) and
Georg Brandl15c5ce92007-03-07 09:09:40 +00001244 issubclass(parent, TestCase)):
1245 return TestSuite([parent(obj.__name__)])
Steve Purcell397b45d2003-10-26 10:41:03 +00001246 elif isinstance(obj, TestSuite):
Steve Purcell7e743842003-09-22 11:08:12 +00001247 return obj
Raymond Hettinger5930d8f2008-07-10 16:06:41 +00001248 elif hasattr(obj, '__call__'):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001249 test = obj()
Georg Brandl15c5ce92007-03-07 09:09:40 +00001250 if isinstance(test, TestSuite):
1251 return test
1252 elif isinstance(test, TestCase):
1253 return TestSuite([test])
1254 else:
1255 raise TypeError("calling %s returned %s, not a test" %
1256 (obj, test))
Fred Drake02538202001-03-21 18:09:46 +00001257 else:
Georg Brandl15c5ce92007-03-07 09:09:40 +00001258 raise TypeError("don't know how to make test from: %s" % obj)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001259
1260 def loadTestsFromNames(self, names, module=None):
Steve Purcell15d89272001-04-12 09:05:01 +00001261 """Return a suite of all tests cases found using the given sequence
1262 of string specifiers. See 'loadTestsFromName()'.
1263 """
Steve Purcell7e743842003-09-22 11:08:12 +00001264 suites = [self.loadTestsFromName(name, module) for name in names]
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001265 return self.suiteClass(suites)
1266
1267 def getTestCaseNames(self, testCaseClass):
Steve Purcell15d89272001-04-12 09:05:01 +00001268 """Return a sorted sequence of method names found within testCaseClass
1269 """
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001270 def isTestMethod(attrname, testCaseClass=testCaseClass,
1271 prefix=self.testMethodPrefix):
1272 return attrname.startswith(prefix) and \
1273 hasattr(getattr(testCaseClass, attrname), '__call__')
Steve Purcell7e743842003-09-22 11:08:12 +00001274 testFnNames = filter(isTestMethod, dir(testCaseClass))
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001275 if self.sortTestMethodsUsing:
Raymond Hettinger5930d8f2008-07-10 16:06:41 +00001276 testFnNames.sort(key=_CmpToKey(self.sortTestMethodsUsing))
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001277 return testFnNames
1278
1279
1280
1281defaultTestLoader = TestLoader()
1282
1283
1284##############################################################################
1285# Patches for old functions: these functions should be considered obsolete
1286##############################################################################
1287
1288def _makeLoader(prefix, sortUsing, suiteClass=None):
1289 loader = TestLoader()
1290 loader.sortTestMethodsUsing = sortUsing
1291 loader.testMethodPrefix = prefix
1292 if suiteClass: loader.suiteClass = suiteClass
1293 return loader
1294
1295def getTestCaseNames(testCaseClass, prefix, sortUsing=cmp):
1296 return _makeLoader(prefix, sortUsing).getTestCaseNames(testCaseClass)
1297
1298def makeSuite(testCaseClass, prefix='test', sortUsing=cmp, suiteClass=TestSuite):
1299 return _makeLoader(prefix, sortUsing, suiteClass).loadTestsFromTestCase(testCaseClass)
1300
1301def findTestCases(module, prefix='test', sortUsing=cmp, suiteClass=TestSuite):
1302 return _makeLoader(prefix, sortUsing, suiteClass).loadTestsFromModule(module)
Fred Drake02538202001-03-21 18:09:46 +00001303
1304
1305##############################################################################
1306# Text UI
1307##############################################################################
1308
Antoine Pitroudae1a6a2008-12-28 16:01:11 +00001309class _WritelnDecorator(object):
Fred Drake02538202001-03-21 18:09:46 +00001310 """Used to decorate file-like objects with a handy 'writeln' method"""
1311 def __init__(self,stream):
1312 self.stream = stream
Fred Drake02538202001-03-21 18:09:46 +00001313
1314 def __getattr__(self, attr):
1315 return getattr(self.stream,attr)
1316
Raymond Hettinger91dd19d2003-09-13 02:58:00 +00001317 def writeln(self, arg=None):
Benjamin Petersond0cdb2d2009-03-24 23:07:07 +00001318 if arg:
1319 self.write(arg)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001320 self.write('\n') # text-mode streams translate to \r\n if needed
Tim Petersa19a1682001-03-29 04:36:09 +00001321
Fred Drake02538202001-03-21 18:09:46 +00001322
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001323class _TextTestResult(TestResult):
Fred Drake02538202001-03-21 18:09:46 +00001324 """A test result class that can print formatted text results to a stream.
1325
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001326 Used by TextTestRunner.
Fred Drake02538202001-03-21 18:09:46 +00001327 """
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001328 separator1 = '=' * 70
1329 separator2 = '-' * 70
Fred Drake02538202001-03-21 18:09:46 +00001330
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001331 def __init__(self, stream, descriptions, verbosity):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001332 super(_TextTestResult, self).__init__()
Fred Drake02538202001-03-21 18:09:46 +00001333 self.stream = stream
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001334 self.showAll = verbosity > 1
1335 self.dots = verbosity == 1
Fred Drake02538202001-03-21 18:09:46 +00001336 self.descriptions = descriptions
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001337
1338 def getDescription(self, test):
1339 if self.descriptions:
1340 return test.shortDescription() or str(test)
1341 else:
1342 return str(test)
1343
Fred Drake02538202001-03-21 18:09:46 +00001344 def startTest(self, test):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001345 super(_TextTestResult, self).startTest(test)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001346 if self.showAll:
1347 self.stream.write(self.getDescription(test))
1348 self.stream.write(" ... ")
Georg Brandld0632402008-05-11 15:17:41 +00001349 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +00001350
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001351 def addSuccess(self, test):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001352 super(_TextTestResult, self).addSuccess(test)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001353 if self.showAll:
Fred Drake02538202001-03-21 18:09:46 +00001354 self.stream.writeln("ok")
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001355 elif self.dots:
1356 self.stream.write('.')
Georg Brandld0632402008-05-11 15:17:41 +00001357 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +00001358
1359 def addError(self, test, err):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001360 super(_TextTestResult, self).addError(test, err)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001361 if self.showAll:
1362 self.stream.writeln("ERROR")
1363 elif self.dots:
1364 self.stream.write('E')
Georg Brandld0632402008-05-11 15:17:41 +00001365 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +00001366
1367 def addFailure(self, test, err):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001368 super(_TextTestResult, self).addFailure(test, err)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001369 if self.showAll:
1370 self.stream.writeln("FAIL")
1371 elif self.dots:
1372 self.stream.write('F')
Georg Brandld0632402008-05-11 15:17:41 +00001373 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +00001374
Benjamin Peterson692428e2009-03-23 21:50:21 +00001375 def addSkip(self, test, reason):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001376 super(_TextTestResult, self).addSkip(test, reason)
Benjamin Peterson692428e2009-03-23 21:50:21 +00001377 if self.showAll:
1378 self.stream.writeln("skipped {0!r}".format(reason))
1379 elif self.dots:
1380 self.stream.write("s")
1381 self.stream.flush()
1382
1383 def addExpectedFailure(self, test, err):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001384 super(_TextTestResult, self).addExpectedFailure(test, err)
Benjamin Peterson692428e2009-03-23 21:50:21 +00001385 if self.showAll:
1386 self.stream.writeln("expected failure")
1387 elif self.dots:
Benjamin Petersona8adceb2009-03-25 21:24:04 +00001388 self.stream.write("x")
Benjamin Peterson692428e2009-03-23 21:50:21 +00001389 self.stream.flush()
1390
1391 def addUnexpectedSuccess(self, test):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001392 super(_TextTestResult, self).addUnexpectedSuccess(test)
Benjamin Peterson692428e2009-03-23 21:50:21 +00001393 if self.showAll:
1394 self.stream.writeln("unexpected success")
1395 elif self.dots:
Benjamin Petersona8adceb2009-03-25 21:24:04 +00001396 self.stream.write("u")
Benjamin Peterson692428e2009-03-23 21:50:21 +00001397 self.stream.flush()
1398
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001399 def printErrors(self):
1400 if self.dots or self.showAll:
Fred Drake02538202001-03-21 18:09:46 +00001401 self.stream.writeln()
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001402 self.printErrorList('ERROR', self.errors)
1403 self.printErrorList('FAIL', self.failures)
1404
1405 def printErrorList(self, flavour, errors):
1406 for test, err in errors:
1407 self.stream.writeln(self.separator1)
1408 self.stream.writeln("%s: %s" % (flavour,self.getDescription(test)))
1409 self.stream.writeln(self.separator2)
Steve Purcell7b065702001-09-06 08:24:40 +00001410 self.stream.writeln("%s" % err)
Fred Drake02538202001-03-21 18:09:46 +00001411
1412
Antoine Pitroudae1a6a2008-12-28 16:01:11 +00001413class TextTestRunner(object):
Fred Drake02538202001-03-21 18:09:46 +00001414 """A test runner class that displays results in textual form.
Tim Petersa19a1682001-03-29 04:36:09 +00001415
Fred Drake02538202001-03-21 18:09:46 +00001416 It prints out the names of tests as they are run, errors as they
1417 occur, and a summary of the results at the end of the test run.
1418 """
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001419 def __init__(self, stream=sys.stderr, descriptions=1, verbosity=1):
Fred Drake02538202001-03-21 18:09:46 +00001420 self.stream = _WritelnDecorator(stream)
1421 self.descriptions = descriptions
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001422 self.verbosity = verbosity
1423
1424 def _makeResult(self):
1425 return _TextTestResult(self.stream, self.descriptions, self.verbosity)
Fred Drake02538202001-03-21 18:09:46 +00001426
1427 def run(self, test):
1428 "Run the given test case or test suite."
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001429 result = self._makeResult()
Fred Drake02538202001-03-21 18:09:46 +00001430 startTime = time.time()
Michael Foord07ef4872009-05-02 22:43:34 +00001431 startTestRun = getattr(result, 'startTestRun', None)
1432 if startTestRun is not None:
1433 startTestRun()
1434 try:
1435 test(result)
1436 finally:
1437 stopTestRun = getattr(result, 'stopTestRun', None)
1438 if stopTestRun is not None:
1439 stopTestRun()
Fred Drake02538202001-03-21 18:09:46 +00001440 stopTime = time.time()
Steve Purcell397b45d2003-10-26 10:41:03 +00001441 timeTaken = stopTime - startTime
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001442 result.printErrors()
1443 self.stream.writeln(result.separator2)
Fred Drake02538202001-03-21 18:09:46 +00001444 run = result.testsRun
1445 self.stream.writeln("Ran %d test%s in %.3fs" %
Neal Norwitz76165042002-05-31 14:15:11 +00001446 (run, run != 1 and "s" or "", timeTaken))
Fred Drake02538202001-03-21 18:09:46 +00001447 self.stream.writeln()
Benjamin Petersoncb2b0e42009-03-23 22:29:45 +00001448 results = map(len, (result.expectedFailures,
1449 result.unexpectedSuccesses,
Benjamin Peterson692428e2009-03-23 21:50:21 +00001450 result.skipped))
Benjamin Petersoncb2b0e42009-03-23 22:29:45 +00001451 expectedFails, unexpectedSuccesses, skipped = results
Benjamin Peterson692428e2009-03-23 21:50:21 +00001452 infos = []
Fred Drake02538202001-03-21 18:09:46 +00001453 if not result.wasSuccessful():
Benjamin Peterson692428e2009-03-23 21:50:21 +00001454 self.stream.write("FAILED")
Fred Drake02538202001-03-21 18:09:46 +00001455 failed, errored = map(len, (result.failures, result.errors))
1456 if failed:
Benjamin Peterson692428e2009-03-23 21:50:21 +00001457 infos.append("failures=%d" % failed)
Fred Drake02538202001-03-21 18:09:46 +00001458 if errored:
Benjamin Peterson692428e2009-03-23 21:50:21 +00001459 infos.append("errors=%d" % errored)
Fred Drake02538202001-03-21 18:09:46 +00001460 else:
Benjamin Petersona473f002009-03-24 22:56:32 +00001461 self.stream.write("OK")
Benjamin Peterson692428e2009-03-23 21:50:21 +00001462 if skipped:
1463 infos.append("skipped=%d" % skipped)
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001464 if expectedFails:
1465 infos.append("expected failures=%d" % expectedFails)
1466 if unexpectedSuccesses:
1467 infos.append("unexpected successes=%d" % unexpectedSuccesses)
Benjamin Peterson692428e2009-03-23 21:50:21 +00001468 if infos:
1469 self.stream.writeln(" (%s)" % (", ".join(infos),))
Benjamin Petersona473f002009-03-24 22:56:32 +00001470 else:
1471 self.stream.write("\n")
Fred Drake02538202001-03-21 18:09:46 +00001472 return result
Tim Petersa19a1682001-03-29 04:36:09 +00001473
Fred Drake02538202001-03-21 18:09:46 +00001474
Fred Drake02538202001-03-21 18:09:46 +00001475
1476##############################################################################
1477# Facilities for running tests from the command line
1478##############################################################################
1479
Antoine Pitroudae1a6a2008-12-28 16:01:11 +00001480class TestProgram(object):
Fred Drake02538202001-03-21 18:09:46 +00001481 """A command-line program that runs a set of tests; this is primarily
1482 for making test modules conveniently executable.
1483 """
1484 USAGE = """\
Steve Purcell17a781b2001-04-09 15:37:31 +00001485Usage: %(progName)s [options] [test] [...]
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001486
1487Options:
1488 -h, --help Show this message
1489 -v, --verbose Verbose output
1490 -q, --quiet Minimal output
Fred Drake02538202001-03-21 18:09:46 +00001491
1492Examples:
1493 %(progName)s - run default set of tests
1494 %(progName)s MyTestSuite - run suite 'MyTestSuite'
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001495 %(progName)s MyTestCase.testSomething - run MyTestCase.testSomething
1496 %(progName)s MyTestCase - run all 'test*' test methods
Fred Drake02538202001-03-21 18:09:46 +00001497 in MyTestCase
1498"""
1499 def __init__(self, module='__main__', defaultTest=None,
Georg Brandld0a96252007-03-07 09:21:06 +00001500 argv=None, testRunner=TextTestRunner,
Michael Foord5d31e052009-05-11 17:59:43 +00001501 testLoader=defaultTestLoader, exit=True,
1502 verbosity=1):
Antoine Pitroudae1a6a2008-12-28 16:01:11 +00001503 if isinstance(module, basestring):
Fred Drake02538202001-03-21 18:09:46 +00001504 self.module = __import__(module)
Steve Purcell7e743842003-09-22 11:08:12 +00001505 for part in module.split('.')[1:]:
Fred Drake02538202001-03-21 18:09:46 +00001506 self.module = getattr(self.module, part)
1507 else:
1508 self.module = module
1509 if argv is None:
1510 argv = sys.argv
Michael Foord829f6b82009-05-02 11:43:06 +00001511
1512 self.exit = exit
Michael Foord5d31e052009-05-11 17:59:43 +00001513 self.verbosity = verbosity
Fred Drake02538202001-03-21 18:09:46 +00001514 self.defaultTest = defaultTest
1515 self.testRunner = testRunner
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001516 self.testLoader = testLoader
Fred Drake02538202001-03-21 18:09:46 +00001517 self.progName = os.path.basename(argv[0])
1518 self.parseArgs(argv)
Fred Drake02538202001-03-21 18:09:46 +00001519 self.runTests()
1520
1521 def usageExit(self, msg=None):
Benjamin Petersona7d441d2009-03-24 00:35:20 +00001522 if msg:
1523 print msg
Fred Drake02538202001-03-21 18:09:46 +00001524 print self.USAGE % self.__dict__
1525 sys.exit(2)
1526
1527 def parseArgs(self, argv):
1528 import getopt
Benjamin Peterson692428e2009-03-23 21:50:21 +00001529 long_opts = ['help','verbose','quiet']
Fred Drake02538202001-03-21 18:09:46 +00001530 try:
Benjamin Peterson692428e2009-03-23 21:50:21 +00001531 options, args = getopt.getopt(argv[1:], 'hHvq', long_opts)
Fred Drake02538202001-03-21 18:09:46 +00001532 for opt, value in options:
1533 if opt in ('-h','-H','--help'):
1534 self.usageExit()
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001535 if opt in ('-q','--quiet'):
1536 self.verbosity = 0
1537 if opt in ('-v','--verbose'):
1538 self.verbosity = 2
Fred Drake02538202001-03-21 18:09:46 +00001539 if len(args) == 0 and self.defaultTest is None:
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001540 self.test = self.testLoader.loadTestsFromModule(self.module)
1541 return
Fred Drake02538202001-03-21 18:09:46 +00001542 if len(args) > 0:
1543 self.testNames = args
Michael Foordf596a512009-05-12 10:49:13 +00001544 if sys.modules['unittest'] is sys.modules['__main__']:
Michael Foord7df82c92009-05-12 10:46:23 +00001545 self.module = None
Fred Drake02538202001-03-21 18:09:46 +00001546 else:
1547 self.testNames = (self.defaultTest,)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001548 self.createTests()
Fred Drake02538202001-03-21 18:09:46 +00001549 except getopt.error, msg:
1550 self.usageExit(msg)
1551
1552 def createTests(self):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001553 self.test = self.testLoader.loadTestsFromNames(self.testNames,
1554 self.module)
Fred Drake02538202001-03-21 18:09:46 +00001555
1556 def runTests(self):
Georg Brandld0a96252007-03-07 09:21:06 +00001557 if isinstance(self.testRunner, (type, types.ClassType)):
1558 try:
1559 testRunner = self.testRunner(verbosity=self.verbosity)
1560 except TypeError:
1561 # didn't accept the verbosity argument
1562 testRunner = self.testRunner()
1563 else:
1564 # it is assumed to be a TestRunner instance
1565 testRunner = self.testRunner
Michael Foord829f6b82009-05-02 11:43:06 +00001566 self.result = testRunner.run(self.test)
1567 if self.exit:
1568 sys.exit(not self.result.wasSuccessful())
Fred Drake02538202001-03-21 18:09:46 +00001569
1570main = TestProgram
1571
1572
Michael Foorde2fb98f2009-05-02 20:15:05 +00001573##############################################################################
1574# Executing this module from the command line
1575##############################################################################
1576
Fred Drake02538202001-03-21 18:09:46 +00001577if __name__ == "__main__":
Michael Foord5d31e052009-05-11 17:59:43 +00001578 sys.modules['unittest'] = sys.modules['__main__']
Fred Drake02538202001-03-21 18:09:46 +00001579 main(module=None)