blob: 87fb02bd2ef0074d4b8177b1c6a6d6be64b9cfcf [file] [log] [blame]
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001"""Test case implementation"""
2
3import sys
4import functools
5import difflib
Antoine Pitrou0715b9f2013-09-14 19:45:47 +02006import logging
Benjamin Petersonbed7d042009-07-19 21:01:52 +00007import pprint
8import re
9import warnings
Raymond Hettinger6e165b32010-11-27 09:31:37 +000010import collections
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010011import contextlib
Benjamin Petersonbed7d042009-07-19 21:01:52 +000012
Benjamin Peterson847a4112010-03-14 15:04:17 +000013from . import result
Florent Xiclunac53ae582011-11-04 08:25:54 +010014from .util import (strclass, safe_repr, _count_diff_all_purpose,
Serhiy Storchaka77622f52013-09-23 23:07:00 +030015 _count_diff_hashable, _common_shorten_repr)
Benjamin Petersonbed7d042009-07-19 21:01:52 +000016
Benjamin Petersondccc1fc2010-03-22 00:15:53 +000017__unittest = True
Benjamin Petersonbed7d042009-07-19 21:01:52 +000018
Michael Foord9dad32e2010-06-05 13:49:56 +000019
20DIFF_OMITTED = ('\nDiff is %s characters long. '
21 'Set self.maxDiff to None to see it.')
22
Benjamin Petersonbed7d042009-07-19 21:01:52 +000023class SkipTest(Exception):
24 """
25 Raise this exception in a test to skip it.
26
Ezio Melotti265281a2013-03-27 20:11:55 +020027 Usually you can use TestCase.skipTest() or one of the skipping decorators
Benjamin Petersonbed7d042009-07-19 21:01:52 +000028 instead of raising this directly.
29 """
Benjamin Petersonbed7d042009-07-19 21:01:52 +000030
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010031class _ShouldStop(Exception):
Benjamin Petersonbed7d042009-07-19 21:01:52 +000032 """
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010033 The test should stop.
Benjamin Petersonbed7d042009-07-19 21:01:52 +000034 """
35
Benjamin Petersonbed7d042009-07-19 21:01:52 +000036class _UnexpectedSuccess(Exception):
37 """
38 The test was supposed to fail, but it didn't!
39 """
Michael Foordb3468f72010-12-19 03:19:47 +000040
41
42class _Outcome(object):
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010043 def __init__(self, result=None):
44 self.expecting_failure = False
45 self.result = result
46 self.result_supports_subtests = hasattr(result, "addSubTest")
Michael Foordb3468f72010-12-19 03:19:47 +000047 self.success = True
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010048 self.skipped = []
Michael Foordb3468f72010-12-19 03:19:47 +000049 self.expectedFailure = None
50 self.errors = []
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010051
52 @contextlib.contextmanager
53 def testPartExecutor(self, test_case, isTest=False):
54 old_success = self.success
55 self.success = True
56 try:
57 yield
58 except KeyboardInterrupt:
59 raise
60 except SkipTest as e:
61 self.success = False
62 self.skipped.append((test_case, str(e)))
63 except _ShouldStop:
64 pass
65 except:
66 exc_info = sys.exc_info()
67 if self.expecting_failure:
68 self.expectedFailure = exc_info
69 else:
70 self.success = False
71 self.errors.append((test_case, exc_info))
Victor Stinner031bd532013-12-09 01:52:50 +010072 # explicitly break a reference cycle:
73 # exc_info -> frame -> exc_info
74 exc_info = None
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +010075 else:
76 if self.result_supports_subtests and self.success:
77 self.errors.append((test_case, None))
78 finally:
79 self.success = self.success and old_success
Michael Foordb3468f72010-12-19 03:19:47 +000080
Benjamin Petersonbed7d042009-07-19 21:01:52 +000081
82def _id(obj):
83 return obj
84
85def skip(reason):
86 """
87 Unconditionally skip a test.
88 """
89 def decorator(test_item):
Antoine Pitroub05ac862012-04-25 14:56:46 +020090 if not isinstance(test_item, type):
Benjamin Peterson847a4112010-03-14 15:04:17 +000091 @functools.wraps(test_item)
92 def skip_wrapper(*args, **kwargs):
93 raise SkipTest(reason)
94 test_item = skip_wrapper
95
96 test_item.__unittest_skip__ = True
97 test_item.__unittest_skip_why__ = reason
98 return test_item
Benjamin Petersonbed7d042009-07-19 21:01:52 +000099 return decorator
100
101def skipIf(condition, reason):
102 """
103 Skip a test if the condition is true.
104 """
105 if condition:
106 return skip(reason)
107 return _id
108
109def skipUnless(condition, reason):
110 """
111 Skip a test unless the condition is true.
112 """
113 if not condition:
114 return skip(reason)
115 return _id
116
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100117def expectedFailure(test_item):
118 test_item.__unittest_expecting_failure__ = True
119 return test_item
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000120
121
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200122class _BaseTestCaseContext:
123
124 def __init__(self, test_case):
125 self.test_case = test_case
126
127 def _raiseFailure(self, standardMsg):
128 msg = self.test_case._formatMessage(self.msg, standardMsg)
129 raise self.test_case.failureException(msg)
130
131
132class _AssertRaisesBaseContext(_BaseTestCaseContext):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000133
134 def __init__(self, expected, test_case, callable_obj=None,
Ezio Melottib4dc2502011-05-06 15:01:41 +0300135 expected_regex=None):
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200136 _BaseTestCaseContext.__init__(self, test_case)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000137 self.expected = expected
Ezio Melottib4dc2502011-05-06 15:01:41 +0300138 self.test_case = test_case
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000139 if callable_obj is not None:
140 try:
141 self.obj_name = callable_obj.__name__
142 except AttributeError:
143 self.obj_name = str(callable_obj)
144 else:
145 self.obj_name = None
Ezio Melottied3a7d22010-12-01 02:32:32 +0000146 if isinstance(expected_regex, (bytes, str)):
147 expected_regex = re.compile(expected_regex)
148 self.expected_regex = expected_regex
Ezio Melottib4dc2502011-05-06 15:01:41 +0300149 self.msg = None
150
Ezio Melottib4dc2502011-05-06 15:01:41 +0300151 def handle(self, name, callable_obj, args, kwargs):
152 """
153 If callable_obj is None, assertRaises/Warns is being used as a
154 context manager, so check for a 'msg' kwarg and return self.
155 If callable_obj is not None, call it passing args and kwargs.
156 """
157 if callable_obj is None:
158 self.msg = kwargs.pop('msg', None)
159 return self
160 with self:
161 callable_obj(*args, **kwargs)
162
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000163
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000164class _AssertRaisesContext(_AssertRaisesBaseContext):
165 """A context manager used to implement TestCase.assertRaises* methods."""
166
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000167 def __enter__(self):
Ezio Melotti49008232010-02-08 21:57:48 +0000168 return self
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000169
170 def __exit__(self, exc_type, exc_value, tb):
171 if exc_type is None:
172 try:
173 exc_name = self.expected.__name__
174 except AttributeError:
175 exc_name = str(self.expected)
176 if self.obj_name:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300177 self._raiseFailure("{} not raised by {}".format(exc_name,
178 self.obj_name))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000179 else:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300180 self._raiseFailure("{} not raised".format(exc_name))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000181 if not issubclass(exc_type, self.expected):
182 # let unexpected exceptions pass through
183 return False
Ezio Melotti49008232010-02-08 21:57:48 +0000184 # store exception, without traceback, for later retrieval
185 self.exception = exc_value.with_traceback(None)
Ezio Melottied3a7d22010-12-01 02:32:32 +0000186 if self.expected_regex is None:
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000187 return True
188
Ezio Melottied3a7d22010-12-01 02:32:32 +0000189 expected_regex = self.expected_regex
190 if not expected_regex.search(str(exc_value)):
Ezio Melottib4dc2502011-05-06 15:01:41 +0300191 self._raiseFailure('"{}" does not match "{}"'.format(
192 expected_regex.pattern, str(exc_value)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000193 return True
194
195
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000196class _AssertWarnsContext(_AssertRaisesBaseContext):
197 """A context manager used to implement TestCase.assertWarns* methods."""
198
199 def __enter__(self):
200 # The __warningregistry__'s need to be in a pristine state for tests
201 # to work properly.
202 for v in sys.modules.values():
203 if getattr(v, '__warningregistry__', None):
204 v.__warningregistry__ = {}
205 self.warnings_manager = warnings.catch_warnings(record=True)
206 self.warnings = self.warnings_manager.__enter__()
207 warnings.simplefilter("always", self.expected)
208 return self
209
210 def __exit__(self, exc_type, exc_value, tb):
211 self.warnings_manager.__exit__(exc_type, exc_value, tb)
212 if exc_type is not None:
213 # let unexpected exceptions pass through
214 return
215 try:
216 exc_name = self.expected.__name__
217 except AttributeError:
218 exc_name = str(self.expected)
219 first_matching = None
220 for m in self.warnings:
221 w = m.message
222 if not isinstance(w, self.expected):
223 continue
224 if first_matching is None:
225 first_matching = w
Ezio Melottied3a7d22010-12-01 02:32:32 +0000226 if (self.expected_regex is not None and
227 not self.expected_regex.search(str(w))):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000228 continue
229 # store warning for later retrieval
230 self.warning = w
231 self.filename = m.filename
232 self.lineno = m.lineno
233 return
234 # Now we simply try to choose a helpful failure message
235 if first_matching is not None:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300236 self._raiseFailure('"{}" does not match "{}"'.format(
237 self.expected_regex.pattern, str(first_matching)))
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000238 if self.obj_name:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300239 self._raiseFailure("{} not triggered by {}".format(exc_name,
240 self.obj_name))
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000241 else:
Ezio Melottib4dc2502011-05-06 15:01:41 +0300242 self._raiseFailure("{} not triggered".format(exc_name))
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000243
244
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200245
246_LoggingWatcher = collections.namedtuple("_LoggingWatcher",
247 ["records", "output"])
248
249
250class _CapturingHandler(logging.Handler):
251 """
252 A logging handler capturing all (raw and formatted) logging output.
253 """
254
255 def __init__(self):
256 logging.Handler.__init__(self)
257 self.watcher = _LoggingWatcher([], [])
258
259 def flush(self):
260 pass
261
262 def emit(self, record):
263 self.watcher.records.append(record)
264 msg = self.format(record)
265 self.watcher.output.append(msg)
266
267
268
269class _AssertLogsContext(_BaseTestCaseContext):
270 """A context manager used to implement TestCase.assertLogs()."""
271
272 LOGGING_FORMAT = "%(levelname)s:%(name)s:%(message)s"
273
274 def __init__(self, test_case, logger_name, level):
275 _BaseTestCaseContext.__init__(self, test_case)
276 self.logger_name = logger_name
277 if level:
278 self.level = logging._nameToLevel.get(level, level)
279 else:
280 self.level = logging.INFO
281 self.msg = None
282
283 def __enter__(self):
284 if isinstance(self.logger_name, logging.Logger):
285 logger = self.logger = self.logger_name
286 else:
287 logger = self.logger = logging.getLogger(self.logger_name)
288 formatter = logging.Formatter(self.LOGGING_FORMAT)
289 handler = _CapturingHandler()
290 handler.setFormatter(formatter)
291 self.watcher = handler.watcher
292 self.old_handlers = logger.handlers[:]
293 self.old_level = logger.level
294 self.old_propagate = logger.propagate
295 logger.handlers = [handler]
296 logger.setLevel(self.level)
297 logger.propagate = False
298 return handler.watcher
299
300 def __exit__(self, exc_type, exc_value, tb):
301 self.logger.handlers = self.old_handlers
302 self.logger.propagate = self.old_propagate
303 self.logger.setLevel(self.old_level)
304 if exc_type is not None:
305 # let unexpected exceptions pass through
306 return False
307 if len(self.watcher.records) == 0:
308 self._raiseFailure(
309 "no logs of level {} or higher triggered on {}"
310 .format(logging.getLevelName(self.level), self.logger.name))
311
312
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000313class TestCase(object):
314 """A class whose instances are single test cases.
315
316 By default, the test code itself should be placed in a method named
317 'runTest'.
318
319 If the fixture may be used for many test cases, create as
320 many test methods as are needed. When instantiating such a TestCase
321 subclass, specify in the constructor arguments the name of the test method
322 that the instance is to execute.
323
324 Test authors should subclass TestCase for their own tests. Construction
325 and deconstruction of the test's environment ('fixture') can be
326 implemented by overriding the 'setUp' and 'tearDown' methods respectively.
327
328 If it is necessary to override the __init__ method, the base class
329 __init__ method must always be called. It is important that subclasses
330 should not change the signature of their __init__ method, since instances
331 of the classes are instantiated automatically by parts of the framework
332 in order to be run.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000333
Ezio Melotti31797e52013-03-29 03:42:29 +0200334 When subclassing TestCase, you can set these attributes:
335 * failureException: determines which exception will be raised when
336 the instance's assertion methods fail; test methods raising this
337 exception will be deemed to have 'failed' rather than 'errored'.
338 * longMessage: determines whether long messages (including repr of
339 objects used in assert methods) will be printed on failure in *addition*
340 to any explicit message passed.
341 * maxDiff: sets the maximum length of a diff in failure messages
342 by assert methods using difflib. It is looked up as an instance
343 attribute so can be configured by individual tests if required.
344 """
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000345
346 failureException = AssertionError
347
Michael Foord5074df62010-12-03 00:53:09 +0000348 longMessage = True
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000349
Michael Foord085dfd32010-06-05 12:17:02 +0000350 maxDiff = 80*8
351
Ezio Melottiedd117f2011-04-27 10:20:38 +0300352 # If a string is longer than _diffThreshold, use normal comparison instead
353 # of difflib. See #11763.
354 _diffThreshold = 2**16
355
Benjamin Peterson847a4112010-03-14 15:04:17 +0000356 # Attribute used by TestSuite for classSetUp
357
358 _classSetupFailed = False
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000359
360 def __init__(self, methodName='runTest'):
361 """Create an instance of the class that will use the named test
362 method when executed. Raises a ValueError if the instance does
363 not have a method with the specified name.
364 """
365 self._testMethodName = methodName
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100366 self._outcome = None
Michael Foord32e1d832011-01-03 17:00:11 +0000367 self._testMethodDoc = 'No test'
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000368 try:
369 testMethod = getattr(self, methodName)
370 except AttributeError:
Michael Foord32e1d832011-01-03 17:00:11 +0000371 if methodName != 'runTest':
372 # we allow instantiation with no explicit method name
373 # but not an *incorrect* or missing method name
374 raise ValueError("no such test method in %s: %s" %
375 (self.__class__, methodName))
376 else:
377 self._testMethodDoc = testMethod.__doc__
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000378 self._cleanups = []
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100379 self._subtest = None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000380
381 # Map types to custom assertEqual functions that will compare
382 # instances of said type in more detail to generate a more useful
383 # error message.
Benjamin Peterson34b2b262011-07-12 19:21:42 -0500384 self._type_equality_funcs = {}
Michael Foord8ca6d982010-11-20 15:34:26 +0000385 self.addTypeEqualityFunc(dict, 'assertDictEqual')
386 self.addTypeEqualityFunc(list, 'assertListEqual')
387 self.addTypeEqualityFunc(tuple, 'assertTupleEqual')
388 self.addTypeEqualityFunc(set, 'assertSetEqual')
389 self.addTypeEqualityFunc(frozenset, 'assertSetEqual')
390 self.addTypeEqualityFunc(str, 'assertMultiLineEqual')
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000391
392 def addTypeEqualityFunc(self, typeobj, function):
393 """Add a type specific assertEqual style function to compare a type.
394
395 This method is for use by TestCase subclasses that need to register
396 their own type equality functions to provide nicer error messages.
397
398 Args:
399 typeobj: The data type to call this function on when both values
400 are of the same type in assertEqual().
401 function: The callable taking two arguments and an optional
402 msg= argument that raises self.failureException with a
403 useful error message when the two arguments are not equal.
404 """
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000405 self._type_equality_funcs[typeobj] = function
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000406
407 def addCleanup(self, function, *args, **kwargs):
408 """Add a function, with arguments, to be called when the test is
409 completed. Functions added are called on a LIFO basis and are
410 called after tearDown on test failure or success.
411
412 Cleanup items are called even if setUp fails (unlike tearDown)."""
413 self._cleanups.append((function, args, kwargs))
414
415 def setUp(self):
416 "Hook method for setting up the test fixture before exercising it."
417 pass
418
419 def tearDown(self):
420 "Hook method for deconstructing the test fixture after testing it."
421 pass
422
Benjamin Peterson847a4112010-03-14 15:04:17 +0000423 @classmethod
424 def setUpClass(cls):
425 "Hook method for setting up class fixture before running tests in the class."
426
427 @classmethod
428 def tearDownClass(cls):
429 "Hook method for deconstructing the class fixture after running all tests in the class."
430
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000431 def countTestCases(self):
432 return 1
433
434 def defaultTestResult(self):
435 return result.TestResult()
436
437 def shortDescription(self):
Michael Foord34c94622010-02-10 15:51:42 +0000438 """Returns a one-line description of the test, or None if no
439 description has been provided.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000440
Michael Foord34c94622010-02-10 15:51:42 +0000441 The default implementation of this method returns the first line of
442 the specified test method's docstring.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000443 """
Michael Foord34c94622010-02-10 15:51:42 +0000444 doc = self._testMethodDoc
445 return doc and doc.split("\n")[0].strip() or None
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000446
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000447
448 def id(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000449 return "%s.%s" % (strclass(self.__class__), self._testMethodName)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000450
451 def __eq__(self, other):
452 if type(self) is not type(other):
453 return NotImplemented
454
455 return self._testMethodName == other._testMethodName
456
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000457 def __hash__(self):
458 return hash((type(self), self._testMethodName))
459
460 def __str__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000461 return "%s (%s)" % (self._testMethodName, strclass(self.__class__))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000462
463 def __repr__(self):
464 return "<%s testMethod=%s>" % \
Benjamin Peterson847a4112010-03-14 15:04:17 +0000465 (strclass(self.__class__), self._testMethodName)
466
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100467 def _addSkip(self, result, test_case, reason):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000468 addSkip = getattr(result, 'addSkip', None)
469 if addSkip is not None:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100470 addSkip(test_case, reason)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000471 else:
472 warnings.warn("TestResult has no addSkip method, skips not reported",
473 RuntimeWarning, 2)
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100474 result.addSuccess(test_case)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000475
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100476 @contextlib.contextmanager
477 def subTest(self, msg=None, **params):
478 """Return a context manager that will return the enclosed block
479 of code in a subtest identified by the optional message and
480 keyword parameters. A failure in the subtest marks the test
481 case as failed but resumes execution at the end of the enclosed
482 block, allowing further test code to be executed.
483 """
484 if not self._outcome.result_supports_subtests:
485 yield
486 return
487 parent = self._subtest
488 if parent is None:
489 params_map = collections.ChainMap(params)
490 else:
491 params_map = parent.params.new_child(params)
492 self._subtest = _SubTest(self, msg, params_map)
Michael Foordb3468f72010-12-19 03:19:47 +0000493 try:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100494 with self._outcome.testPartExecutor(self._subtest, isTest=True):
495 yield
496 if not self._outcome.success:
497 result = self._outcome.result
498 if result is not None and result.failfast:
499 raise _ShouldStop
500 elif self._outcome.expectedFailure:
501 # If the test is expecting a failure, we really want to
502 # stop now and register the expected failure.
503 raise _ShouldStop
504 finally:
505 self._subtest = parent
506
507 def _feedErrorsToResult(self, result, errors):
508 for test, exc_info in errors:
509 if isinstance(test, _SubTest):
510 result.addSubTest(test.test_case, test, exc_info)
511 elif exc_info is not None:
512 if issubclass(exc_info[0], self.failureException):
513 result.addFailure(test, exc_info)
514 else:
515 result.addError(test, exc_info)
516
517 def _addExpectedFailure(self, result, exc_info):
518 try:
519 addExpectedFailure = result.addExpectedFailure
520 except AttributeError:
521 warnings.warn("TestResult has no addExpectedFailure method, reporting as passes",
522 RuntimeWarning)
523 result.addSuccess(self)
524 else:
525 addExpectedFailure(self, exc_info)
526
527 def _addUnexpectedSuccess(self, result):
528 try:
529 addUnexpectedSuccess = result.addUnexpectedSuccess
530 except AttributeError:
531 warnings.warn("TestResult has no addUnexpectedSuccess method, reporting as failure",
532 RuntimeWarning)
533 # We need to pass an actual exception and traceback to addFailure,
534 # otherwise the legacy result can choke.
535 try:
536 raise _UnexpectedSuccess from None
537 except _UnexpectedSuccess:
538 result.addFailure(self, sys.exc_info())
539 else:
540 addUnexpectedSuccess(self)
Michael Foordb3468f72010-12-19 03:19:47 +0000541
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000542 def run(self, result=None):
543 orig_result = result
544 if result is None:
545 result = self.defaultTestResult()
546 startTestRun = getattr(result, 'startTestRun', None)
547 if startTestRun is not None:
548 startTestRun()
549
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000550 result.startTest(self)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000551
552 testMethod = getattr(self, self._testMethodName)
553 if (getattr(self.__class__, "__unittest_skip__", False) or
554 getattr(testMethod, "__unittest_skip__", False)):
555 # If the class or method was skipped.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000556 try:
Benjamin Peterson847a4112010-03-14 15:04:17 +0000557 skip_why = (getattr(self.__class__, '__unittest_skip_why__', '')
558 or getattr(testMethod, '__unittest_skip_why__', ''))
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100559 self._addSkip(result, self, skip_why)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000560 finally:
561 result.stopTest(self)
562 return
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100563 expecting_failure = getattr(testMethod,
564 "__unittest_expecting_failure__", False)
Victor Stinner031bd532013-12-09 01:52:50 +0100565 outcome = _Outcome(result)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000566 try:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100567 self._outcome = outcome
Michael Foordb3468f72010-12-19 03:19:47 +0000568
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100569 with outcome.testPartExecutor(self):
570 self.setUp()
Michael Foordb3468f72010-12-19 03:19:47 +0000571 if outcome.success:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100572 outcome.expecting_failure = expecting_failure
573 with outcome.testPartExecutor(self, isTest=True):
574 testMethod()
575 outcome.expecting_failure = False
576 with outcome.testPartExecutor(self):
577 self.tearDown()
Michael Foordb3468f72010-12-19 03:19:47 +0000578
579 self.doCleanups()
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100580 for test, reason in outcome.skipped:
581 self._addSkip(result, test, reason)
582 self._feedErrorsToResult(result, outcome.errors)
Michael Foordb3468f72010-12-19 03:19:47 +0000583 if outcome.success:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100584 if expecting_failure:
585 if outcome.expectedFailure:
586 self._addExpectedFailure(result, outcome.expectedFailure)
Benjamin Peterson847a4112010-03-14 15:04:17 +0000587 else:
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100588 self._addUnexpectedSuccess(result)
589 else:
590 result.addSuccess(self)
Michael Foord1341bb02011-03-14 19:01:46 -0400591 return result
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000592 finally:
593 result.stopTest(self)
594 if orig_result is None:
595 stopTestRun = getattr(result, 'stopTestRun', None)
596 if stopTestRun is not None:
597 stopTestRun()
598
Victor Stinner031bd532013-12-09 01:52:50 +0100599 # explicitly break reference cycles:
600 # outcome.errors -> frame -> outcome -> outcome.errors
601 # outcome.expectedFailure -> frame -> outcome -> outcome.expectedFailure
602 outcome.errors.clear()
603 outcome.expectedFailure = None
604
605 # clear the outcome, no more needed
606 self._outcome = None
607
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000608 def doCleanups(self):
609 """Execute all cleanup functions. Normally called for you after
610 tearDown."""
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100611 outcome = self._outcome or _Outcome()
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000612 while self._cleanups:
Michael Foordb3468f72010-12-19 03:19:47 +0000613 function, args, kwargs = self._cleanups.pop()
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +0100614 with outcome.testPartExecutor(self):
615 function(*args, **kwargs)
Michael Foordb3468f72010-12-19 03:19:47 +0000616
617 # return this for backwards compatibility
618 # even though we no longer us it internally
619 return outcome.success
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000620
621 def __call__(self, *args, **kwds):
622 return self.run(*args, **kwds)
623
624 def debug(self):
625 """Run the test without collecting errors in a TestResult"""
626 self.setUp()
627 getattr(self, self._testMethodName)()
628 self.tearDown()
Michael Foordb8748742010-06-10 16:16:08 +0000629 while self._cleanups:
630 function, args, kwargs = self._cleanups.pop(-1)
631 function(*args, **kwargs)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000632
633 def skipTest(self, reason):
634 """Skip this test."""
635 raise SkipTest(reason)
636
637 def fail(self, msg=None):
638 """Fail immediately, with the given message."""
639 raise self.failureException(msg)
640
641 def assertFalse(self, expr, msg=None):
Ezio Melotti3044fa72010-12-18 17:31:58 +0000642 """Check that the expression is false."""
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000643 if expr:
Ezio Melotti3044fa72010-12-18 17:31:58 +0000644 msg = self._formatMessage(msg, "%s is not false" % safe_repr(expr))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000645 raise self.failureException(msg)
646
647 def assertTrue(self, expr, msg=None):
Ezio Melotti3044fa72010-12-18 17:31:58 +0000648 """Check that the expression is true."""
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000649 if not expr:
Ezio Melotti3044fa72010-12-18 17:31:58 +0000650 msg = self._formatMessage(msg, "%s is not true" % safe_repr(expr))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000651 raise self.failureException(msg)
652
653 def _formatMessage(self, msg, standardMsg):
654 """Honour the longMessage attribute when generating failure messages.
655 If longMessage is False this means:
656 * Use only an explicit message if it is provided
657 * Otherwise use the standard message for the assert
658
659 If longMessage is True:
660 * Use the standard message
661 * If an explicit message is provided, plus ' : ' and the explicit message
662 """
663 if not self.longMessage:
664 return msg or standardMsg
665 if msg is None:
666 return standardMsg
Benjamin Peterson847a4112010-03-14 15:04:17 +0000667 try:
668 # don't switch to '{}' formatting in Python 2.X
669 # it changes the way unicode input is handled
670 return '%s : %s' % (standardMsg, msg)
671 except UnicodeDecodeError:
672 return '%s : %s' % (safe_repr(standardMsg), safe_repr(msg))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000673
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000674 def assertRaises(self, excClass, callableObj=None, *args, **kwargs):
Andrew Svetlov737fb892012-12-18 21:14:22 +0200675 """Fail unless an exception of class excClass is raised
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000676 by callableObj when invoked with arguments args and keyword
677 arguments kwargs. If a different type of exception is
Andrew Svetlov737fb892012-12-18 21:14:22 +0200678 raised, it will not be caught, and the test case will be
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000679 deemed to have suffered an error, exactly as for an
680 unexpected exception.
681
682 If called with callableObj omitted or None, will return a
683 context object used like this::
684
Michael Foord1c42b122010-02-05 22:58:21 +0000685 with self.assertRaises(SomeException):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000686 do_something()
Michael Foord1c42b122010-02-05 22:58:21 +0000687
Ezio Melottib4dc2502011-05-06 15:01:41 +0300688 An optional keyword argument 'msg' can be provided when assertRaises
689 is used as a context object.
690
Michael Foord1c42b122010-02-05 22:58:21 +0000691 The context manager keeps a reference to the exception as
Ezio Melotti49008232010-02-08 21:57:48 +0000692 the 'exception' attribute. This allows you to inspect the
Michael Foord1c42b122010-02-05 22:58:21 +0000693 exception after the assertion::
694
695 with self.assertRaises(SomeException) as cm:
696 do_something()
Ezio Melotti49008232010-02-08 21:57:48 +0000697 the_exception = cm.exception
Michael Foordb57ac6d2010-02-05 23:26:29 +0000698 self.assertEqual(the_exception.error_code, 3)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000699 """
700 context = _AssertRaisesContext(excClass, self, callableObj)
Ezio Melottib4dc2502011-05-06 15:01:41 +0300701 return context.handle('assertRaises', callableObj, args, kwargs)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000702
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000703 def assertWarns(self, expected_warning, callable_obj=None, *args, **kwargs):
704 """Fail unless a warning of class warnClass is triggered
Ezio Melottib4dc2502011-05-06 15:01:41 +0300705 by callable_obj when invoked with arguments args and keyword
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000706 arguments kwargs. If a different type of warning is
707 triggered, it will not be handled: depending on the other
708 warning filtering rules in effect, it might be silenced, printed
709 out, or raised as an exception.
710
Ezio Melottib4dc2502011-05-06 15:01:41 +0300711 If called with callable_obj omitted or None, will return a
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000712 context object used like this::
713
714 with self.assertWarns(SomeWarning):
715 do_something()
716
Ezio Melottib4dc2502011-05-06 15:01:41 +0300717 An optional keyword argument 'msg' can be provided when assertWarns
718 is used as a context object.
719
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000720 The context manager keeps a reference to the first matching
721 warning as the 'warning' attribute; similarly, the 'filename'
722 and 'lineno' attributes give you information about the line
723 of Python code from which the warning was triggered.
724 This allows you to inspect the warning after the assertion::
725
726 with self.assertWarns(SomeWarning) as cm:
727 do_something()
728 the_warning = cm.warning
729 self.assertEqual(the_warning.some_attribute, 147)
730 """
731 context = _AssertWarnsContext(expected_warning, self, callable_obj)
Ezio Melottib4dc2502011-05-06 15:01:41 +0300732 return context.handle('assertWarns', callable_obj, args, kwargs)
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +0000733
Antoine Pitrou0715b9f2013-09-14 19:45:47 +0200734 def assertLogs(self, logger=None, level=None):
735 """Fail unless a log message of level *level* or higher is emitted
736 on *logger_name* or its children. If omitted, *level* defaults to
737 INFO and *logger* defaults to the root logger.
738
739 This method must be used as a context manager, and will yield
740 a recording object with two attributes: `output` and `records`.
741 At the end of the context manager, the `output` attribute will
742 be a list of the matching formatted log messages and the
743 `records` attribute will be a list of the corresponding LogRecord
744 objects.
745
746 Example::
747
748 with self.assertLogs('foo', level='INFO') as cm:
749 logging.getLogger('foo').info('first message')
750 logging.getLogger('foo.bar').error('second message')
751 self.assertEqual(cm.output, ['INFO:foo:first message',
752 'ERROR:foo.bar:second message'])
753 """
754 return _AssertLogsContext(self, logger, level)
755
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000756 def _getAssertEqualityFunc(self, first, second):
757 """Get a detailed comparison function for the types of the two args.
758
759 Returns: A callable accepting (first, second, msg=None) that will
760 raise a failure exception if first != second with a useful human
761 readable error message for those types.
762 """
763 #
764 # NOTE(gregory.p.smith): I considered isinstance(first, type(second))
765 # and vice versa. I opted for the conservative approach in case
766 # subclasses are not intended to be compared in detail to their super
767 # class instances using a type equality func. This means testing
768 # subtypes won't automagically use the detailed comparison. Callers
769 # should use their type specific assertSpamEqual method to compare
770 # subclasses if the detailed comparison is desired and appropriate.
771 # See the discussion in http://bugs.python.org/issue2578.
772 #
773 if type(first) is type(second):
774 asserter = self._type_equality_funcs.get(type(first))
775 if asserter is not None:
Benjamin Peterson34b2b262011-07-12 19:21:42 -0500776 if isinstance(asserter, str):
777 asserter = getattr(self, asserter)
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000778 return asserter
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000779
780 return self._baseAssertEqual
781
782 def _baseAssertEqual(self, first, second, msg=None):
783 """The default assertEqual implementation, not type specific."""
784 if not first == second:
Serhiy Storchaka77622f52013-09-23 23:07:00 +0300785 standardMsg = '%s != %s' % _common_shorten_repr(first, second)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000786 msg = self._formatMessage(msg, standardMsg)
787 raise self.failureException(msg)
788
789 def assertEqual(self, first, second, msg=None):
790 """Fail if the two objects are unequal as determined by the '=='
791 operator.
792 """
793 assertion_func = self._getAssertEqualityFunc(first, second)
794 assertion_func(first, second, msg=msg)
795
796 def assertNotEqual(self, first, second, msg=None):
Ezio Melotti90eea972012-11-08 11:08:39 +0200797 """Fail if the two objects are equal as determined by the '!='
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000798 operator.
799 """
800 if not first != second:
Benjamin Peterson847a4112010-03-14 15:04:17 +0000801 msg = self._formatMessage(msg, '%s == %s' % (safe_repr(first),
802 safe_repr(second)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000803 raise self.failureException(msg)
804
Michael Foord321d0592010-11-02 13:44:51 +0000805 def assertAlmostEqual(self, first, second, places=None, msg=None,
Benjamin Petersonb48af542010-04-11 20:43:16 +0000806 delta=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000807 """Fail if the two objects are unequal as determined by their
808 difference rounded to the given number of decimal places
Benjamin Petersonb48af542010-04-11 20:43:16 +0000809 (default 7) and comparing to zero, or by comparing that the
810 between the two objects is more than the given delta.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000811
812 Note that decimal places (from zero) are usually not the same
813 as significant digits (measured from the most signficant digit).
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000814
815 If the two objects compare equal then they will automatically
816 compare almost equal.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000817 """
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000818 if first == second:
Benjamin Petersonb48af542010-04-11 20:43:16 +0000819 # shortcut
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000820 return
Benjamin Petersonb48af542010-04-11 20:43:16 +0000821 if delta is not None and places is not None:
822 raise TypeError("specify delta or places not both")
823
824 if delta is not None:
825 if abs(first - second) <= delta:
826 return
827
828 standardMsg = '%s != %s within %s delta' % (safe_repr(first),
829 safe_repr(second),
830 safe_repr(delta))
831 else:
832 if places is None:
833 places = 7
834
835 if round(abs(second-first), places) == 0:
836 return
837
Benjamin Peterson847a4112010-03-14 15:04:17 +0000838 standardMsg = '%s != %s within %r places' % (safe_repr(first),
839 safe_repr(second),
840 places)
Benjamin Petersonb48af542010-04-11 20:43:16 +0000841 msg = self._formatMessage(msg, standardMsg)
842 raise self.failureException(msg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000843
Michael Foord321d0592010-11-02 13:44:51 +0000844 def assertNotAlmostEqual(self, first, second, places=None, msg=None,
Benjamin Petersonb48af542010-04-11 20:43:16 +0000845 delta=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000846 """Fail if the two objects are equal as determined by their
847 difference rounded to the given number of decimal places
Benjamin Petersonb48af542010-04-11 20:43:16 +0000848 (default 7) and comparing to zero, or by comparing that the
849 between the two objects is less than the given delta.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000850
851 Note that decimal places (from zero) are usually not the same
852 as significant digits (measured from the most signficant digit).
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000853
854 Objects that are equal automatically fail.
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000855 """
Benjamin Petersonb48af542010-04-11 20:43:16 +0000856 if delta is not None and places is not None:
857 raise TypeError("specify delta or places not both")
858 if delta is not None:
859 if not (first == second) and abs(first - second) > delta:
860 return
861 standardMsg = '%s == %s within %s delta' % (safe_repr(first),
862 safe_repr(second),
863 safe_repr(delta))
864 else:
865 if places is None:
866 places = 7
867 if not (first == second) and round(abs(second-first), places) != 0:
868 return
Benjamin Peterson847a4112010-03-14 15:04:17 +0000869 standardMsg = '%s == %s within %r places' % (safe_repr(first),
Benjamin Petersonb48af542010-04-11 20:43:16 +0000870 safe_repr(second),
871 places)
872
873 msg = self._formatMessage(msg, standardMsg)
874 raise self.failureException(msg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000875
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000876
Michael Foord085dfd32010-06-05 12:17:02 +0000877 def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None):
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000878 """An equality assertion for ordered sequences (like lists and tuples).
879
R. David Murrayad13f222010-01-29 22:17:58 +0000880 For the purposes of this function, a valid ordered sequence type is one
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000881 which can be indexed, has a length, and has an equality operator.
882
883 Args:
884 seq1: The first sequence to compare.
885 seq2: The second sequence to compare.
886 seq_type: The expected datatype of the sequences, or None if no
887 datatype should be enforced.
888 msg: Optional message to use on failure instead of a list of
889 differences.
890 """
Benjamin Petersonb29614e2012-10-09 11:16:03 -0400891 if seq_type is not None:
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000892 seq_type_name = seq_type.__name__
893 if not isinstance(seq1, seq_type):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000894 raise self.failureException('First sequence is not a %s: %s'
895 % (seq_type_name, safe_repr(seq1)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000896 if not isinstance(seq2, seq_type):
Benjamin Peterson847a4112010-03-14 15:04:17 +0000897 raise self.failureException('Second sequence is not a %s: %s'
898 % (seq_type_name, safe_repr(seq2)))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000899 else:
900 seq_type_name = "sequence"
901
902 differing = None
903 try:
904 len1 = len(seq1)
905 except (TypeError, NotImplementedError):
906 differing = 'First %s has no length. Non-sequence?' % (
907 seq_type_name)
908
909 if differing is None:
910 try:
911 len2 = len(seq2)
912 except (TypeError, NotImplementedError):
913 differing = 'Second %s has no length. Non-sequence?' % (
914 seq_type_name)
915
916 if differing is None:
917 if seq1 == seq2:
918 return
919
Serhiy Storchaka77622f52013-09-23 23:07:00 +0300920 differing = '%ss differ: %s != %s\n' % (
921 (seq_type_name.capitalize(),) +
922 _common_shorten_repr(seq1, seq2))
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000923
924 for i in range(min(len1, len2)):
925 try:
926 item1 = seq1[i]
927 except (TypeError, IndexError, NotImplementedError):
928 differing += ('\nUnable to index element %d of first %s\n' %
929 (i, seq_type_name))
930 break
931
932 try:
933 item2 = seq2[i]
934 except (TypeError, IndexError, NotImplementedError):
935 differing += ('\nUnable to index element %d of second %s\n' %
936 (i, seq_type_name))
937 break
938
939 if item1 != item2:
940 differing += ('\nFirst differing element %d:\n%s\n%s\n' %
941 (i, item1, item2))
942 break
943 else:
944 if (len1 == len2 and seq_type is None and
945 type(seq1) != type(seq2)):
946 # The sequences are the same, but have differing types.
947 return
948
949 if len1 > len2:
950 differing += ('\nFirst %s contains %d additional '
951 'elements.\n' % (seq_type_name, len1 - len2))
952 try:
953 differing += ('First extra element %d:\n%s\n' %
954 (len2, seq1[len2]))
955 except (TypeError, IndexError, NotImplementedError):
956 differing += ('Unable to index element %d '
957 'of first %s\n' % (len2, seq_type_name))
958 elif len1 < len2:
959 differing += ('\nSecond %s contains %d additional '
960 'elements.\n' % (seq_type_name, len2 - len1))
961 try:
962 differing += ('First extra element %d:\n%s\n' %
963 (len1, seq2[len1]))
964 except (TypeError, IndexError, NotImplementedError):
965 differing += ('Unable to index element %d '
966 'of second %s\n' % (len1, seq_type_name))
Michael Foord2034d9a2010-06-05 11:27:52 +0000967 standardMsg = differing
968 diffMsg = '\n' + '\n'.join(
Benjamin Peterson6e8c7572009-10-04 20:19:21 +0000969 difflib.ndiff(pprint.pformat(seq1).splitlines(),
970 pprint.pformat(seq2).splitlines()))
Michael Foord085dfd32010-06-05 12:17:02 +0000971
972 standardMsg = self._truncateMessage(standardMsg, diffMsg)
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000973 msg = self._formatMessage(msg, standardMsg)
974 self.fail(msg)
975
Michael Foord085dfd32010-06-05 12:17:02 +0000976 def _truncateMessage(self, message, diff):
977 max_diff = self.maxDiff
978 if max_diff is None or len(diff) <= max_diff:
979 return message + diff
Michael Foord9dad32e2010-06-05 13:49:56 +0000980 return message + (DIFF_OMITTED % len(diff))
Michael Foord085dfd32010-06-05 12:17:02 +0000981
Benjamin Petersonbed7d042009-07-19 21:01:52 +0000982 def assertListEqual(self, list1, list2, msg=None):
983 """A list-specific equality assertion.
984
985 Args:
986 list1: The first list to compare.
987 list2: The second list to compare.
988 msg: Optional message to use on failure instead of a list of
989 differences.
990
991 """
992 self.assertSequenceEqual(list1, list2, msg, seq_type=list)
993
994 def assertTupleEqual(self, tuple1, tuple2, msg=None):
995 """A tuple-specific equality assertion.
996
997 Args:
998 tuple1: The first tuple to compare.
999 tuple2: The second tuple to compare.
1000 msg: Optional message to use on failure instead of a list of
1001 differences.
1002 """
1003 self.assertSequenceEqual(tuple1, tuple2, msg, seq_type=tuple)
1004
1005 def assertSetEqual(self, set1, set2, msg=None):
1006 """A set-specific equality assertion.
1007
1008 Args:
1009 set1: The first set to compare.
1010 set2: The second set to compare.
1011 msg: Optional message to use on failure instead of a list of
1012 differences.
1013
Michael Foord91c9da32010-03-20 17:21:27 +00001014 assertSetEqual uses ducktyping to support different types of sets, and
1015 is optimized for sets specifically (parameters must support a
1016 difference method).
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001017 """
1018 try:
1019 difference1 = set1.difference(set2)
1020 except TypeError as e:
1021 self.fail('invalid type when attempting set difference: %s' % e)
1022 except AttributeError as e:
1023 self.fail('first argument does not support set difference: %s' % e)
1024
1025 try:
1026 difference2 = set2.difference(set1)
1027 except TypeError as e:
1028 self.fail('invalid type when attempting set difference: %s' % e)
1029 except AttributeError as e:
1030 self.fail('second argument does not support set difference: %s' % e)
1031
1032 if not (difference1 or difference2):
1033 return
1034
1035 lines = []
1036 if difference1:
1037 lines.append('Items in the first set but not the second:')
1038 for item in difference1:
1039 lines.append(repr(item))
1040 if difference2:
1041 lines.append('Items in the second set but not the first:')
1042 for item in difference2:
1043 lines.append(repr(item))
1044
1045 standardMsg = '\n'.join(lines)
1046 self.fail(self._formatMessage(msg, standardMsg))
1047
1048 def assertIn(self, member, container, msg=None):
1049 """Just like self.assertTrue(a in b), but with a nicer default message."""
1050 if member not in container:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001051 standardMsg = '%s not found in %s' % (safe_repr(member),
1052 safe_repr(container))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001053 self.fail(self._formatMessage(msg, standardMsg))
1054
1055 def assertNotIn(self, member, container, msg=None):
1056 """Just like self.assertTrue(a not in b), but with a nicer default message."""
1057 if member in container:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001058 standardMsg = '%s unexpectedly found in %s' % (safe_repr(member),
1059 safe_repr(container))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001060 self.fail(self._formatMessage(msg, standardMsg))
1061
1062 def assertIs(self, expr1, expr2, msg=None):
1063 """Just like self.assertTrue(a is b), but with a nicer default message."""
1064 if expr1 is not expr2:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001065 standardMsg = '%s is not %s' % (safe_repr(expr1),
1066 safe_repr(expr2))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001067 self.fail(self._formatMessage(msg, standardMsg))
1068
1069 def assertIsNot(self, expr1, expr2, msg=None):
1070 """Just like self.assertTrue(a is not b), but with a nicer default message."""
1071 if expr1 is expr2:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001072 standardMsg = 'unexpectedly identical: %s' % (safe_repr(expr1),)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001073 self.fail(self._formatMessage(msg, standardMsg))
1074
1075 def assertDictEqual(self, d1, d2, msg=None):
Ezio Melottib3aedd42010-11-20 19:04:17 +00001076 self.assertIsInstance(d1, dict, 'First argument is not a dictionary')
1077 self.assertIsInstance(d2, dict, 'Second argument is not a dictionary')
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001078
1079 if d1 != d2:
Serhiy Storchaka77622f52013-09-23 23:07:00 +03001080 standardMsg = '%s != %s' % _common_shorten_repr(d1, d2)
Michael Foord085dfd32010-06-05 12:17:02 +00001081 diff = ('\n' + '\n'.join(difflib.ndiff(
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001082 pprint.pformat(d1).splitlines(),
1083 pprint.pformat(d2).splitlines())))
Michael Foordcb11b252010-06-05 13:14:43 +00001084 standardMsg = self._truncateMessage(standardMsg, diff)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001085 self.fail(self._formatMessage(msg, standardMsg))
1086
Ezio Melotti0f535012011-04-03 18:02:13 +03001087 def assertDictContainsSubset(self, subset, dictionary, msg=None):
1088 """Checks whether dictionary is a superset of subset."""
1089 warnings.warn('assertDictContainsSubset is deprecated',
1090 DeprecationWarning)
1091 missing = []
1092 mismatched = []
1093 for key, value in subset.items():
1094 if key not in dictionary:
1095 missing.append(key)
1096 elif value != dictionary[key]:
1097 mismatched.append('%s, expected: %s, actual: %s' %
1098 (safe_repr(key), safe_repr(value),
1099 safe_repr(dictionary[key])))
1100
1101 if not (missing or mismatched):
1102 return
1103
1104 standardMsg = ''
1105 if missing:
1106 standardMsg = 'Missing: %s' % ','.join(safe_repr(m) for m in
1107 missing)
1108 if mismatched:
1109 if standardMsg:
1110 standardMsg += '; '
1111 standardMsg += 'Mismatched values: %s' % ','.join(mismatched)
1112
1113 self.fail(self._formatMessage(msg, standardMsg))
1114
1115
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001116 def assertCountEqual(self, first, second, msg=None):
1117 """An unordered sequence comparison asserting that the same elements,
1118 regardless of order. If the same element occurs more than once,
1119 it verifies that the elements occur the same number of times.
Michael Foord8442a602010-03-20 16:58:04 +00001120
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001121 self.assertEqual(Counter(list(first)),
1122 Counter(list(second)))
Michael Foord8442a602010-03-20 16:58:04 +00001123
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001124 Example:
Michael Foord8442a602010-03-20 16:58:04 +00001125 - [0, 1, 1] and [1, 0, 1] compare equal.
1126 - [0, 0, 1] and [0, 1] compare unequal.
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001127
Michael Foord8442a602010-03-20 16:58:04 +00001128 """
Michael Foorde180d392011-01-28 19:51:48 +00001129 first_seq, second_seq = list(first), list(second)
Michael Foord8442a602010-03-20 16:58:04 +00001130 try:
Michael Foorde180d392011-01-28 19:51:48 +00001131 first = collections.Counter(first_seq)
1132 second = collections.Counter(second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001133 except TypeError:
Raymond Hettinger6518f5e2010-12-24 00:52:54 +00001134 # Handle case with unhashable elements
Michael Foorde180d392011-01-28 19:51:48 +00001135 differences = _count_diff_all_purpose(first_seq, second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001136 else:
Michael Foorde180d392011-01-28 19:51:48 +00001137 if first == second:
Raymond Hettinger6e165b32010-11-27 09:31:37 +00001138 return
Michael Foorde180d392011-01-28 19:51:48 +00001139 differences = _count_diff_hashable(first_seq, second_seq)
Michael Foord8442a602010-03-20 16:58:04 +00001140
Raymond Hettinger93e233d2010-12-24 10:02:22 +00001141 if differences:
1142 standardMsg = 'Element counts were not equal:\n'
Raymond Hettinger57bd00a2010-12-24 21:51:48 +00001143 lines = ['First has %d, Second has %d: %r' % diff for diff in differences]
Raymond Hettinger93e233d2010-12-24 10:02:22 +00001144 diffMsg = '\n'.join(lines)
1145 standardMsg = self._truncateMessage(standardMsg, diffMsg)
1146 msg = self._formatMessage(msg, standardMsg)
1147 self.fail(msg)
Michael Foord8442a602010-03-20 16:58:04 +00001148
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001149 def assertMultiLineEqual(self, first, second, msg=None):
1150 """Assert that two multi-line strings are equal."""
Ezio Melottib3aedd42010-11-20 19:04:17 +00001151 self.assertIsInstance(first, str, 'First argument is not a string')
1152 self.assertIsInstance(second, str, 'Second argument is not a string')
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001153
1154 if first != second:
Ezio Melottiedd117f2011-04-27 10:20:38 +03001155 # don't use difflib if the strings are too long
1156 if (len(first) > self._diffThreshold or
1157 len(second) > self._diffThreshold):
1158 self._baseAssertEqual(first, second, msg)
Ezio Melottid8b509b2011-09-28 17:37:55 +03001159 firstlines = first.splitlines(keepends=True)
1160 secondlines = second.splitlines(keepends=True)
Michael Foordc653ce32010-07-10 13:52:22 +00001161 if len(firstlines) == 1 and first.strip('\r\n') == first:
1162 firstlines = [first + '\n']
1163 secondlines = [second + '\n']
Serhiy Storchaka77622f52013-09-23 23:07:00 +03001164 standardMsg = '%s != %s' % _common_shorten_repr(first, second)
Michael Foordc653ce32010-07-10 13:52:22 +00001165 diff = '\n' + ''.join(difflib.ndiff(firstlines, secondlines))
Michael Foordcb11b252010-06-05 13:14:43 +00001166 standardMsg = self._truncateMessage(standardMsg, diff)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001167 self.fail(self._formatMessage(msg, standardMsg))
1168
1169 def assertLess(self, a, b, msg=None):
1170 """Just like self.assertTrue(a < b), but with a nicer default message."""
1171 if not a < b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001172 standardMsg = '%s not less than %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001173 self.fail(self._formatMessage(msg, standardMsg))
1174
1175 def assertLessEqual(self, a, b, msg=None):
1176 """Just like self.assertTrue(a <= b), but with a nicer default message."""
1177 if not a <= b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001178 standardMsg = '%s not less than or equal to %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001179 self.fail(self._formatMessage(msg, standardMsg))
1180
1181 def assertGreater(self, a, b, msg=None):
1182 """Just like self.assertTrue(a > b), but with a nicer default message."""
1183 if not a > b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001184 standardMsg = '%s not greater than %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001185 self.fail(self._formatMessage(msg, standardMsg))
1186
1187 def assertGreaterEqual(self, a, b, msg=None):
1188 """Just like self.assertTrue(a >= b), but with a nicer default message."""
1189 if not a >= b:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001190 standardMsg = '%s not greater than or equal to %s' % (safe_repr(a), safe_repr(b))
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001191 self.fail(self._formatMessage(msg, standardMsg))
1192
1193 def assertIsNone(self, obj, msg=None):
1194 """Same as self.assertTrue(obj is None), with a nicer default message."""
1195 if obj is not None:
Benjamin Peterson847a4112010-03-14 15:04:17 +00001196 standardMsg = '%s is not None' % (safe_repr(obj),)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001197 self.fail(self._formatMessage(msg, standardMsg))
1198
1199 def assertIsNotNone(self, obj, msg=None):
1200 """Included for symmetry with assertIsNone."""
1201 if obj is None:
1202 standardMsg = 'unexpectedly None'
1203 self.fail(self._formatMessage(msg, standardMsg))
1204
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001205 def assertIsInstance(self, obj, cls, msg=None):
1206 """Same as self.assertTrue(isinstance(obj, cls)), with a nicer
1207 default message."""
1208 if not isinstance(obj, cls):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001209 standardMsg = '%s is not an instance of %r' % (safe_repr(obj), cls)
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001210 self.fail(self._formatMessage(msg, standardMsg))
1211
1212 def assertNotIsInstance(self, obj, cls, msg=None):
1213 """Included for symmetry with assertIsInstance."""
1214 if isinstance(obj, cls):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001215 standardMsg = '%s is an instance of %r' % (safe_repr(obj), cls)
Benjamin Peterson6e8c7572009-10-04 20:19:21 +00001216 self.fail(self._formatMessage(msg, standardMsg))
1217
Ezio Melottied3a7d22010-12-01 02:32:32 +00001218 def assertRaisesRegex(self, expected_exception, expected_regex,
1219 callable_obj=None, *args, **kwargs):
1220 """Asserts that the message in a raised exception matches a regex.
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001221
1222 Args:
1223 expected_exception: Exception class expected to be raised.
Ezio Melottied3a7d22010-12-01 02:32:32 +00001224 expected_regex: Regex (re pattern object or string) expected
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001225 to be found in error message.
1226 callable_obj: Function to be called.
Ezio Melottib4dc2502011-05-06 15:01:41 +03001227 msg: Optional message used in case of failure. Can only be used
1228 when assertRaisesRegex is used as a context manager.
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001229 args: Extra args.
1230 kwargs: Extra kwargs.
1231 """
1232 context = _AssertRaisesContext(expected_exception, self, callable_obj,
Ezio Melottied3a7d22010-12-01 02:32:32 +00001233 expected_regex)
Ezio Melottib4dc2502011-05-06 15:01:41 +03001234
1235 return context.handle('assertRaisesRegex', callable_obj, args, kwargs)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001236
Ezio Melottied3a7d22010-12-01 02:32:32 +00001237 def assertWarnsRegex(self, expected_warning, expected_regex,
1238 callable_obj=None, *args, **kwargs):
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001239 """Asserts that the message in a triggered warning matches a regexp.
1240 Basic functioning is similar to assertWarns() with the addition
1241 that only warnings whose messages also match the regular expression
1242 are considered successful matches.
1243
1244 Args:
1245 expected_warning: Warning class expected to be triggered.
Ezio Melottied3a7d22010-12-01 02:32:32 +00001246 expected_regex: Regex (re pattern object or string) expected
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001247 to be found in error message.
1248 callable_obj: Function to be called.
Ezio Melottib4dc2502011-05-06 15:01:41 +03001249 msg: Optional message used in case of failure. Can only be used
1250 when assertWarnsRegex is used as a context manager.
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001251 args: Extra args.
1252 kwargs: Extra kwargs.
1253 """
1254 context = _AssertWarnsContext(expected_warning, self, callable_obj,
Ezio Melottied3a7d22010-12-01 02:32:32 +00001255 expected_regex)
Ezio Melottib4dc2502011-05-06 15:01:41 +03001256 return context.handle('assertWarnsRegex', callable_obj, args, kwargs)
Antoine Pitrou4bc12ef2010-09-06 19:25:46 +00001257
Ezio Melottied3a7d22010-12-01 02:32:32 +00001258 def assertRegex(self, text, expected_regex, msg=None):
Michael Foorde3ef5f12010-05-08 16:46:14 +00001259 """Fail the test unless the text matches the regular expression."""
Ezio Melottied3a7d22010-12-01 02:32:32 +00001260 if isinstance(expected_regex, (str, bytes)):
Gregory P. Smithed16bf42010-12-16 19:23:05 +00001261 assert expected_regex, "expected_regex must not be empty."
Ezio Melottied3a7d22010-12-01 02:32:32 +00001262 expected_regex = re.compile(expected_regex)
1263 if not expected_regex.search(text):
1264 msg = msg or "Regex didn't match"
1265 msg = '%s: %r not found in %r' % (msg, expected_regex.pattern, text)
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001266 raise self.failureException(msg)
1267
Ezio Melotti8f776302010-12-10 02:32:05 +00001268 def assertNotRegex(self, text, unexpected_regex, msg=None):
Michael Foorde3ef5f12010-05-08 16:46:14 +00001269 """Fail the test if the text matches the regular expression."""
Ezio Melottied3a7d22010-12-01 02:32:32 +00001270 if isinstance(unexpected_regex, (str, bytes)):
1271 unexpected_regex = re.compile(unexpected_regex)
1272 match = unexpected_regex.search(text)
Benjamin Petersonb48af542010-04-11 20:43:16 +00001273 if match:
Ezio Melottied3a7d22010-12-01 02:32:32 +00001274 msg = msg or "Regex matched"
Benjamin Petersonb48af542010-04-11 20:43:16 +00001275 msg = '%s: %r matches %r in %r' % (msg,
1276 text[match.start():match.end()],
Ezio Melottied3a7d22010-12-01 02:32:32 +00001277 unexpected_regex.pattern,
Benjamin Petersonb48af542010-04-11 20:43:16 +00001278 text)
1279 raise self.failureException(msg)
1280
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001281
Ezio Melottied3a7d22010-12-01 02:32:32 +00001282 def _deprecate(original_func):
1283 def deprecated_func(*args, **kwargs):
1284 warnings.warn(
1285 'Please use {0} instead.'.format(original_func.__name__),
1286 DeprecationWarning, 2)
1287 return original_func(*args, **kwargs)
1288 return deprecated_func
1289
Ezio Melotti361467e2011-04-03 17:37:58 +03001290 # see #9424
Ezio Melotti0f535012011-04-03 18:02:13 +03001291 failUnlessEqual = assertEquals = _deprecate(assertEqual)
1292 failIfEqual = assertNotEquals = _deprecate(assertNotEqual)
1293 failUnlessAlmostEqual = assertAlmostEquals = _deprecate(assertAlmostEqual)
1294 failIfAlmostEqual = assertNotAlmostEquals = _deprecate(assertNotAlmostEqual)
1295 failUnless = assert_ = _deprecate(assertTrue)
1296 failUnlessRaises = _deprecate(assertRaises)
1297 failIf = _deprecate(assertFalse)
Ezio Melottied3a7d22010-12-01 02:32:32 +00001298 assertRaisesRegexp = _deprecate(assertRaisesRegex)
1299 assertRegexpMatches = _deprecate(assertRegex)
1300
1301
1302
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001303class FunctionTestCase(TestCase):
1304 """A test case that wraps a test function.
1305
1306 This is useful for slipping pre-existing test functions into the
1307 unittest framework. Optionally, set-up and tidy-up functions can be
1308 supplied. As with TestCase, the tidy-up ('tearDown') function will
1309 always be called if the set-up ('setUp') function ran successfully.
1310 """
1311
1312 def __init__(self, testFunc, setUp=None, tearDown=None, description=None):
1313 super(FunctionTestCase, self).__init__()
1314 self._setUpFunc = setUp
1315 self._tearDownFunc = tearDown
1316 self._testFunc = testFunc
1317 self._description = description
1318
1319 def setUp(self):
1320 if self._setUpFunc is not None:
1321 self._setUpFunc()
1322
1323 def tearDown(self):
1324 if self._tearDownFunc is not None:
1325 self._tearDownFunc()
1326
1327 def runTest(self):
1328 self._testFunc()
1329
1330 def id(self):
1331 return self._testFunc.__name__
1332
1333 def __eq__(self, other):
1334 if not isinstance(other, self.__class__):
1335 return NotImplemented
1336
1337 return self._setUpFunc == other._setUpFunc and \
1338 self._tearDownFunc == other._tearDownFunc and \
1339 self._testFunc == other._testFunc and \
1340 self._description == other._description
1341
1342 def __ne__(self, other):
1343 return not self == other
1344
1345 def __hash__(self):
1346 return hash((type(self), self._setUpFunc, self._tearDownFunc,
1347 self._testFunc, self._description))
1348
1349 def __str__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001350 return "%s (%s)" % (strclass(self.__class__),
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001351 self._testFunc.__name__)
1352
1353 def __repr__(self):
Benjamin Peterson847a4112010-03-14 15:04:17 +00001354 return "<%s tec=%s>" % (strclass(self.__class__),
Benjamin Petersonbed7d042009-07-19 21:01:52 +00001355 self._testFunc)
1356
1357 def shortDescription(self):
1358 if self._description is not None:
1359 return self._description
1360 doc = self._testFunc.__doc__
1361 return doc and doc.split("\n")[0].strip() or None
Antoine Pitrouc9b3ef22013-03-20 20:16:47 +01001362
1363
1364class _SubTest(TestCase):
1365
1366 def __init__(self, test_case, message, params):
1367 super().__init__()
1368 self._message = message
1369 self.test_case = test_case
1370 self.params = params
1371 self.failureException = test_case.failureException
1372
1373 def runTest(self):
1374 raise NotImplementedError("subtests cannot be run directly")
1375
1376 def _subDescription(self):
1377 parts = []
1378 if self._message:
1379 parts.append("[{}]".format(self._message))
1380 if self.params:
1381 params_desc = ', '.join(
1382 "{}={!r}".format(k, v)
1383 for (k, v) in sorted(self.params.items()))
1384 parts.append("({})".format(params_desc))
1385 return " ".join(parts) or '(<subtest>)'
1386
1387 def id(self):
1388 return "{} {}".format(self.test_case.id(), self._subDescription())
1389
1390 def shortDescription(self):
1391 """Returns a one-line description of the subtest, or None if no
1392 description has been provided.
1393 """
1394 return self.test_case.shortDescription()
1395
1396 def __str__(self):
1397 return "{} {}".format(self.test_case, self._subDescription())