blob: 9c3024af69305bbbbf5275b699f75feebb9d2830 [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*'
Benjamin Peterson7fe73a12009-04-04 16:35:46 +000017 self.assertEqual((1 + 2), 3)
18 self.assertEqual(0 + 1, 1)
Steve Purcell7b065702001-09-06 08:24:40 +000019 def testMultiply(self):
Benjamin Peterson7fe73a12009-04-04 16:35:46 +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 Peterson52baa292009-03-24 00:56:30 +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 Peterson52baa292009-03-24 00:56:30 +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
Benjamin Peterson7fe73a12009-04-04 16:35:46 +000048import difflib
Benjamin Peterson5254c042009-03-23 22:25:03 +000049import functools
Benjamin Peterson7fe73a12009-04-04 16:35:46 +000050import os
51import pprint
52import re
53import sys
54import time
55import traceback
56import types
57import warnings
Fred Drake02538202001-03-21 18:09:46 +000058
59##############################################################################
Steve Purcelld75e7e42003-09-15 11:01:21 +000060# Exported classes and functions
61##############################################################################
Benjamin Peterson14a3dd72009-05-25 00:51:58 +000062__all__ = ['TestResult', 'TestCase', 'TestSuite',
Benjamin Peterson52baa292009-03-24 00:56:30 +000063 'TextTestRunner', 'TestLoader', 'FunctionTestCase', 'main',
Benjamin Peterson4c93dcb2009-03-24 01:33:55 +000064 'defaultTestLoader', 'SkipTest', 'skip', 'skipIf', 'skipUnless',
Benjamin Peterson52baa292009-03-24 00:56:30 +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##############################################################################
Fred Drake02538202001-03-21 18:09:46 +000072# Test framework core
73##############################################################################
74
Steve Purcelldc391a62002-08-09 09:46:23 +000075def _strclass(cls):
76 return "%s.%s" % (cls.__module__, cls.__name__)
77
Benjamin Peterson5254c042009-03-23 22:25:03 +000078
79class SkipTest(Exception):
80 """
81 Raise this exception in a test to skip it.
82
83 Usually you can use TestResult.skip() or one of the skipping decorators
84 instead of raising this directly.
85 """
86 pass
87
88class _ExpectedFailure(Exception):
89 """
90 Raise this when a test is expected to fail.
91
92 This is an implementation detail.
93 """
94
95 def __init__(self, exc_info):
96 super(_ExpectedFailure, self).__init__()
97 self.exc_info = exc_info
98
99class _UnexpectedSuccess(Exception):
100 """
101 The test was supposed to fail, but it didn't!
102 """
103 pass
104
105def _id(obj):
106 return obj
107
108def skip(reason):
109 """
110 Unconditionally skip a test.
111 """
112 def decorator(test_item):
113 if isinstance(test_item, type) and issubclass(test_item, TestCase):
114 test_item.__unittest_skip__ = True
115 test_item.__unittest_skip_why__ = reason
116 return test_item
117 @functools.wraps(test_item)
118 def skip_wrapper(*args, **kwargs):
119 raise SkipTest(reason)
120 return skip_wrapper
121 return decorator
122
123def skipIf(condition, reason):
124 """
125 Skip a test if the condition is true.
126 """
127 if condition:
128 return skip(reason)
129 return _id
130
131def skipUnless(condition, reason):
132 """
133 Skip a test unless the condition is true.
134 """
135 if not condition:
136 return skip(reason)
137 return _id
138
139
140def expectedFailure(func):
141 @functools.wraps(func)
142 def wrapper(*args, **kwargs):
143 try:
144 func(*args, **kwargs)
145 except Exception:
146 raise _ExpectedFailure(sys.exc_info())
147 raise _UnexpectedSuccess
148 return wrapper
149
Steve Purcellb8d5f242003-12-06 13:03:13 +0000150__unittest = 1
151
Benjamin Peterson1467ac82009-01-09 03:42:38 +0000152class TestResult(object):
Fred Drake02538202001-03-21 18:09:46 +0000153 """Holder for test result information.
154
155 Test results are automatically managed by the TestCase and TestSuite
156 classes, and do not need to be explicitly manipulated by writers of tests.
157
158 Each instance holds the total number of tests run, and collections of
159 failures and errors that occurred among those test runs. The collections
Steve Purcell7b065702001-09-06 08:24:40 +0000160 contain tuples of (testcase, exceptioninfo), where exceptioninfo is the
Fred Drake656f9ec2001-09-06 19:13:14 +0000161 formatted traceback of the error that occurred.
Fred Drake02538202001-03-21 18:09:46 +0000162 """
163 def __init__(self):
164 self.failures = []
165 self.errors = []
166 self.testsRun = 0
Benjamin Peterson5254c042009-03-23 22:25:03 +0000167 self.skipped = []
Benjamin Peterson52baa292009-03-24 00:56:30 +0000168 self.expectedFailures = []
169 self.unexpectedSuccesses = []
Guido van Rossumd8faa362007-04-27 19:54:29 +0000170 self.shouldStop = False
Fred Drake02538202001-03-21 18:09:46 +0000171
172 def startTest(self, test):
173 "Called when the given test is about to be run"
174 self.testsRun = self.testsRun + 1
175
Benjamin Peterson25c95f12009-05-08 20:42:26 +0000176 def startTestRun(self):
177 """Called once before any tests are executed.
178
179 See startTest for a method called before each test.
180 """
181
Fred Drake02538202001-03-21 18:09:46 +0000182 def stopTest(self, test):
183 "Called when the given test has been run"
184 pass
185
Benjamin Peterson25c95f12009-05-08 20:42:26 +0000186 def stopTestRun(self):
187 """Called once after all tests are executed.
188
189 See stopTest for a method called after each test.
190 """
191
Fred Drake02538202001-03-21 18:09:46 +0000192 def addError(self, test, err):
Steve Purcell7b065702001-09-06 08:24:40 +0000193 """Called when an error has occurred. 'err' is a tuple of values as
194 returned by sys.exc_info().
195 """
Steve Purcellb8d5f242003-12-06 13:03:13 +0000196 self.errors.append((test, self._exc_info_to_string(err, test)))
Fred Drake02538202001-03-21 18:09:46 +0000197
198 def addFailure(self, test, err):
Steve Purcell7b065702001-09-06 08:24:40 +0000199 """Called when an error has occurred. 'err' is a tuple of values as
200 returned by sys.exc_info()."""
Steve Purcellb8d5f242003-12-06 13:03:13 +0000201 self.failures.append((test, self._exc_info_to_string(err, test)))
Fred Drake02538202001-03-21 18:09:46 +0000202
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000203 def addSuccess(self, test):
204 "Called when a test has completed successfully"
205 pass
206
Benjamin Peterson5254c042009-03-23 22:25:03 +0000207 def addSkip(self, test, reason):
208 """Called when a test is skipped."""
209 self.skipped.append((test, reason))
210
211 def addExpectedFailure(self, test, err):
212 """Called when an expected failure/error occured."""
Benjamin Peterson52baa292009-03-24 00:56:30 +0000213 self.expectedFailures.append(
Benjamin Peterson5254c042009-03-23 22:25:03 +0000214 (test, self._exc_info_to_string(err, test)))
215
216 def addUnexpectedSuccess(self, test):
217 """Called when a test was expected to fail, but succeed."""
Benjamin Peterson52baa292009-03-24 00:56:30 +0000218 self.unexpectedSuccesses.append(test)
Benjamin Peterson5254c042009-03-23 22:25:03 +0000219
Fred Drake02538202001-03-21 18:09:46 +0000220 def wasSuccessful(self):
221 "Tells whether or not this result was a success"
222 return len(self.failures) == len(self.errors) == 0
223
224 def stop(self):
225 "Indicates that the tests should be aborted"
Steve Purcell7e743842003-09-22 11:08:12 +0000226 self.shouldStop = True
Tim Petersa19a1682001-03-29 04:36:09 +0000227
Steve Purcellb8d5f242003-12-06 13:03:13 +0000228 def _exc_info_to_string(self, err, test):
Steve Purcell7b065702001-09-06 08:24:40 +0000229 """Converts a sys.exc_info()-style tuple of values into a string."""
Steve Purcellb8d5f242003-12-06 13:03:13 +0000230 exctype, value, tb = err
231 # Skip test runner traceback levels
232 while tb and self._is_relevant_tb_level(tb):
233 tb = tb.tb_next
234 if exctype is test.failureException:
235 # Skip assert*() traceback levels
236 length = self._count_relevant_tb_levels(tb)
Collin Winterce36ad82007-08-30 01:19:48 +0000237 return ''.join(traceback.format_exception(exctype, value,
238 tb, length))
Steve Purcellb8d5f242003-12-06 13:03:13 +0000239 return ''.join(traceback.format_exception(exctype, value, tb))
240
241 def _is_relevant_tb_level(self, tb):
Guido van Rossume2b70bc2006-08-18 22:13:04 +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 Peterson52baa292009-03-24 00:56:30 +0000256
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000257class _AssertRaisesContext(object):
258 """A context manager used to implement TestCase.assertRaises* methods."""
Benjamin Peterson52baa292009-03-24 00:56:30 +0000259
260
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000261 def __init__(self, expected, test_case, callable_obj=None,
262 expected_regexp=None):
Antoine Pitrou5acd41e2008-12-28 14:29:00 +0000263 self.expected = expected
264 self.failureException = test_case.failureException
265 if callable_obj is not None:
266 try:
267 self.obj_name = callable_obj.__name__
268 except AttributeError:
269 self.obj_name = str(callable_obj)
270 else:
271 self.obj_name = None
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000272 self.expected_regex = expected_regexp
Benjamin Peterson52baa292009-03-24 00:56:30 +0000273
Antoine Pitrou5acd41e2008-12-28 14:29:00 +0000274 def __enter__(self):
275 pass
Benjamin Peterson52baa292009-03-24 00:56:30 +0000276
Benjamin Peterson25c95f12009-05-08 20:42:26 +0000277 def __exit__(self, exc_type, exc_value, tb):
Antoine Pitrou5acd41e2008-12-28 14:29:00 +0000278 if exc_type is None:
279 try:
280 exc_name = self.expected.__name__
281 except AttributeError:
282 exc_name = str(self.expected)
283 if self.obj_name:
284 raise self.failureException("{0} not raised by {1}"
285 .format(exc_name, self.obj_name))
286 else:
287 raise self.failureException("{0} not raised"
288 .format(exc_name))
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000289 if not issubclass(exc_type, self.expected):
290 # let unexpected exceptions pass through
291 return False
292 if self.expected_regex is None:
Antoine Pitrou5acd41e2008-12-28 14:29:00 +0000293 return True
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000294
295 expected_regexp = self.expected_regex
296 if isinstance(expected_regexp, (bytes, str)):
297 expected_regexp = re.compile(expected_regexp)
298 if not expected_regexp.search(str(exc_value)):
299 raise self.failureException('"%s" does not match "%s"' %
300 (expected_regexp.pattern, str(exc_value)))
301 return True
302
303
304class _AssertWrapper(object):
305 """Wrap entries in the _type_equality_funcs registry to make them deep
306 copyable."""
307
308 def __init__(self, function):
309 self.function = function
310
311 def __deepcopy__(self, memo):
312 memo[id(self)] = self
Antoine Pitrou5acd41e2008-12-28 14:29:00 +0000313
Benjamin Peterson52baa292009-03-24 00:56:30 +0000314
Benjamin Peterson1467ac82009-01-09 03:42:38 +0000315class TestCase(object):
Fred Drake02538202001-03-21 18:09:46 +0000316 """A class whose instances are single test cases.
317
Fred Drake02538202001-03-21 18:09:46 +0000318 By default, the test code itself should be placed in a method named
319 'runTest'.
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000320
Tim Petersa19a1682001-03-29 04:36:09 +0000321 If the fixture may be used for many test cases, create as
Fred Drake02538202001-03-21 18:09:46 +0000322 many test methods as are needed. When instantiating such a TestCase
323 subclass, specify in the constructor arguments the name of the test method
324 that the instance is to execute.
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000325
Tim Petersa19a1682001-03-29 04:36:09 +0000326 Test authors should subclass TestCase for their own tests. Construction
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000327 and deconstruction of the test's environment ('fixture') can be
328 implemented by overriding the 'setUp' and 'tearDown' methods respectively.
329
330 If it is necessary to override the __init__ method, the base class
331 __init__ method must always be called. It is important that subclasses
332 should not change the signature of their __init__ method, since instances
333 of the classes are instantiated automatically by parts of the framework
334 in order to be run.
Fred Drake02538202001-03-21 18:09:46 +0000335 """
Steve Purcell15d89272001-04-12 09:05:01 +0000336
337 # This attribute determines which exception will be raised when
338 # the instance's assertion methods fail; test methods raising this
339 # exception will be deemed to have 'failed' rather than 'errored'
340
341 failureException = AssertionError
342
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000343 # This attribute determines whether long messages (including repr of
344 # objects used in assert methods) will be printed on failure in *addition*
345 # to any explicit message passed.
346
347 longMessage = False
348
349
Fred Drake02538202001-03-21 18:09:46 +0000350 def __init__(self, methodName='runTest'):
351 """Create an instance of the class that will use the named test
352 method when executed. Raises a ValueError if the instance does
353 not have a method with the specified name.
354 """
Benjamin Peterson52baa292009-03-24 00:56:30 +0000355 self._testMethodName = methodName
Benjamin Petersonfa0d7032009-06-01 22:42:33 +0000356 self._resultForDoCleanups = None
Fred Drake02538202001-03-21 18:09:46 +0000357 try:
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000358 testMethod = getattr(self, methodName)
Fred Drake02538202001-03-21 18:09:46 +0000359 except AttributeError:
Benjamin Peterson1467ac82009-01-09 03:42:38 +0000360 raise ValueError("no such test method in %s: %s" % \
361 (self.__class__, methodName))
Benjamin Peterson52baa292009-03-24 00:56:30 +0000362 self._testMethodDoc = testMethod.__doc__
Benjamin Peterson25c95f12009-05-08 20:42:26 +0000363 self._cleanups = []
Fred Drake02538202001-03-21 18:09:46 +0000364
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000365 # Map types to custom assertEqual functions that will compare
366 # instances of said type in more detail to generate a more useful
367 # error message.
368 self._type_equality_funcs = {}
369 self.addTypeEqualityFunc(dict, self.assertDictEqual)
370 self.addTypeEqualityFunc(list, self.assertListEqual)
371 self.addTypeEqualityFunc(tuple, self.assertTupleEqual)
372 self.addTypeEqualityFunc(set, self.assertSetEqual)
373 self.addTypeEqualityFunc(frozenset, self.assertSetEqual)
374
375 def addTypeEqualityFunc(self, typeobj, function):
376 """Add a type specific assertEqual style function to compare a type.
377
378 This method is for use by TestCase subclasses that need to register
379 their own type equality functions to provide nicer error messages.
380
381 Args:
382 typeobj: The data type to call this function on when both values
383 are of the same type in assertEqual().
384 function: The callable taking two arguments and an optional
385 msg= argument that raises self.failureException with a
386 useful error message when the two arguments are not equal.
387 """
388 self._type_equality_funcs[typeobj] = _AssertWrapper(function)
389
Benjamin Peterson25c95f12009-05-08 20:42:26 +0000390 def addCleanup(self, function, *args, **kwargs):
391 """Add a function, with arguments, to be called when the test is
392 completed. Functions added are called on a LIFO basis and are
393 called after tearDown on test failure or success.
394
395 Cleanup items are called even if setUp fails (unlike tearDown)."""
396 self._cleanups.append((function, args, kwargs))
397
Fred Drake02538202001-03-21 18:09:46 +0000398 def setUp(self):
399 "Hook method for setting up the test fixture before exercising it."
400 pass
401
402 def tearDown(self):
403 "Hook method for deconstructing the test fixture after testing it."
404 pass
405
406 def countTestCases(self):
407 return 1
408
409 def defaultTestResult(self):
410 return TestResult()
411
412 def shortDescription(self):
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000413 """Returns both the test method name and first line of its docstring.
Fred Drake02538202001-03-21 18:09:46 +0000414
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000415 If no docstring is given, only returns the method name.
416
417 This method overrides unittest.TestCase.shortDescription(), which
418 only returns the first line of the docstring, obscuring the name
419 of the test upon failure.
Fred Drake02538202001-03-21 18:09:46 +0000420 """
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000421 desc = str(self)
422 doc_first_line = None
423
424 if self._testMethodDoc:
425 doc_first_line = self._testMethodDoc.split("\n")[0].strip()
426 if doc_first_line:
427 desc = '\n'.join((desc, doc_first_line))
428 return desc
Fred Drake02538202001-03-21 18:09:46 +0000429
430 def id(self):
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000431 return "%s.%s" % (_strclass(self.__class__), self._testMethodName)
Fred Drake02538202001-03-21 18:09:46 +0000432
Guido van Rossumd8faa362007-04-27 19:54:29 +0000433 def __eq__(self, other):
434 if type(self) is not type(other):
Benjamin Peterson52baa292009-03-24 00:56:30 +0000435 return NotImplemented
Guido van Rossumd8faa362007-04-27 19:54:29 +0000436
437 return self._testMethodName == other._testMethodName
438
439 def __ne__(self, other):
440 return not self == other
441
442 def __hash__(self):
443 return hash((type(self), self._testMethodName))
444
Fred Drake02538202001-03-21 18:09:46 +0000445 def __str__(self):
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000446 return "%s (%s)" % (self._testMethodName, _strclass(self.__class__))
Fred Drake02538202001-03-21 18:09:46 +0000447
448 def __repr__(self):
449 return "<%s testMethod=%s>" % \
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000450 (_strclass(self.__class__), self._testMethodName)
Fred Drake02538202001-03-21 18:09:46 +0000451
452 def run(self, result=None):
Benjamin Peterson25c95f12009-05-08 20:42:26 +0000453 orig_result = result
Benjamin Peterson52baa292009-03-24 00:56:30 +0000454 if result is None:
455 result = self.defaultTestResult()
Benjamin Peterson25c95f12009-05-08 20:42:26 +0000456 startTestRun = getattr(result, 'startTestRun', None)
457 if startTestRun is not None:
458 startTestRun()
459
Benjamin Petersonfa0d7032009-06-01 22:42:33 +0000460 self._resultForDoCleanups = result
Fred Drake02538202001-03-21 18:09:46 +0000461 result.startTest(self)
Benjamin Peterson14a3dd72009-05-25 00:51:58 +0000462 if getattr(self.__class__, "__unittest_skip__", False):
463 # If the whole class was skipped.
464 try:
465 result.addSkip(self, self.__class__.__unittest_skip_why__)
466 finally:
467 result.stopTest(self)
468 return
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000469 testMethod = getattr(self, self._testMethodName)
Fred Drake02538202001-03-21 18:09:46 +0000470 try:
Benjamin Peterson5254c042009-03-23 22:25:03 +0000471 success = False
Fred Drake02538202001-03-21 18:09:46 +0000472 try:
Benjamin Peterson25c95f12009-05-08 20:42:26 +0000473 self.setUp()
Benjamin Peterson5254c042009-03-23 22:25:03 +0000474 except SkipTest as e:
475 result.addSkip(self, str(e))
Benjamin Peterson1467ac82009-01-09 03:42:38 +0000476 except Exception:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000477 result.addError(self, sys.exc_info())
Benjamin Peterson5254c042009-03-23 22:25:03 +0000478 else:
Benjamin Peterson25c95f12009-05-08 20:42:26 +0000479 try:
480 testMethod()
481 except self.failureException:
482 result.addFailure(self, sys.exc_info())
483 except _ExpectedFailure as e:
484 result.addExpectedFailure(self, e.exc_info)
485 except _UnexpectedSuccess:
486 result.addUnexpectedSuccess(self)
487 except SkipTest as e:
488 result.addSkip(self, str(e))
489 except Exception:
490 result.addError(self, sys.exc_info())
491 else:
492 success = True
Fred Drake02538202001-03-21 18:09:46 +0000493
Benjamin Peterson25c95f12009-05-08 20:42:26 +0000494 try:
495 self.tearDown()
496 except Exception:
497 result.addError(self, sys.exc_info())
498 success = False
499
500 cleanUpSuccess = self.doCleanups()
501 success = success and cleanUpSuccess
Benjamin Peterson5254c042009-03-23 22:25:03 +0000502 if success:
503 result.addSuccess(self)
Fred Drake02538202001-03-21 18:09:46 +0000504 finally:
505 result.stopTest(self)
Benjamin Peterson25c95f12009-05-08 20:42:26 +0000506 if orig_result is None:
507 stopTestRun = getattr(result, 'stopTestRun', None)
508 if stopTestRun is not None:
509 stopTestRun()
510
511 def doCleanups(self):
512 """Execute all cleanup functions. Normally called for you after
513 tearDown."""
Benjamin Petersonfa0d7032009-06-01 22:42:33 +0000514 result = self._resultForDoCleanups
Benjamin Peterson25c95f12009-05-08 20:42:26 +0000515 ok = True
516 while self._cleanups:
517 function, args, kwargs = self._cleanups.pop(-1)
518 try:
519 function(*args, **kwargs)
520 except Exception:
521 ok = False
522 result.addError(self, sys.exc_info())
523 return ok
Fred Drake02538202001-03-21 18:09:46 +0000524
Raymond Hettinger664347b2004-12-04 21:21:53 +0000525 def __call__(self, *args, **kwds):
526 return self.run(*args, **kwds)
Steve Purcell7e743842003-09-22 11:08:12 +0000527
Fred Drake02538202001-03-21 18:09:46 +0000528 def debug(self):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000529 """Run the test without collecting errors in a TestResult"""
Fred Drake02538202001-03-21 18:09:46 +0000530 self.setUp()
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000531 getattr(self, self._testMethodName)()
Fred Drake02538202001-03-21 18:09:46 +0000532 self.tearDown()
533
Benjamin Petersone549ead2009-03-28 21:42:05 +0000534 def skipTest(self, reason):
Benjamin Peterson5254c042009-03-23 22:25:03 +0000535 """Skip this test."""
536 raise SkipTest(reason)
537
Steve Purcell15d89272001-04-12 09:05:01 +0000538 def fail(self, msg=None):
539 """Fail immediately, with the given message."""
Collin Winterce36ad82007-08-30 01:19:48 +0000540 raise self.failureException(msg)
Fred Drake02538202001-03-21 18:09:46 +0000541
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000542 def assertFalse(self, expr, msg=None):
Fred Drake02538202001-03-21 18:09:46 +0000543 "Fail the test if the expression is true."
Benjamin Peterson52baa292009-03-24 00:56:30 +0000544 if expr:
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000545 msg = self._formatMessage(msg, "%r is not False" % expr)
Benjamin Peterson52baa292009-03-24 00:56:30 +0000546 raise self.failureException(msg)
Fred Drake02538202001-03-21 18:09:46 +0000547
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000548 def assertTrue(self, expr, msg=None):
Steve Purcell15d89272001-04-12 09:05:01 +0000549 """Fail the test unless the expression is true."""
Benjamin Peterson52baa292009-03-24 00:56:30 +0000550 if not expr:
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000551 msg = self._formatMessage(msg, "%r is not True" % expr)
Benjamin Peterson52baa292009-03-24 00:56:30 +0000552 raise self.failureException(msg)
Steve Purcell15d89272001-04-12 09:05:01 +0000553
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000554 def _formatMessage(self, msg, standardMsg):
555 """Honour the longMessage attribute when generating failure messages.
556 If longMessage is False this means:
557 * Use only an explicit message if it is provided
558 * Otherwise use the standard message for the assert
559
560 If longMessage is True:
561 * Use the standard message
562 * If an explicit message is provided, plus ' : ' and the explicit message
563 """
564 if not self.longMessage:
565 return msg or standardMsg
566 if msg is None:
567 return standardMsg
568 return standardMsg + ' : ' + msg
569
570
571 def assertRaises(self, excClass, callableObj=None, *args, **kwargs):
Steve Purcell15d89272001-04-12 09:05:01 +0000572 """Fail unless an exception of class excClass is thrown
Fred Drake02538202001-03-21 18:09:46 +0000573 by callableObj when invoked with arguments args and keyword
574 arguments kwargs. If a different type of exception is
575 thrown, it will not be caught, and the test case will be
576 deemed to have suffered an error, exactly as for an
577 unexpected exception.
Antoine Pitrou5acd41e2008-12-28 14:29:00 +0000578
579 If called with callableObj omitted or None, will return a
580 context object used like this::
581
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000582 with self.assertRaises(some_error_class):
Antoine Pitrou5acd41e2008-12-28 14:29:00 +0000583 do_something()
Fred Drake02538202001-03-21 18:09:46 +0000584 """
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000585 context = _AssertRaisesContext(excClass, self, callableObj)
Antoine Pitrou5acd41e2008-12-28 14:29:00 +0000586 if callableObj is None:
587 return context
588 with context:
Guido van Rossum68468eb2003-02-27 20:14:51 +0000589 callableObj(*args, **kwargs)
Fred Drake02538202001-03-21 18:09:46 +0000590
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000591 def _getAssertEqualityFunc(self, first, second):
592 """Get a detailed comparison function for the types of the two args.
593
594 Returns: A callable accepting (first, second, msg=None) that will
595 raise a failure exception if first != second with a useful human
596 readable error message for those types.
597 """
598 #
599 # NOTE(gregory.p.smith): I considered isinstance(first, type(second))
600 # and vice versa. I opted for the conservative approach in case
601 # subclasses are not intended to be compared in detail to their super
602 # class instances using a type equality func. This means testing
603 # subtypes won't automagically use the detailed comparison. Callers
604 # should use their type specific assertSpamEqual method to compare
605 # subclasses if the detailed comparison is desired and appropriate.
606 # See the discussion in http://bugs.python.org/issue2578.
607 #
608 if type(first) is type(second):
609 asserter = self._type_equality_funcs.get(type(first))
610 if asserter is not None:
611 return asserter.function
612
613 return self._baseAssertEqual
614
615 def _baseAssertEqual(self, first, second, msg=None):
616 """The default assertEqual implementation, not type specific."""
617 if not first == second:
618 standardMsg = '%r != %r' % (first, second)
619 msg = self._formatMessage(msg, standardMsg)
620 raise self.failureException(msg)
621
622 def assertEqual(self, first, second, msg=None):
Raymond Hettingerc377cbf2003-04-04 22:56:42 +0000623 """Fail if the two objects are unequal as determined by the '=='
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000624 operator.
625 """
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000626 assertion_func = self._getAssertEqualityFunc(first, second)
627 assertion_func(first, second, msg=msg)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000628
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000629 def assertNotEqual(self, first, second, msg=None):
Steve Purcell15d89272001-04-12 09:05:01 +0000630 """Fail if the two objects are equal as determined by the '=='
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000631 operator.
632 """
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000633 if not first != second:
634 msg = self._formatMessage(msg, '%r == %r' % (first, second))
635 raise self.failureException(msg)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000636
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000637 def assertAlmostEqual(self, first, second, *, places=7, msg=None):
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000638 """Fail if the two objects are unequal as determined by their
639 difference rounded to the given number of decimal places
640 (default 7) and comparing to zero.
641
Steve Purcell397b45d2003-10-26 10:41:03 +0000642 Note that decimal places (from zero) are usually not the same
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000643 as significant digits (measured from the most signficant digit).
644 """
Jeffrey Yasskin1cc55442007-09-06 18:55:17 +0000645 if round(abs(second-first), places) != 0:
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000646 standardMsg = '%r != %r within %r places' % (first, second, places)
647 msg = self._formatMessage(msg, standardMsg)
648 raise self.failureException(msg)
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000649
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000650 def assertNotAlmostEqual(self, first, second, *, places=7, msg=None):
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000651 """Fail if the two objects are equal as determined by their
652 difference rounded to the given number of decimal places
653 (default 7) and comparing to zero.
654
Steve Purcellcca34912003-10-26 16:38:16 +0000655 Note that decimal places (from zero) are usually not the same
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000656 as significant digits (measured from the most signficant digit).
657 """
Jeffrey Yasskin1cc55442007-09-06 18:55:17 +0000658 if round(abs(second-first), places) == 0:
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000659 standardMsg = '%r == %r within %r places' % (first, second, places)
660 msg = self._formatMessage(msg, standardMsg)
661 raise self.failureException(msg)
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000662
Steve Purcell7e743842003-09-22 11:08:12 +0000663 # Synonyms for assertion methods
664
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000665 # The plurals are undocumented. Keep them that way to discourage use.
666 # Do not add more. Do not remove.
667 # Going through a deprecation cycle on these would annoy many people.
668 assertEquals = assertEqual
669 assertNotEquals = assertNotEqual
670 assertAlmostEquals = assertAlmostEqual
671 assertNotAlmostEquals = assertNotAlmostEqual
672 assert_ = assertTrue
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000673
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000674 # These fail* assertion method names are pending deprecation and will
675 # be a DeprecationWarning in 3.2; http://bugs.python.org/issue2578
676 def _deprecate(original_func):
677 def deprecated_func(*args, **kwargs):
678 warnings.warn(
679 'Please use {0} instead.'.format(original_func.__name__),
680 PendingDeprecationWarning, 2)
681 return original_func(*args, **kwargs)
682 return deprecated_func
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000683
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000684 failUnlessEqual = _deprecate(assertEqual)
685 failIfEqual = _deprecate(assertNotEqual)
686 failUnlessAlmostEqual = _deprecate(assertAlmostEqual)
687 failIfAlmostEqual = _deprecate(assertNotAlmostEqual)
688 failUnless = _deprecate(assertTrue)
689 failUnlessRaises = _deprecate(assertRaises)
690 failIf = _deprecate(assertFalse)
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000691
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000692 def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None):
693 """An equality assertion for ordered sequences (like lists and tuples).
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000694
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000695 For the purposes of this function, a valid orderd sequence type is one
696 which can be indexed, has a length, and has an equality operator.
Steve Purcell15d89272001-04-12 09:05:01 +0000697
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000698 Args:
699 seq1: The first sequence to compare.
700 seq2: The second sequence to compare.
701 seq_type: The expected datatype of the sequences, or None if no
702 datatype should be enforced.
703 msg: Optional message to use on failure instead of a list of
704 differences.
705 """
706 if seq_type != None:
707 seq_type_name = seq_type.__name__
708 if not isinstance(seq1, seq_type):
709 raise self.failureException('First sequence is not a %s: %r'
710 % (seq_type_name, seq1))
711 if not isinstance(seq2, seq_type):
712 raise self.failureException('Second sequence is not a %s: %r'
713 % (seq_type_name, seq2))
714 else:
715 seq_type_name = "sequence"
Steve Purcell7e743842003-09-22 11:08:12 +0000716
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000717 differing = None
718 try:
719 len1 = len(seq1)
720 except (TypeError, NotImplementedError):
721 differing = 'First %s has no length. Non-sequence?' % (
722 seq_type_name)
Steve Purcell15d89272001-04-12 09:05:01 +0000723
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000724 if differing is None:
725 try:
726 len2 = len(seq2)
727 except (TypeError, NotImplementedError):
728 differing = 'Second %s has no length. Non-sequence?' % (
729 seq_type_name)
730
731 if differing is None:
732 if seq1 == seq2:
733 return
734
Benjamin Petersonfa0d7032009-06-01 22:42:33 +0000735 seq1_repr = repr(seq1)
736 seq2_repr = repr(seq2)
737 if len(seq1_repr) > 30:
738 seq1_repr = seq1_repr[:30] + '...'
739 if len(seq2_repr) > 30:
740 seq2_repr = seq2_repr[:30] + '...'
741 elements = (seq_type_name.capitalize(), seq1_repr, seq2_repr)
742 differing = '%ss differ: %s != %s\n' % elements
743
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000744 for i in range(min(len1, len2)):
745 try:
746 item1 = seq1[i]
747 except (TypeError, IndexError, NotImplementedError):
Benjamin Petersonfa0d7032009-06-01 22:42:33 +0000748 differing += ('\nUnable to index element %d of first %s\n' %
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000749 (i, seq_type_name))
750 break
751
752 try:
753 item2 = seq2[i]
754 except (TypeError, IndexError, NotImplementedError):
Benjamin Petersonfa0d7032009-06-01 22:42:33 +0000755 differing += ('\nUnable to index element %d of second %s\n' %
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000756 (i, seq_type_name))
757 break
758
759 if item1 != item2:
Benjamin Petersonfa0d7032009-06-01 22:42:33 +0000760 differing += ('\nFirst differing element %d:\n%s\n%s\n' %
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000761 (i, item1, item2))
762 break
763 else:
764 if (len1 == len2 and seq_type is None and
765 type(seq1) != type(seq2)):
766 # The sequences are the same, but have differing types.
767 return
Benjamin Petersonfa0d7032009-06-01 22:42:33 +0000768
769 if len1 > len2:
770 differing += ('\nFirst %s contains %d additional '
771 'elements.\n' % (seq_type_name, len1 - len2))
772 try:
773 differing += ('First extra element %d:\n%s\n' %
774 (len2, seq1[len2]))
775 except (TypeError, IndexError, NotImplementedError):
776 differing += ('Unable to index element %d '
777 'of first %s\n' % (len2, seq_type_name))
778 elif len1 < len2:
779 differing += ('\nSecond %s contains %d additional '
780 'elements.\n' % (seq_type_name, len2 - len1))
781 try:
782 differing += ('First extra element %d:\n%s\n' %
783 (len1, seq2[len1]))
784 except (TypeError, IndexError, NotImplementedError):
785 differing += ('Unable to index element %d '
786 'of second %s\n' % (len1, seq_type_name))
787 standardMsg = differing + '\n' + '\n'.join(difflib.ndiff(pprint.pformat(seq1).splitlines(),
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000788 pprint.pformat(seq2).splitlines()))
789 msg = self._formatMessage(msg, standardMsg)
790 self.fail(msg)
791
792 def assertListEqual(self, list1, list2, msg=None):
793 """A list-specific equality assertion.
794
795 Args:
796 list1: The first list to compare.
797 list2: The second list to compare.
798 msg: Optional message to use on failure instead of a list of
799 differences.
800
801 """
802 self.assertSequenceEqual(list1, list2, msg, seq_type=list)
803
804 def assertTupleEqual(self, tuple1, tuple2, msg=None):
805 """A tuple-specific equality assertion.
806
807 Args:
808 tuple1: The first tuple to compare.
809 tuple2: The second tuple to compare.
810 msg: Optional message to use on failure instead of a list of
811 differences.
812 """
813 self.assertSequenceEqual(tuple1, tuple2, msg, seq_type=tuple)
814
815 def assertSetEqual(self, set1, set2, msg=None):
816 """A set-specific equality assertion.
817
818 Args:
819 set1: The first set to compare.
820 set2: The second set to compare.
821 msg: Optional message to use on failure instead of a list of
822 differences.
823
824 For more general containership equality, assertSameElements will work
825 with things other than sets. This uses ducktyping to support
826 different types of sets, and is optimized for sets specifically
827 (parameters must support a difference method).
828 """
829 try:
830 difference1 = set1.difference(set2)
831 except TypeError as e:
832 self.fail('invalid type when attempting set difference: %s' % e)
833 except AttributeError as e:
834 self.fail('first argument does not support set difference: %s' % e)
835
836 try:
837 difference2 = set2.difference(set1)
838 except TypeError as e:
839 self.fail('invalid type when attempting set difference: %s' % e)
840 except AttributeError as e:
841 self.fail('second argument does not support set difference: %s' % e)
842
843 if not (difference1 or difference2):
844 return
845
846 lines = []
847 if difference1:
848 lines.append('Items in the first set but not the second:')
849 for item in difference1:
850 lines.append(repr(item))
851 if difference2:
852 lines.append('Items in the second set but not the first:')
853 for item in difference2:
854 lines.append(repr(item))
855
856 standardMsg = '\n'.join(lines)
857 self.fail(self._formatMessage(msg, standardMsg))
858
859 def assertIn(self, member, container, msg=None):
860 """Just like self.assertTrue(a in b), but with a nicer default message."""
861 if member not in container:
862 standardMsg = '%r not found in %r' % (member, container)
863 self.fail(self._formatMessage(msg, standardMsg))
864
865 def assertNotIn(self, member, container, msg=None):
866 """Just like self.assertTrue(a not in b), but with a nicer default message."""
867 if member in container:
868 standardMsg = '%r unexpectedly found in %r' % (member, container)
869 self.fail(self._formatMessage(msg, standardMsg))
870
Benjamin Petersonf47ed4a2009-04-11 20:45:40 +0000871 def assertIs(self, expr1, expr2, msg=None):
872 """Just like self.assertTrue(a is b), but with a nicer default message."""
873 if expr1 is not expr2:
874 standardMsg = '%r is not %r' % (expr1, expr2)
875 self.fail(self._formatMessage(msg, standardMsg))
876
877 def assertIsNot(self, expr1, expr2, msg=None):
878 """Just like self.assertTrue(a is not b), but with a nicer default message."""
879 if expr1 is expr2:
880 standardMsg = 'unexpectedly identical: %r' % (expr1,)
881 self.fail(self._formatMessage(msg, standardMsg))
882
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000883 def assertDictEqual(self, d1, d2, msg=None):
884 self.assert_(isinstance(d1, dict), 'First argument is not a dictionary')
885 self.assert_(isinstance(d2, dict), 'Second argument is not a dictionary')
886
887 if d1 != d2:
888 standardMsg = ('\n' + '\n'.join(difflib.ndiff(
889 pprint.pformat(d1).splitlines(),
890 pprint.pformat(d2).splitlines())))
891 self.fail(self._formatMessage(msg, standardMsg))
892
893 def assertDictContainsSubset(self, expected, actual, msg=None):
894 """Checks whether actual is a superset of expected."""
895 missing = []
896 mismatched = []
897 for key, value in expected.items():
898 if key not in actual:
899 missing.append(key)
900 elif value != actual[key]:
901 mismatched.append('%s, expected: %s, actual: %s' % (key, value, actual[key]))
902
903 if not (missing or mismatched):
904 return
905
906 standardMsg = ''
907 if missing:
908 standardMsg = 'Missing: %r' % ','.join(missing)
909 if mismatched:
910 if standardMsg:
911 standardMsg += '; '
912 standardMsg += 'Mismatched values: %s' % ','.join(mismatched)
913
914 self.fail(self._formatMessage(msg, standardMsg))
915
916 def assertSameElements(self, expected_seq, actual_seq, msg=None):
917 """An unordered sequence specific comparison.
918
919 Raises with an error message listing which elements of expected_seq
920 are missing from actual_seq and vice versa if any.
921 """
922 try:
923 expected = set(expected_seq)
924 actual = set(actual_seq)
925 missing = list(expected.difference(actual))
926 unexpected = list(actual.difference(expected))
927 missing.sort()
928 unexpected.sort()
929 except TypeError:
930 # Fall back to slower list-compare if any of the objects are
931 # not hashable.
932 expected = list(expected_seq)
933 actual = list(actual_seq)
Michael Foorda5809c82009-04-04 18:55:09 +0000934 try:
935 expected.sort()
936 actual.sort()
937 except TypeError:
938 missing, unexpected = _UnorderableListDifference(expected, actual)
939 else:
940 missing, unexpected = _SortedListDifference(expected, actual)
Benjamin Peterson7fe73a12009-04-04 16:35:46 +0000941 errors = []
942 if missing:
943 errors.append('Expected, but missing:\n %r' % missing)
944 if unexpected:
945 errors.append('Unexpected, but present:\n %r' % unexpected)
946 if errors:
947 standardMsg = '\n'.join(errors)
948 self.fail(self._formatMessage(msg, standardMsg))
949
950 def assertMultiLineEqual(self, first, second, msg=None):
951 """Assert that two multi-line strings are equal."""
952 self.assert_(isinstance(first, str), (
953 'First argument is not a string'))
954 self.assert_(isinstance(second, str), (
955 'Second argument is not a string'))
956
957 if first != second:
958 standardMsg = '\n' + ''.join(difflib.ndiff(first.splitlines(True), second.splitlines(True)))
959 self.fail(self._formatMessage(msg, standardMsg))
960
961 def assertLess(self, a, b, msg=None):
962 """Just like self.assertTrue(a < b), but with a nicer default message."""
963 if not a < b:
964 standardMsg = '%r not less than %r' % (a, b)
965 self.fail(self._formatMessage(msg, standardMsg))
966
967 def assertLessEqual(self, a, b, msg=None):
968 """Just like self.assertTrue(a <= b), but with a nicer default message."""
969 if not a <= b:
970 standardMsg = '%r not less than or equal to %r' % (a, b)
971 self.fail(self._formatMessage(msg, standardMsg))
972
973 def assertGreater(self, a, b, msg=None):
974 """Just like self.assertTrue(a > b), but with a nicer default message."""
975 if not a > b:
976 standardMsg = '%r not greater than %r' % (a, b)
977 self.fail(self._formatMessage(msg, standardMsg))
978
979 def assertGreaterEqual(self, a, b, msg=None):
980 """Just like self.assertTrue(a >= b), but with a nicer default message."""
981 if not a >= b:
982 standardMsg = '%r not greater than or equal to %r' % (a, b)
983 self.fail(self._formatMessage(msg, standardMsg))
984
985 def assertIsNone(self, obj, msg=None):
986 """Same as self.assertTrue(obj is None), with a nicer default message."""
987 if obj is not None:
988 standardMsg = '%r is not None' % obj
989 self.fail(self._formatMessage(msg, standardMsg))
990
991 def assertIsNotNone(self, obj, msg=None):
992 """Included for symmetry with assertIsNone."""
993 if obj is None:
994 standardMsg = 'unexpectedly None'
995 self.fail(self._formatMessage(msg, standardMsg))
996
997 def assertRaisesRegexp(self, expected_exception, expected_regexp,
998 callable_obj=None, *args, **kwargs):
999 """Asserts that the message in a raised exception matches a regexp.
1000
1001 Args:
1002 expected_exception: Exception class expected to be raised.
1003 expected_regexp: Regexp (re pattern object or string) expected
1004 to be found in error message.
1005 callable_obj: Function to be called.
1006 args: Extra args.
1007 kwargs: Extra kwargs.
1008 """
1009 context = _AssertRaisesContext(expected_exception, self, callable_obj,
1010 expected_regexp)
1011 if callable_obj is None:
1012 return context
1013 with context:
1014 callable_obj(*args, **kwargs)
1015
1016 def assertRegexpMatches(self, text, expected_regex, msg=None):
1017 if isinstance(expected_regex, (str, bytes)):
1018 expected_regex = re.compile(expected_regex)
1019 if not expected_regex.search(text):
1020 msg = msg or "Regexp didn't match"
1021 msg = '%s: %r not found in %r' % (msg, expected_regex.pattern, text)
1022 raise self.failureException(msg)
1023
1024
1025def _SortedListDifference(expected, actual):
1026 """Finds elements in only one or the other of two, sorted input lists.
1027
1028 Returns a two-element tuple of lists. The first list contains those
1029 elements in the "expected" list but not in the "actual" list, and the
1030 second contains those elements in the "actual" list but not in the
1031 "expected" list. Duplicate elements in either input list are ignored.
1032 """
1033 i = j = 0
1034 missing = []
1035 unexpected = []
1036 while True:
1037 try:
1038 e = expected[i]
1039 a = actual[j]
1040 if e < a:
1041 missing.append(e)
1042 i += 1
1043 while expected[i] == e:
1044 i += 1
1045 elif e > a:
1046 unexpected.append(a)
1047 j += 1
1048 while actual[j] == a:
1049 j += 1
1050 else:
1051 i += 1
1052 try:
1053 while expected[i] == e:
1054 i += 1
1055 finally:
1056 j += 1
1057 while actual[j] == a:
1058 j += 1
1059 except IndexError:
1060 missing.extend(expected[i:])
1061 unexpected.extend(actual[j:])
1062 break
1063 return missing, unexpected
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001064
Michael Foorda5809c82009-04-04 18:55:09 +00001065def _UnorderableListDifference(expected, actual):
1066 """Same behavior as _SortedListDifference but
1067 for lists of unorderable items (like dicts).
1068
1069 As it does a linear search per item (remove) it
1070 has O(n*n) performance."""
1071 missing = []
1072 while expected:
1073 item = expected.pop()
1074 try:
1075 actual.remove(item)
1076 except ValueError:
1077 missing.append(item)
1078
1079 # anything left in actual is unexpected
1080 return missing, actual
Fred Drake02538202001-03-21 18:09:46 +00001081
Benjamin Peterson1467ac82009-01-09 03:42:38 +00001082class TestSuite(object):
Fred Drake02538202001-03-21 18:09:46 +00001083 """A test suite is a composite test consisting of a number of TestCases.
1084
1085 For use, create an instance of TestSuite, then add test case instances.
1086 When all tests have been added, the suite can be passed to a test
1087 runner, such as TextTestRunner. It will run the individual test cases
1088 in the order in which they were added, aggregating the results. When
1089 subclassing, do not forget to call the base class constructor.
1090 """
1091 def __init__(self, tests=()):
1092 self._tests = []
1093 self.addTests(tests)
1094
1095 def __repr__(self):
Benjamin Petersonf47ed4a2009-04-11 20:45:40 +00001096 return "<%s tests=%s>" % (_strclass(self.__class__), list(self))
Fred Drake02538202001-03-21 18:09:46 +00001097
Guido van Rossumd8faa362007-04-27 19:54:29 +00001098 def __eq__(self, other):
Benjamin Peterson5254c042009-03-23 22:25:03 +00001099 if not isinstance(other, self.__class__):
1100 return NotImplemented
Benjamin Peterson25c95f12009-05-08 20:42:26 +00001101 return list(self) == list(other)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001102
1103 def __ne__(self, other):
1104 return not self == other
1105
Jim Fultonfafd8742004-08-28 15:22:12 +00001106 def __iter__(self):
1107 return iter(self._tests)
1108
Fred Drake02538202001-03-21 18:09:46 +00001109 def countTestCases(self):
1110 cases = 0
Benjamin Petersonf47ed4a2009-04-11 20:45:40 +00001111 for test in self:
Steve Purcell7e743842003-09-22 11:08:12 +00001112 cases += test.countTestCases()
Fred Drake02538202001-03-21 18:09:46 +00001113 return cases
1114
1115 def addTest(self, test):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001116 # sanity checks
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001117 if not hasattr(test, '__call__'):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001118 raise TypeError("the test to add must be callable")
Guido van Rossum13257902007-06-07 23:15:56 +00001119 if isinstance(test, type) and issubclass(test, (TestCase, TestSuite)):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001120 raise TypeError("TestCases and TestSuites must be instantiated "
1121 "before passing them to addTest()")
Fred Drake02538202001-03-21 18:09:46 +00001122 self._tests.append(test)
1123
1124 def addTests(self, tests):
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001125 if isinstance(tests, str):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001126 raise TypeError("tests must be an iterable of tests, not a string")
Fred Drake02538202001-03-21 18:09:46 +00001127 for test in tests:
1128 self.addTest(test)
1129
1130 def run(self, result):
Benjamin Petersonf47ed4a2009-04-11 20:45:40 +00001131 for test in self:
Fred Drake02538202001-03-21 18:09:46 +00001132 if result.shouldStop:
1133 break
1134 test(result)
1135 return result
1136
Raymond Hettinger664347b2004-12-04 21:21:53 +00001137 def __call__(self, *args, **kwds):
1138 return self.run(*args, **kwds)
1139
Fred Drake02538202001-03-21 18:09:46 +00001140 def debug(self):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001141 """Run the tests without collecting errors in a TestResult"""
Benjamin Petersonf47ed4a2009-04-11 20:45:40 +00001142 for test in self:
Benjamin Peterson52baa292009-03-24 00:56:30 +00001143 test.debug()
Fred Drake02538202001-03-21 18:09:46 +00001144
1145
1146class FunctionTestCase(TestCase):
1147 """A test case that wraps a test function.
1148
1149 This is useful for slipping pre-existing test functions into the
Guido van Rossumd8faa362007-04-27 19:54:29 +00001150 unittest framework. Optionally, set-up and tidy-up functions can be
Fred Drake02538202001-03-21 18:09:46 +00001151 supplied. As with TestCase, the tidy-up ('tearDown') function will
1152 always be called if the set-up ('setUp') function ran successfully.
1153 """
1154
Benjamin Peterson52baa292009-03-24 00:56:30 +00001155 def __init__(self, testFunc, setUp=None, tearDown=None, description=None):
1156 super(FunctionTestCase, self).__init__()
Benjamin Peterson7fe73a12009-04-04 16:35:46 +00001157 self._setUpFunc = setUp
1158 self._tearDownFunc = tearDown
1159 self._testFunc = testFunc
1160 self._description = description
Fred Drake02538202001-03-21 18:09:46 +00001161
1162 def setUp(self):
Benjamin Peterson7fe73a12009-04-04 16:35:46 +00001163 if self._setUpFunc is not None:
1164 self._setUpFunc()
Fred Drake02538202001-03-21 18:09:46 +00001165
1166 def tearDown(self):
Benjamin Peterson7fe73a12009-04-04 16:35:46 +00001167 if self._tearDownFunc is not None:
1168 self._tearDownFunc()
Fred Drake02538202001-03-21 18:09:46 +00001169
1170 def runTest(self):
Benjamin Peterson7fe73a12009-04-04 16:35:46 +00001171 self._testFunc()
Fred Drake02538202001-03-21 18:09:46 +00001172
1173 def id(self):
Benjamin Peterson7fe73a12009-04-04 16:35:46 +00001174 return self._testFunc.__name__
Fred Drake02538202001-03-21 18:09:46 +00001175
Guido van Rossumd8faa362007-04-27 19:54:29 +00001176 def __eq__(self, other):
Benjamin Peterson52baa292009-03-24 00:56:30 +00001177 if not isinstance(other, self.__class__):
1178 return NotImplemented
Guido van Rossumd8faa362007-04-27 19:54:29 +00001179
Benjamin Peterson7fe73a12009-04-04 16:35:46 +00001180 return self._setUpFunc == other._setUpFunc and \
1181 self._tearDownFunc == other._tearDownFunc and \
1182 self._testFunc == other._testFunc and \
1183 self._description == other._description
Guido van Rossumd8faa362007-04-27 19:54:29 +00001184
1185 def __ne__(self, other):
1186 return not self == other
1187
1188 def __hash__(self):
Benjamin Peterson7fe73a12009-04-04 16:35:46 +00001189 return hash((type(self), self._setUpFunc, self._tearDownFunc,
1190 self._testFunc, self._description))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001191
Fred Drake02538202001-03-21 18:09:46 +00001192 def __str__(self):
Benjamin Peterson25c95f12009-05-08 20:42:26 +00001193 return "%s (%s)" % (_strclass(self.__class__), self._testFunc.__name__)
Fred Drake02538202001-03-21 18:09:46 +00001194
1195 def __repr__(self):
Benjamin Peterson7fe73a12009-04-04 16:35:46 +00001196 return "<%s testFunc=%s>" % (_strclass(self.__class__), self._testFunc)
Fred Drake02538202001-03-21 18:09:46 +00001197
1198 def shortDescription(self):
Benjamin Peterson7fe73a12009-04-04 16:35:46 +00001199 if self._description is not None:
1200 return self._description
1201 doc = self._testFunc.__doc__
Steve Purcell7e743842003-09-22 11:08:12 +00001202 return doc and doc.split("\n")[0].strip() or None
Fred Drake02538202001-03-21 18:09:46 +00001203
1204
1205
1206##############################################################################
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001207# Locating and loading tests
Fred Drake02538202001-03-21 18:09:46 +00001208##############################################################################
1209
Raymond Hettingerd4cb56d2008-01-30 02:55:10 +00001210def CmpToKey(mycmp):
1211 'Convert a cmp= function into a key= function'
1212 class K(object):
1213 def __init__(self, obj, *args):
1214 self.obj = obj
1215 def __lt__(self, other):
1216 return mycmp(self.obj, other.obj) == -1
1217 return K
1218
Mark Dickinsona56c4672009-01-27 18:17:45 +00001219def three_way_cmp(x, y):
1220 """Return -1 if x < y, 0 if x == y and 1 if x > y"""
1221 return (x > y) - (x < y)
1222
Benjamin Peterson1467ac82009-01-09 03:42:38 +00001223class TestLoader(object):
Benjamin Peterson52baa292009-03-24 00:56:30 +00001224 """
1225 This class is responsible for loading tests according to various criteria
1226 and returning them wrapped in a TestSuite
Fred Drake02538202001-03-21 18:09:46 +00001227 """
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001228 testMethodPrefix = 'test'
Mark Dickinsona56c4672009-01-27 18:17:45 +00001229 sortTestMethodsUsing = staticmethod(three_way_cmp)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001230 suiteClass = TestSuite
Fred Drake02538202001-03-21 18:09:46 +00001231
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001232 def loadTestsFromTestCase(self, testCaseClass):
Steve Purcell15d89272001-04-12 09:05:01 +00001233 """Return a suite of all tests cases contained in testCaseClass"""
Johannes Gijsbersd7b6ad42004-11-07 15:46:25 +00001234 if issubclass(testCaseClass, TestSuite):
Benjamin Peterson52baa292009-03-24 00:56:30 +00001235 raise TypeError("Test cases should not be derived from TestSuite." \
1236 " Maybe you meant to derive from TestCase?")
Steve Purcell7e743842003-09-22 11:08:12 +00001237 testCaseNames = self.getTestCaseNames(testCaseClass)
1238 if not testCaseNames and hasattr(testCaseClass, 'runTest'):
1239 testCaseNames = ['runTest']
Benjamin Peterson14a3dd72009-05-25 00:51:58 +00001240 suite = self.suiteClass(map(testCaseClass, testCaseNames))
Benjamin Peterson5254c042009-03-23 22:25:03 +00001241 return suite
Fred Drake02538202001-03-21 18:09:46 +00001242
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001243 def loadTestsFromModule(self, module):
Steve Purcell15d89272001-04-12 09:05:01 +00001244 """Return a suite of all tests cases contained in the given module"""
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001245 tests = []
1246 for name in dir(module):
1247 obj = getattr(module, name)
Guido van Rossum13257902007-06-07 23:15:56 +00001248 if isinstance(obj, type) and issubclass(obj, TestCase):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001249 tests.append(self.loadTestsFromTestCase(obj))
1250 return self.suiteClass(tests)
Fred Drake02538202001-03-21 18:09:46 +00001251
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001252 def loadTestsFromName(self, name, module=None):
Steve Purcell15d89272001-04-12 09:05:01 +00001253 """Return a suite of all tests cases given a string specifier.
1254
1255 The name may resolve either to a module, a test case class, a
1256 test method within a test case class, or a callable object which
1257 returns a TestCase or TestSuite instance.
Tim Peters613b2222001-04-13 05:37:27 +00001258
Steve Purcell15d89272001-04-12 09:05:01 +00001259 The method optionally resolves the names relative to a given module.
1260 """
Steve Purcell7e743842003-09-22 11:08:12 +00001261 parts = name.split('.')
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001262 if module is None:
Steve Purcell7e743842003-09-22 11:08:12 +00001263 parts_copy = parts[:]
1264 while parts_copy:
1265 try:
1266 module = __import__('.'.join(parts_copy))
1267 break
1268 except ImportError:
1269 del parts_copy[-1]
Benjamin Peterson52baa292009-03-24 00:56:30 +00001270 if not parts_copy:
1271 raise
Armin Rigo1b3c04b2003-10-24 17:15:29 +00001272 parts = parts[1:]
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001273 obj = module
1274 for part in parts:
Steve Purcell7e743842003-09-22 11:08:12 +00001275 parent, obj = obj, getattr(obj, part)
Fred Drake02538202001-03-21 18:09:46 +00001276
Benjamin Peterson1467ac82009-01-09 03:42:38 +00001277 if isinstance(obj, types.ModuleType):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001278 return self.loadTestsFromModule(obj)
Guido van Rossum13257902007-06-07 23:15:56 +00001279 elif isinstance(obj, type) and issubclass(obj, TestCase):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001280 return self.loadTestsFromTestCase(obj)
Christian Heimes4a22b5d2007-11-25 09:39:14 +00001281 elif (isinstance(obj, types.FunctionType) and
Guido van Rossum13257902007-06-07 23:15:56 +00001282 isinstance(parent, type) and
Guido van Rossumd8faa362007-04-27 19:54:29 +00001283 issubclass(parent, TestCase)):
Christian Heimes4a22b5d2007-11-25 09:39:14 +00001284 name = obj.__name__
1285 inst = parent(name)
1286 # static methods follow a different path
Christian Heimes4975a1f2007-11-26 10:14:51 +00001287 if not isinstance(getattr(inst, name), types.FunctionType):
Christian Heimes4a22b5d2007-11-25 09:39:14 +00001288 return TestSuite([inst])
Steve Purcell397b45d2003-10-26 10:41:03 +00001289 elif isinstance(obj, TestSuite):
Steve Purcell7e743842003-09-22 11:08:12 +00001290 return obj
Christian Heimes4a22b5d2007-11-25 09:39:14 +00001291
1292 if hasattr(obj, '__call__'):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001293 test = obj()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001294 if isinstance(test, TestSuite):
1295 return test
1296 elif isinstance(test, TestCase):
1297 return TestSuite([test])
1298 else:
1299 raise TypeError("calling %s returned %s, not a test" %
1300 (obj, test))
Fred Drake02538202001-03-21 18:09:46 +00001301 else:
Guido van Rossumd8faa362007-04-27 19:54:29 +00001302 raise TypeError("don't know how to make test from: %s" % obj)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001303
1304 def loadTestsFromNames(self, names, module=None):
Steve Purcell15d89272001-04-12 09:05:01 +00001305 """Return a suite of all tests cases found using the given sequence
1306 of string specifiers. See 'loadTestsFromName()'.
1307 """
Steve Purcell7e743842003-09-22 11:08:12 +00001308 suites = [self.loadTestsFromName(name, module) for name in names]
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001309 return self.suiteClass(suites)
1310
1311 def getTestCaseNames(self, testCaseClass):
Steve Purcell15d89272001-04-12 09:05:01 +00001312 """Return a sorted sequence of method names found within testCaseClass
1313 """
Collin Winterce36ad82007-08-30 01:19:48 +00001314 def isTestMethod(attrname, testCaseClass=testCaseClass,
1315 prefix=self.testMethodPrefix):
Benjamin Peterson52baa292009-03-24 00:56:30 +00001316 return attrname.startswith(prefix) and \
1317 hasattr(getattr(testCaseClass, attrname), '__call__')
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001318 testFnNames = list(filter(isTestMethod, dir(testCaseClass)))
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001319 if self.sortTestMethodsUsing:
Raymond Hettingerd4cb56d2008-01-30 02:55:10 +00001320 testFnNames.sort(key=CmpToKey(self.sortTestMethodsUsing))
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001321 return testFnNames
1322
1323
1324
1325defaultTestLoader = TestLoader()
1326
1327
1328##############################################################################
1329# Patches for old functions: these functions should be considered obsolete
1330##############################################################################
1331
1332def _makeLoader(prefix, sortUsing, suiteClass=None):
1333 loader = TestLoader()
1334 loader.sortTestMethodsUsing = sortUsing
1335 loader.testMethodPrefix = prefix
1336 if suiteClass: loader.suiteClass = suiteClass
1337 return loader
1338
Mark Dickinsonc429a832009-01-27 20:27:05 +00001339def getTestCaseNames(testCaseClass, prefix, sortUsing=three_way_cmp):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001340 return _makeLoader(prefix, sortUsing).getTestCaseNames(testCaseClass)
1341
Mark Dickinsonc429a832009-01-27 20:27:05 +00001342def makeSuite(testCaseClass, prefix='test', sortUsing=three_way_cmp,
1343 suiteClass=TestSuite):
1344 return _makeLoader(prefix, sortUsing, suiteClass).loadTestsFromTestCase(
1345 testCaseClass)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001346
Mark Dickinsonc429a832009-01-27 20:27:05 +00001347def findTestCases(module, prefix='test', sortUsing=three_way_cmp,
1348 suiteClass=TestSuite):
1349 return _makeLoader(prefix, sortUsing, suiteClass).loadTestsFromModule(
1350 module)
Fred Drake02538202001-03-21 18:09:46 +00001351
1352
1353##############################################################################
1354# Text UI
1355##############################################################################
1356
Benjamin Peterson1467ac82009-01-09 03:42:38 +00001357class _WritelnDecorator(object):
Fred Drake02538202001-03-21 18:09:46 +00001358 """Used to decorate file-like objects with a handy 'writeln' method"""
1359 def __init__(self,stream):
1360 self.stream = stream
Fred Drake02538202001-03-21 18:09:46 +00001361
1362 def __getattr__(self, attr):
1363 return getattr(self.stream,attr)
1364
Raymond Hettinger91dd19d2003-09-13 02:58:00 +00001365 def writeln(self, arg=None):
Benjamin Petersone549ead2009-03-28 21:42:05 +00001366 if arg:
1367 self.write(arg)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001368 self.write('\n') # text-mode streams translate to \r\n if needed
Tim Petersa19a1682001-03-29 04:36:09 +00001369
Fred Drake02538202001-03-21 18:09:46 +00001370
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001371class _TextTestResult(TestResult):
Fred Drake02538202001-03-21 18:09:46 +00001372 """A test result class that can print formatted text results to a stream.
1373
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001374 Used by TextTestRunner.
Fred Drake02538202001-03-21 18:09:46 +00001375 """
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001376 separator1 = '=' * 70
1377 separator2 = '-' * 70
Fred Drake02538202001-03-21 18:09:46 +00001378
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001379 def __init__(self, stream, descriptions, verbosity):
Benjamin Peterson52baa292009-03-24 00:56:30 +00001380 super(_TextTestResult, self).__init__()
Fred Drake02538202001-03-21 18:09:46 +00001381 self.stream = stream
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001382 self.showAll = verbosity > 1
1383 self.dots = verbosity == 1
Fred Drake02538202001-03-21 18:09:46 +00001384 self.descriptions = descriptions
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001385
1386 def getDescription(self, test):
1387 if self.descriptions:
1388 return test.shortDescription() or str(test)
1389 else:
1390 return str(test)
1391
Fred Drake02538202001-03-21 18:09:46 +00001392 def startTest(self, test):
Benjamin Peterson52baa292009-03-24 00:56:30 +00001393 super(_TextTestResult, self).startTest(test)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001394 if self.showAll:
1395 self.stream.write(self.getDescription(test))
1396 self.stream.write(" ... ")
Alexandre Vassalotti8ae3e052008-05-16 00:41:41 +00001397 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +00001398
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001399 def addSuccess(self, test):
Benjamin Peterson52baa292009-03-24 00:56:30 +00001400 super(_TextTestResult, self).addSuccess(test)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001401 if self.showAll:
Fred Drake02538202001-03-21 18:09:46 +00001402 self.stream.writeln("ok")
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001403 elif self.dots:
1404 self.stream.write('.')
Alexandre Vassalotti8ae3e052008-05-16 00:41:41 +00001405 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +00001406
1407 def addError(self, test, err):
Benjamin Peterson52baa292009-03-24 00:56:30 +00001408 super(_TextTestResult, self).addError(test, err)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001409 if self.showAll:
1410 self.stream.writeln("ERROR")
1411 elif self.dots:
1412 self.stream.write('E')
Alexandre Vassalotti8ae3e052008-05-16 00:41:41 +00001413 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +00001414
1415 def addFailure(self, test, err):
Benjamin Peterson52baa292009-03-24 00:56:30 +00001416 super(_TextTestResult, self).addFailure(test, err)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001417 if self.showAll:
1418 self.stream.writeln("FAIL")
1419 elif self.dots:
1420 self.stream.write('F')
Alexandre Vassalotti8ae3e052008-05-16 00:41:41 +00001421 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +00001422
Benjamin Peterson5254c042009-03-23 22:25:03 +00001423 def addSkip(self, test, reason):
Benjamin Peterson52baa292009-03-24 00:56:30 +00001424 super(_TextTestResult, self).addSkip(test, reason)
Benjamin Peterson5254c042009-03-23 22:25:03 +00001425 if self.showAll:
1426 self.stream.writeln("skipped {0!r}".format(reason))
1427 elif self.dots:
1428 self.stream.write("s")
1429 self.stream.flush()
1430
1431 def addExpectedFailure(self, test, err):
Benjamin Peterson52baa292009-03-24 00:56:30 +00001432 super(_TextTestResult, self).addExpectedFailure(test, err)
Benjamin Peterson5254c042009-03-23 22:25:03 +00001433 if self.showAll:
1434 self.stream.writeln("expected failure")
1435 elif self.dots:
Benjamin Petersone549ead2009-03-28 21:42:05 +00001436 self.stream.write("x")
Benjamin Peterson5254c042009-03-23 22:25:03 +00001437 self.stream.flush()
1438
1439 def addUnexpectedSuccess(self, test):
Benjamin Peterson52baa292009-03-24 00:56:30 +00001440 super(_TextTestResult, self).addUnexpectedSuccess(test)
Benjamin Peterson5254c042009-03-23 22:25:03 +00001441 if self.showAll:
1442 self.stream.writeln("unexpected success")
1443 elif self.dots:
Benjamin Petersone549ead2009-03-28 21:42:05 +00001444 self.stream.write("u")
Benjamin Peterson5254c042009-03-23 22:25:03 +00001445 self.stream.flush()
1446
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001447 def printErrors(self):
1448 if self.dots or self.showAll:
Fred Drake02538202001-03-21 18:09:46 +00001449 self.stream.writeln()
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001450 self.printErrorList('ERROR', self.errors)
1451 self.printErrorList('FAIL', self.failures)
1452
1453 def printErrorList(self, flavour, errors):
1454 for test, err in errors:
1455 self.stream.writeln(self.separator1)
1456 self.stream.writeln("%s: %s" % (flavour,self.getDescription(test)))
1457 self.stream.writeln(self.separator2)
Steve Purcell7b065702001-09-06 08:24:40 +00001458 self.stream.writeln("%s" % err)
Fred Drake02538202001-03-21 18:09:46 +00001459
1460
Benjamin Peterson1467ac82009-01-09 03:42:38 +00001461class TextTestRunner(object):
Fred Drake02538202001-03-21 18:09:46 +00001462 """A test runner class that displays results in textual form.
Tim Petersa19a1682001-03-29 04:36:09 +00001463
Fred Drake02538202001-03-21 18:09:46 +00001464 It prints out the names of tests as they are run, errors as they
1465 occur, and a summary of the results at the end of the test run.
1466 """
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001467 def __init__(self, stream=sys.stderr, descriptions=1, verbosity=1):
Fred Drake02538202001-03-21 18:09:46 +00001468 self.stream = _WritelnDecorator(stream)
1469 self.descriptions = descriptions
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001470 self.verbosity = verbosity
1471
1472 def _makeResult(self):
1473 return _TextTestResult(self.stream, self.descriptions, self.verbosity)
Fred Drake02538202001-03-21 18:09:46 +00001474
1475 def run(self, test):
1476 "Run the given test case or test suite."
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001477 result = self._makeResult()
Fred Drake02538202001-03-21 18:09:46 +00001478 startTime = time.time()
Benjamin Peterson25c95f12009-05-08 20:42:26 +00001479 startTestRun = getattr(result, 'startTestRun', None)
1480 if startTestRun is not None:
1481 startTestRun()
1482 try:
1483 test(result)
1484 finally:
1485 stopTestRun = getattr(result, 'stopTestRun', None)
1486 if stopTestRun is not None:
1487 stopTestRun()
Fred Drake02538202001-03-21 18:09:46 +00001488 stopTime = time.time()
Steve Purcell397b45d2003-10-26 10:41:03 +00001489 timeTaken = stopTime - startTime
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001490 result.printErrors()
1491 self.stream.writeln(result.separator2)
Fred Drake02538202001-03-21 18:09:46 +00001492 run = result.testsRun
1493 self.stream.writeln("Ran %d test%s in %.3fs" %
Neal Norwitz76165042002-05-31 14:15:11 +00001494 (run, run != 1 and "s" or "", timeTaken))
Fred Drake02538202001-03-21 18:09:46 +00001495 self.stream.writeln()
Benjamin Peterson52baa292009-03-24 00:56:30 +00001496 results = map(len, (result.expectedFailures,
1497 result.unexpectedSuccesses,
Benjamin Peterson5254c042009-03-23 22:25:03 +00001498 result.skipped))
Benjamin Peterson52baa292009-03-24 00:56:30 +00001499 expectedFails, unexpectedSuccesses, skipped = results
Benjamin Peterson5254c042009-03-23 22:25:03 +00001500 infos = []
Fred Drake02538202001-03-21 18:09:46 +00001501 if not result.wasSuccessful():
Benjamin Peterson5254c042009-03-23 22:25:03 +00001502 self.stream.write("FAILED")
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001503 failed, errored = len(result.failures), len(result.errors)
Fred Drake02538202001-03-21 18:09:46 +00001504 if failed:
Benjamin Peterson5254c042009-03-23 22:25:03 +00001505 infos.append("failures=%d" % failed)
Fred Drake02538202001-03-21 18:09:46 +00001506 if errored:
Benjamin Peterson5254c042009-03-23 22:25:03 +00001507 infos.append("errors=%d" % errored)
Fred Drake02538202001-03-21 18:09:46 +00001508 else:
Benjamin Petersone549ead2009-03-28 21:42:05 +00001509 self.stream.write("OK")
Benjamin Peterson5254c042009-03-23 22:25:03 +00001510 if skipped:
1511 infos.append("skipped=%d" % skipped)
Benjamin Peterson52baa292009-03-24 00:56:30 +00001512 if expectedFails:
1513 infos.append("expected failures=%d" % expectedFails)
1514 if unexpectedSuccesses:
1515 infos.append("unexpected successes=%d" % unexpectedSuccesses)
Benjamin Peterson5254c042009-03-23 22:25:03 +00001516 if infos:
1517 self.stream.writeln(" (%s)" % (", ".join(infos),))
Benjamin Petersone549ead2009-03-28 21:42:05 +00001518 else:
1519 self.stream.write("\n")
Fred Drake02538202001-03-21 18:09:46 +00001520 return result
Tim Petersa19a1682001-03-29 04:36:09 +00001521
Fred Drake02538202001-03-21 18:09:46 +00001522
Fred Drake02538202001-03-21 18:09:46 +00001523
1524##############################################################################
1525# Facilities for running tests from the command line
1526##############################################################################
1527
Benjamin Peterson1467ac82009-01-09 03:42:38 +00001528class TestProgram(object):
Fred Drake02538202001-03-21 18:09:46 +00001529 """A command-line program that runs a set of tests; this is primarily
1530 for making test modules conveniently executable.
1531 """
1532 USAGE = """\
Steve Purcell17a781b2001-04-09 15:37:31 +00001533Usage: %(progName)s [options] [test] [...]
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001534
1535Options:
1536 -h, --help Show this message
1537 -v, --verbose Verbose output
1538 -q, --quiet Minimal output
Fred Drake02538202001-03-21 18:09:46 +00001539
1540Examples:
1541 %(progName)s - run default set of tests
1542 %(progName)s MyTestSuite - run suite 'MyTestSuite'
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001543 %(progName)s MyTestCase.testSomething - run MyTestCase.testSomething
1544 %(progName)s MyTestCase - run all 'test*' test methods
Fred Drake02538202001-03-21 18:09:46 +00001545 in MyTestCase
1546"""
1547 def __init__(self, module='__main__', defaultTest=None,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001548 argv=None, testRunner=TextTestRunner,
Benjamin Peterson25c95f12009-05-08 20:42:26 +00001549 testLoader=defaultTestLoader, exit=True):
Antoine Pitroue7bd8682009-01-09 19:29:16 +00001550 if isinstance(module, str):
Fred Drake02538202001-03-21 18:09:46 +00001551 self.module = __import__(module)
Steve Purcell7e743842003-09-22 11:08:12 +00001552 for part in module.split('.')[1:]:
Fred Drake02538202001-03-21 18:09:46 +00001553 self.module = getattr(self.module, part)
1554 else:
1555 self.module = module
1556 if argv is None:
1557 argv = sys.argv
Benjamin Peterson25c95f12009-05-08 20:42:26 +00001558
1559 self.exit = exit
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001560 self.verbosity = 1
Fred Drake02538202001-03-21 18:09:46 +00001561 self.defaultTest = defaultTest
1562 self.testRunner = testRunner
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001563 self.testLoader = testLoader
Fred Drake02538202001-03-21 18:09:46 +00001564 self.progName = os.path.basename(argv[0])
1565 self.parseArgs(argv)
Fred Drake02538202001-03-21 18:09:46 +00001566 self.runTests()
1567
1568 def usageExit(self, msg=None):
Benjamin Peterson52baa292009-03-24 00:56:30 +00001569 if msg:
1570 print(msg)
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001571 print(self.USAGE % self.__dict__)
Fred Drake02538202001-03-21 18:09:46 +00001572 sys.exit(2)
1573
1574 def parseArgs(self, argv):
1575 import getopt
Benjamin Peterson5254c042009-03-23 22:25:03 +00001576 long_opts = ['help','verbose','quiet']
Fred Drake02538202001-03-21 18:09:46 +00001577 try:
Benjamin Peterson5254c042009-03-23 22:25:03 +00001578 options, args = getopt.getopt(argv[1:], 'hHvq', long_opts)
Fred Drake02538202001-03-21 18:09:46 +00001579 for opt, value in options:
1580 if opt in ('-h','-H','--help'):
1581 self.usageExit()
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001582 if opt in ('-q','--quiet'):
1583 self.verbosity = 0
1584 if opt in ('-v','--verbose'):
1585 self.verbosity = 2
Fred Drake02538202001-03-21 18:09:46 +00001586 if len(args) == 0 and self.defaultTest is None:
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001587 self.test = self.testLoader.loadTestsFromModule(self.module)
1588 return
Fred Drake02538202001-03-21 18:09:46 +00001589 if len(args) > 0:
1590 self.testNames = args
1591 else:
1592 self.testNames = (self.defaultTest,)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001593 self.createTests()
Guido van Rossumb940e112007-01-10 16:19:56 +00001594 except getopt.error as msg:
Fred Drake02538202001-03-21 18:09:46 +00001595 self.usageExit(msg)
1596
1597 def createTests(self):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001598 self.test = self.testLoader.loadTestsFromNames(self.testNames,
1599 self.module)
Fred Drake02538202001-03-21 18:09:46 +00001600
1601 def runTests(self):
Guido van Rossum13257902007-06-07 23:15:56 +00001602 if isinstance(self.testRunner, type):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001603 try:
1604 testRunner = self.testRunner(verbosity=self.verbosity)
1605 except TypeError:
1606 # didn't accept the verbosity argument
1607 testRunner = self.testRunner()
1608 else:
1609 # it is assumed to be a TestRunner instance
1610 testRunner = self.testRunner
Benjamin Peterson25c95f12009-05-08 20:42:26 +00001611 self.result = testRunner.run(self.test)
1612 if self.exit:
1613 sys.exit(not self.result.wasSuccessful())
Fred Drake02538202001-03-21 18:09:46 +00001614
1615main = TestProgram
1616
1617
1618##############################################################################
1619# Executing this module from the command line
1620##############################################################################
1621
1622if __name__ == "__main__":
1623 main(module=None)