blob: 0831d8d7d2821657dc8920eef4dc29f06e4f0394 [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*'
17 self.assertEquals((1 + 2), 3)
18 self.assertEquals(0 + 1, 1)
Steve Purcell7b065702001-09-06 08:24:40 +000019 def testMultiply(self):
Steve Purcell5ddd1a82001-03-22 08:45:36 +000020 self.assertEquals((0 * 10), 0)
21 self.assertEquals((5 * 8), 40)
22
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
Fred Drake02538202001-03-21 18:09:46 +000048import time
49import sys
50import traceback
Fred Drake02538202001-03-21 18:09:46 +000051import os
Steve Purcell5ddd1a82001-03-22 08:45:36 +000052import types
Benjamin Peterson5254c042009-03-23 22:25:03 +000053import functools
Fred Drake02538202001-03-21 18:09:46 +000054
55##############################################################################
Steve Purcelld75e7e42003-09-15 11:01:21 +000056# Exported classes and functions
57##############################################################################
Benjamin Peterson52baa292009-03-24 00:56:30 +000058__all__ = ['TestResult', 'TestCase', 'TestSuite', 'ClassTestSuite',
59 'TextTestRunner', 'TestLoader', 'FunctionTestCase', 'main',
60 'defaultTestLoader', 'SkipException', 'skip', 'skipIf', 'skipUnless',
61 'expectedFailure']
Steve Purcelld75e7e42003-09-15 11:01:21 +000062
Steve Purcell7e743842003-09-22 11:08:12 +000063# Expose obsolete functions for backwards compatibility
Steve Purcelld75e7e42003-09-15 11:01:21 +000064__all__.extend(['getTestCaseNames', 'makeSuite', 'findTestCases'])
65
66
67##############################################################################
Fred Drake02538202001-03-21 18:09:46 +000068# Test framework core
69##############################################################################
70
Steve Purcelldc391a62002-08-09 09:46:23 +000071def _strclass(cls):
72 return "%s.%s" % (cls.__module__, cls.__name__)
73
Benjamin Peterson5254c042009-03-23 22:25:03 +000074
75class SkipTest(Exception):
76 """
77 Raise this exception in a test to skip it.
78
79 Usually you can use TestResult.skip() or one of the skipping decorators
80 instead of raising this directly.
81 """
82 pass
83
84class _ExpectedFailure(Exception):
85 """
86 Raise this when a test is expected to fail.
87
88 This is an implementation detail.
89 """
90
91 def __init__(self, exc_info):
92 super(_ExpectedFailure, self).__init__()
93 self.exc_info = exc_info
94
95class _UnexpectedSuccess(Exception):
96 """
97 The test was supposed to fail, but it didn't!
98 """
99 pass
100
101def _id(obj):
102 return obj
103
104def skip(reason):
105 """
106 Unconditionally skip a test.
107 """
108 def decorator(test_item):
109 if isinstance(test_item, type) and issubclass(test_item, TestCase):
110 test_item.__unittest_skip__ = True
111 test_item.__unittest_skip_why__ = reason
112 return test_item
113 @functools.wraps(test_item)
114 def skip_wrapper(*args, **kwargs):
115 raise SkipTest(reason)
116 return skip_wrapper
117 return decorator
118
119def skipIf(condition, reason):
120 """
121 Skip a test if the condition is true.
122 """
123 if condition:
124 return skip(reason)
125 return _id
126
127def skipUnless(condition, reason):
128 """
129 Skip a test unless the condition is true.
130 """
131 if not condition:
132 return skip(reason)
133 return _id
134
135
136def expectedFailure(func):
137 @functools.wraps(func)
138 def wrapper(*args, **kwargs):
139 try:
140 func(*args, **kwargs)
141 except Exception:
142 raise _ExpectedFailure(sys.exc_info())
143 raise _UnexpectedSuccess
144 return wrapper
145
146
Steve Purcellb8d5f242003-12-06 13:03:13 +0000147__unittest = 1
148
Benjamin Peterson1467ac82009-01-09 03:42:38 +0000149class TestResult(object):
Fred Drake02538202001-03-21 18:09:46 +0000150 """Holder for test result information.
151
152 Test results are automatically managed by the TestCase and TestSuite
153 classes, and do not need to be explicitly manipulated by writers of tests.
154
155 Each instance holds the total number of tests run, and collections of
156 failures and errors that occurred among those test runs. The collections
Steve Purcell7b065702001-09-06 08:24:40 +0000157 contain tuples of (testcase, exceptioninfo), where exceptioninfo is the
Fred Drake656f9ec2001-09-06 19:13:14 +0000158 formatted traceback of the error that occurred.
Fred Drake02538202001-03-21 18:09:46 +0000159 """
160 def __init__(self):
161 self.failures = []
162 self.errors = []
163 self.testsRun = 0
Benjamin Peterson5254c042009-03-23 22:25:03 +0000164 self.skipped = []
Benjamin Peterson52baa292009-03-24 00:56:30 +0000165 self.expectedFailures = []
166 self.unexpectedSuccesses = []
Guido van Rossumd8faa362007-04-27 19:54:29 +0000167 self.shouldStop = False
Fred Drake02538202001-03-21 18:09:46 +0000168
169 def startTest(self, test):
170 "Called when the given test is about to be run"
171 self.testsRun = self.testsRun + 1
172
173 def stopTest(self, test):
174 "Called when the given test has been run"
175 pass
176
177 def addError(self, test, err):
Steve Purcell7b065702001-09-06 08:24:40 +0000178 """Called when an error has occurred. 'err' is a tuple of values as
179 returned by sys.exc_info().
180 """
Steve Purcellb8d5f242003-12-06 13:03:13 +0000181 self.errors.append((test, self._exc_info_to_string(err, test)))
Fred Drake02538202001-03-21 18:09:46 +0000182
183 def addFailure(self, test, err):
Steve Purcell7b065702001-09-06 08:24:40 +0000184 """Called when an error has occurred. 'err' is a tuple of values as
185 returned by sys.exc_info()."""
Steve Purcellb8d5f242003-12-06 13:03:13 +0000186 self.failures.append((test, self._exc_info_to_string(err, test)))
Fred Drake02538202001-03-21 18:09:46 +0000187
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000188 def addSuccess(self, test):
189 "Called when a test has completed successfully"
190 pass
191
Benjamin Peterson5254c042009-03-23 22:25:03 +0000192 def addSkip(self, test, reason):
193 """Called when a test is skipped."""
194 self.skipped.append((test, reason))
195
196 def addExpectedFailure(self, test, err):
197 """Called when an expected failure/error occured."""
Benjamin Peterson52baa292009-03-24 00:56:30 +0000198 self.expectedFailures.append(
Benjamin Peterson5254c042009-03-23 22:25:03 +0000199 (test, self._exc_info_to_string(err, test)))
200
201 def addUnexpectedSuccess(self, test):
202 """Called when a test was expected to fail, but succeed."""
Benjamin Peterson52baa292009-03-24 00:56:30 +0000203 self.unexpectedSuccesses.append(test)
Benjamin Peterson5254c042009-03-23 22:25:03 +0000204
Fred Drake02538202001-03-21 18:09:46 +0000205 def wasSuccessful(self):
206 "Tells whether or not this result was a success"
207 return len(self.failures) == len(self.errors) == 0
208
209 def stop(self):
210 "Indicates that the tests should be aborted"
Steve Purcell7e743842003-09-22 11:08:12 +0000211 self.shouldStop = True
Tim Petersa19a1682001-03-29 04:36:09 +0000212
Steve Purcellb8d5f242003-12-06 13:03:13 +0000213 def _exc_info_to_string(self, err, test):
Steve Purcell7b065702001-09-06 08:24:40 +0000214 """Converts a sys.exc_info()-style tuple of values into a string."""
Steve Purcellb8d5f242003-12-06 13:03:13 +0000215 exctype, value, tb = err
216 # Skip test runner traceback levels
217 while tb and self._is_relevant_tb_level(tb):
218 tb = tb.tb_next
219 if exctype is test.failureException:
220 # Skip assert*() traceback levels
221 length = self._count_relevant_tb_levels(tb)
Collin Winterce36ad82007-08-30 01:19:48 +0000222 return ''.join(traceback.format_exception(exctype, value,
223 tb, length))
Steve Purcellb8d5f242003-12-06 13:03:13 +0000224 return ''.join(traceback.format_exception(exctype, value, tb))
225
226 def _is_relevant_tb_level(self, tb):
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000227 return '__unittest' in tb.tb_frame.f_globals
Steve Purcellb8d5f242003-12-06 13:03:13 +0000228
229 def _count_relevant_tb_levels(self, tb):
230 length = 0
231 while tb and not self._is_relevant_tb_level(tb):
232 length += 1
233 tb = tb.tb_next
234 return length
Steve Purcell7b065702001-09-06 08:24:40 +0000235
Fred Drake02538202001-03-21 18:09:46 +0000236 def __repr__(self):
237 return "<%s run=%i errors=%i failures=%i>" % \
Steve Purcelldc391a62002-08-09 09:46:23 +0000238 (_strclass(self.__class__), self.testsRun, len(self.errors),
Fred Drake02538202001-03-21 18:09:46 +0000239 len(self.failures))
240
Benjamin Peterson52baa292009-03-24 00:56:30 +0000241
Benjamin Peterson1467ac82009-01-09 03:42:38 +0000242class AssertRaisesContext(object):
Benjamin Peterson52baa292009-03-24 00:56:30 +0000243
244
Antoine Pitrou5acd41e2008-12-28 14:29:00 +0000245 def __init__(self, expected, test_case, callable_obj=None):
246 self.expected = expected
247 self.failureException = test_case.failureException
248 if callable_obj is not None:
249 try:
250 self.obj_name = callable_obj.__name__
251 except AttributeError:
252 self.obj_name = str(callable_obj)
253 else:
254 self.obj_name = None
Benjamin Peterson52baa292009-03-24 00:56:30 +0000255
Antoine Pitrou5acd41e2008-12-28 14:29:00 +0000256 def __enter__(self):
257 pass
Benjamin Peterson52baa292009-03-24 00:56:30 +0000258
Antoine Pitrou5acd41e2008-12-28 14:29:00 +0000259 def __exit__(self, exc_type, exc_value, traceback):
260 if exc_type is None:
261 try:
262 exc_name = self.expected.__name__
263 except AttributeError:
264 exc_name = str(self.expected)
265 if self.obj_name:
266 raise self.failureException("{0} not raised by {1}"
267 .format(exc_name, self.obj_name))
268 else:
269 raise self.failureException("{0} not raised"
270 .format(exc_name))
271 if issubclass(exc_type, self.expected):
272 return True
273 # Let unexpected exceptions skip through
274 return False
275
Benjamin Peterson52baa292009-03-24 00:56:30 +0000276
Benjamin Peterson1467ac82009-01-09 03:42:38 +0000277class TestCase(object):
Fred Drake02538202001-03-21 18:09:46 +0000278 """A class whose instances are single test cases.
279
Fred Drake02538202001-03-21 18:09:46 +0000280 By default, the test code itself should be placed in a method named
281 'runTest'.
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000282
Tim Petersa19a1682001-03-29 04:36:09 +0000283 If the fixture may be used for many test cases, create as
Fred Drake02538202001-03-21 18:09:46 +0000284 many test methods as are needed. When instantiating such a TestCase
285 subclass, specify in the constructor arguments the name of the test method
286 that the instance is to execute.
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000287
Tim Petersa19a1682001-03-29 04:36:09 +0000288 Test authors should subclass TestCase for their own tests. Construction
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000289 and deconstruction of the test's environment ('fixture') can be
290 implemented by overriding the 'setUp' and 'tearDown' methods respectively.
291
292 If it is necessary to override the __init__ method, the base class
293 __init__ method must always be called. It is important that subclasses
294 should not change the signature of their __init__ method, since instances
295 of the classes are instantiated automatically by parts of the framework
296 in order to be run.
Fred Drake02538202001-03-21 18:09:46 +0000297 """
Steve Purcell15d89272001-04-12 09:05:01 +0000298
299 # This attribute determines which exception will be raised when
300 # the instance's assertion methods fail; test methods raising this
301 # exception will be deemed to have 'failed' rather than 'errored'
302
303 failureException = AssertionError
304
Fred Drake02538202001-03-21 18:09:46 +0000305 def __init__(self, methodName='runTest'):
306 """Create an instance of the class that will use the named test
307 method when executed. Raises a ValueError if the instance does
308 not have a method with the specified name.
309 """
Benjamin Peterson52baa292009-03-24 00:56:30 +0000310 self._testMethodName = methodName
Fred Drake02538202001-03-21 18:09:46 +0000311 try:
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000312 testMethod = getattr(self, methodName)
Fred Drake02538202001-03-21 18:09:46 +0000313 except AttributeError:
Benjamin Peterson1467ac82009-01-09 03:42:38 +0000314 raise ValueError("no such test method in %s: %s" % \
315 (self.__class__, methodName))
Benjamin Peterson52baa292009-03-24 00:56:30 +0000316 self._testMethodDoc = testMethod.__doc__
Fred Drake02538202001-03-21 18:09:46 +0000317
318 def setUp(self):
319 "Hook method for setting up the test fixture before exercising it."
320 pass
321
322 def tearDown(self):
323 "Hook method for deconstructing the test fixture after testing it."
324 pass
325
326 def countTestCases(self):
327 return 1
328
329 def defaultTestResult(self):
330 return TestResult()
331
332 def shortDescription(self):
333 """Returns a one-line description of the test, or None if no
334 description has been provided.
335
336 The default implementation of this method returns the first line of
337 the specified test method's docstring.
338 """
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000339 doc = self._testMethodDoc
Steve Purcell7e743842003-09-22 11:08:12 +0000340 return doc and doc.split("\n")[0].strip() or None
Fred Drake02538202001-03-21 18:09:46 +0000341
342 def id(self):
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000343 return "%s.%s" % (_strclass(self.__class__), self._testMethodName)
Fred Drake02538202001-03-21 18:09:46 +0000344
Guido van Rossumd8faa362007-04-27 19:54:29 +0000345 def __eq__(self, other):
346 if type(self) is not type(other):
Benjamin Peterson52baa292009-03-24 00:56:30 +0000347 return NotImplemented
Guido van Rossumd8faa362007-04-27 19:54:29 +0000348
349 return self._testMethodName == other._testMethodName
350
351 def __ne__(self, other):
352 return not self == other
353
354 def __hash__(self):
355 return hash((type(self), self._testMethodName))
356
Fred Drake02538202001-03-21 18:09:46 +0000357 def __str__(self):
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000358 return "%s (%s)" % (self._testMethodName, _strclass(self.__class__))
Fred Drake02538202001-03-21 18:09:46 +0000359
360 def __repr__(self):
361 return "<%s testMethod=%s>" % \
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000362 (_strclass(self.__class__), self._testMethodName)
Fred Drake02538202001-03-21 18:09:46 +0000363
364 def run(self, result=None):
Benjamin Peterson52baa292009-03-24 00:56:30 +0000365 if result is None:
366 result = self.defaultTestResult()
Fred Drake02538202001-03-21 18:09:46 +0000367 result.startTest(self)
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000368 testMethod = getattr(self, self._testMethodName)
Fred Drake02538202001-03-21 18:09:46 +0000369 try:
370 try:
371 self.setUp()
Benjamin Peterson5254c042009-03-23 22:25:03 +0000372 except SkipTest as e:
373 result.addSkip(self, str(e))
374 return
Benjamin Peterson1467ac82009-01-09 03:42:38 +0000375 except Exception:
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000376 result.addError(self, self._exc_info())
Fred Drake02538202001-03-21 18:09:46 +0000377 return
378
Benjamin Peterson5254c042009-03-23 22:25:03 +0000379 success = False
Fred Drake02538202001-03-21 18:09:46 +0000380 try:
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000381 testMethod()
Skip Montanaroae5c37b2003-07-13 15:18:12 +0000382 except self.failureException:
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000383 result.addFailure(self, self._exc_info())
Benjamin Peterson5254c042009-03-23 22:25:03 +0000384 except _ExpectedFailure as e:
385 result.addExpectedFailure(self, e.exc_info)
386 except _UnexpectedSuccess:
387 result.addUnexpectedSuccess(self)
388 except SkipTest as e:
389 result.addSkip(self, str(e))
Benjamin Peterson1467ac82009-01-09 03:42:38 +0000390 except Exception:
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000391 result.addError(self, self._exc_info())
Benjamin Peterson5254c042009-03-23 22:25:03 +0000392 else:
393 success = True
Fred Drake02538202001-03-21 18:09:46 +0000394
395 try:
396 self.tearDown()
Benjamin Peterson1467ac82009-01-09 03:42:38 +0000397 except Exception:
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000398 result.addError(self, self._exc_info())
Benjamin Peterson5254c042009-03-23 22:25:03 +0000399 success = False
400 if success:
401 result.addSuccess(self)
Fred Drake02538202001-03-21 18:09:46 +0000402 finally:
403 result.stopTest(self)
404
Raymond Hettinger664347b2004-12-04 21:21:53 +0000405 def __call__(self, *args, **kwds):
406 return self.run(*args, **kwds)
Steve Purcell7e743842003-09-22 11:08:12 +0000407
Fred Drake02538202001-03-21 18:09:46 +0000408 def debug(self):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000409 """Run the test without collecting errors in a TestResult"""
Fred Drake02538202001-03-21 18:09:46 +0000410 self.setUp()
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000411 getattr(self, self._testMethodName)()
Fred Drake02538202001-03-21 18:09:46 +0000412 self.tearDown()
413
Georg Brandl81cdb4e2006-01-20 17:55:00 +0000414 def _exc_info(self):
Steve Purcell15d89272001-04-12 09:05:01 +0000415 """Return a version of sys.exc_info() with the traceback frame
416 minimised; usually the top level of the traceback frame is not
417 needed.
Fred Drake02538202001-03-21 18:09:46 +0000418 """
Guido van Rossumd8faa362007-04-27 19:54:29 +0000419 return sys.exc_info()
Fred Drake02538202001-03-21 18:09:46 +0000420
Benjamin Peterson5254c042009-03-23 22:25:03 +0000421 def skip(self, reason):
422 """Skip this test."""
423 raise SkipTest(reason)
424
Steve Purcell15d89272001-04-12 09:05:01 +0000425 def fail(self, msg=None):
426 """Fail immediately, with the given message."""
Collin Winterce36ad82007-08-30 01:19:48 +0000427 raise self.failureException(msg)
Fred Drake02538202001-03-21 18:09:46 +0000428
429 def failIf(self, expr, msg=None):
430 "Fail the test if the expression is true."
Benjamin Peterson52baa292009-03-24 00:56:30 +0000431 if expr:
432 raise self.failureException(msg)
Fred Drake02538202001-03-21 18:09:46 +0000433
Steve Purcell15d89272001-04-12 09:05:01 +0000434 def failUnless(self, expr, msg=None):
435 """Fail the test unless the expression is true."""
Benjamin Peterson52baa292009-03-24 00:56:30 +0000436 if not expr:
437 raise self.failureException(msg)
Steve Purcell15d89272001-04-12 09:05:01 +0000438
Antoine Pitrou5acd41e2008-12-28 14:29:00 +0000439 def failUnlessRaises(self, excClass, callableObj=None, *args, **kwargs):
Steve Purcell15d89272001-04-12 09:05:01 +0000440 """Fail unless an exception of class excClass is thrown
Fred Drake02538202001-03-21 18:09:46 +0000441 by callableObj when invoked with arguments args and keyword
442 arguments kwargs. If a different type of exception is
443 thrown, it will not be caught, and the test case will be
444 deemed to have suffered an error, exactly as for an
445 unexpected exception.
Antoine Pitrou5acd41e2008-12-28 14:29:00 +0000446
447 If called with callableObj omitted or None, will return a
448 context object used like this::
449
450 with self.failUnlessRaises(some_error_class):
451 do_something()
Fred Drake02538202001-03-21 18:09:46 +0000452 """
Antoine Pitrou5acd41e2008-12-28 14:29:00 +0000453 context = AssertRaisesContext(excClass, self, callableObj)
454 if callableObj is None:
455 return context
456 with context:
Guido van Rossum68468eb2003-02-27 20:14:51 +0000457 callableObj(*args, **kwargs)
Fred Drake02538202001-03-21 18:09:46 +0000458
Steve Purcell15d89272001-04-12 09:05:01 +0000459 def failUnlessEqual(self, first, second, msg=None):
Raymond Hettingerc377cbf2003-04-04 22:56:42 +0000460 """Fail if the two objects are unequal as determined by the '=='
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000461 operator.
462 """
Raymond Hettingerc377cbf2003-04-04 22:56:42 +0000463 if not first == second:
Collin Winterce36ad82007-08-30 01:19:48 +0000464 raise self.failureException(msg or '%r != %r' % (first, second))
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000465
Steve Purcell15d89272001-04-12 09:05:01 +0000466 def failIfEqual(self, first, second, msg=None):
467 """Fail if the two objects are equal as determined by the '=='
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000468 operator.
469 """
Steve Purcell15d89272001-04-12 09:05:01 +0000470 if first == second:
Collin Winterce36ad82007-08-30 01:19:48 +0000471 raise self.failureException(msg or '%r == %r' % (first, second))
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000472
Jeffrey Yasskinaaaef112007-09-07 15:00:39 +0000473 def failUnlessAlmostEqual(self, first, second, *, places=7, msg=None):
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000474 """Fail if the two objects are unequal as determined by their
475 difference rounded to the given number of decimal places
476 (default 7) and comparing to zero.
477
Steve Purcell397b45d2003-10-26 10:41:03 +0000478 Note that decimal places (from zero) are usually not the same
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000479 as significant digits (measured from the most signficant digit).
480 """
Jeffrey Yasskin1cc55442007-09-06 18:55:17 +0000481 if round(abs(second-first), places) != 0:
Benjamin Peterson1467ac82009-01-09 03:42:38 +0000482 raise self.failureException(
483 msg or '%r != %r within %r places' % (first, second, places))
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000484
Jeffrey Yasskinaaaef112007-09-07 15:00:39 +0000485 def failIfAlmostEqual(self, first, second, *, places=7, msg=None):
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000486 """Fail if the two objects are equal as determined by their
487 difference rounded to the given number of decimal places
488 (default 7) and comparing to zero.
489
Steve Purcellcca34912003-10-26 16:38:16 +0000490 Note that decimal places (from zero) are usually not the same
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000491 as significant digits (measured from the most signficant digit).
492 """
Jeffrey Yasskin1cc55442007-09-06 18:55:17 +0000493 if round(abs(second-first), places) == 0:
Benjamin Peterson1467ac82009-01-09 03:42:38 +0000494 raise self.failureException(
495 msg or '%r == %r within %r places' % (first, second, places))
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000496
Steve Purcell7e743842003-09-22 11:08:12 +0000497 # Synonyms for assertion methods
498
Steve Purcell15d89272001-04-12 09:05:01 +0000499 assertEqual = assertEquals = failUnlessEqual
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000500
Steve Purcell15d89272001-04-12 09:05:01 +0000501 assertNotEqual = assertNotEquals = failIfEqual
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000502
Raymond Hettingerc7b07692002-12-29 17:59:24 +0000503 assertAlmostEqual = assertAlmostEquals = failUnlessAlmostEqual
504
505 assertNotAlmostEqual = assertNotAlmostEquals = failIfAlmostEqual
506
Steve Purcell15d89272001-04-12 09:05:01 +0000507 assertRaises = failUnlessRaises
508
Steve Purcell7e743842003-09-22 11:08:12 +0000509 assert_ = assertTrue = failUnless
510
511 assertFalse = failIf
Steve Purcell15d89272001-04-12 09:05:01 +0000512
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000513
Fred Drake02538202001-03-21 18:09:46 +0000514
Benjamin Peterson1467ac82009-01-09 03:42:38 +0000515class TestSuite(object):
Fred Drake02538202001-03-21 18:09:46 +0000516 """A test suite is a composite test consisting of a number of TestCases.
517
518 For use, create an instance of TestSuite, then add test case instances.
519 When all tests have been added, the suite can be passed to a test
520 runner, such as TextTestRunner. It will run the individual test cases
521 in the order in which they were added, aggregating the results. When
522 subclassing, do not forget to call the base class constructor.
523 """
524 def __init__(self, tests=()):
525 self._tests = []
526 self.addTests(tests)
527
528 def __repr__(self):
Steve Purcelldc391a62002-08-09 09:46:23 +0000529 return "<%s tests=%s>" % (_strclass(self.__class__), self._tests)
Fred Drake02538202001-03-21 18:09:46 +0000530
Guido van Rossumd8faa362007-04-27 19:54:29 +0000531 def __eq__(self, other):
Benjamin Peterson5254c042009-03-23 22:25:03 +0000532 if not isinstance(other, self.__class__):
533 return NotImplemented
Guido van Rossumd8faa362007-04-27 19:54:29 +0000534 return self._tests == other._tests
535
536 def __ne__(self, other):
537 return not self == other
538
Jim Fultonfafd8742004-08-28 15:22:12 +0000539 def __iter__(self):
540 return iter(self._tests)
541
Fred Drake02538202001-03-21 18:09:46 +0000542 def countTestCases(self):
543 cases = 0
544 for test in self._tests:
Steve Purcell7e743842003-09-22 11:08:12 +0000545 cases += test.countTestCases()
Fred Drake02538202001-03-21 18:09:46 +0000546 return cases
547
548 def addTest(self, test):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000549 # sanity checks
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000550 if not hasattr(test, '__call__'):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000551 raise TypeError("the test to add must be callable")
Guido van Rossum13257902007-06-07 23:15:56 +0000552 if isinstance(test, type) and issubclass(test, (TestCase, TestSuite)):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000553 raise TypeError("TestCases and TestSuites must be instantiated "
554 "before passing them to addTest()")
Fred Drake02538202001-03-21 18:09:46 +0000555 self._tests.append(test)
556
557 def addTests(self, tests):
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000558 if isinstance(tests, str):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000559 raise TypeError("tests must be an iterable of tests, not a string")
Fred Drake02538202001-03-21 18:09:46 +0000560 for test in tests:
561 self.addTest(test)
562
563 def run(self, result):
Fred Drake02538202001-03-21 18:09:46 +0000564 for test in self._tests:
565 if result.shouldStop:
566 break
567 test(result)
568 return result
569
Raymond Hettinger664347b2004-12-04 21:21:53 +0000570 def __call__(self, *args, **kwds):
571 return self.run(*args, **kwds)
572
Fred Drake02538202001-03-21 18:09:46 +0000573 def debug(self):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000574 """Run the tests without collecting errors in a TestResult"""
Benjamin Peterson52baa292009-03-24 00:56:30 +0000575 for test in self._tests:
576 test.debug()
Fred Drake02538202001-03-21 18:09:46 +0000577
578
Benjamin Peterson5254c042009-03-23 22:25:03 +0000579class ClassTestSuite(TestSuite):
580 """
581 Suite of tests derived from a single TestCase class.
582 """
583
584 def __init__(self, tests, class_collected_from):
585 super(ClassTestSuite, self).__init__(tests)
586 self.collected_from = class_collected_from
587
588 def id(self):
589 module = getattr(self.collected_from, "__module__", None)
590 if module is not None:
591 return "{0}.{1}".format(module, self.collected_from.__name__)
592 return self.collected_from.__name__
593
594 def run(self, result):
595 if getattr(self.collected_from, "__unittest_skip__", False):
596 # ClassTestSuite result pretends to be a TestCase enough to be
597 # reported.
598 result.startTest(self)
599 try:
600 result.addSkip(self, self.collected_from.__unittest_skip_why__)
601 finally:
602 result.stopTest(self)
603 else:
604 result = super(ClassTestSuite, self).run(result)
605 return result
606
607 shortDescription = id
608
609
Fred Drake02538202001-03-21 18:09:46 +0000610class FunctionTestCase(TestCase):
611 """A test case that wraps a test function.
612
613 This is useful for slipping pre-existing test functions into the
Guido van Rossumd8faa362007-04-27 19:54:29 +0000614 unittest framework. Optionally, set-up and tidy-up functions can be
Fred Drake02538202001-03-21 18:09:46 +0000615 supplied. As with TestCase, the tidy-up ('tearDown') function will
616 always be called if the set-up ('setUp') function ran successfully.
617 """
618
Benjamin Peterson52baa292009-03-24 00:56:30 +0000619 def __init__(self, testFunc, setUp=None, tearDown=None, description=None):
620 super(FunctionTestCase, self).__init__()
Fred Drake02538202001-03-21 18:09:46 +0000621 self.__setUpFunc = setUp
622 self.__tearDownFunc = tearDown
623 self.__testFunc = testFunc
624 self.__description = description
625
626 def setUp(self):
627 if self.__setUpFunc is not None:
628 self.__setUpFunc()
629
630 def tearDown(self):
631 if self.__tearDownFunc is not None:
632 self.__tearDownFunc()
633
634 def runTest(self):
635 self.__testFunc()
636
637 def id(self):
638 return self.__testFunc.__name__
639
Guido van Rossumd8faa362007-04-27 19:54:29 +0000640 def __eq__(self, other):
Benjamin Peterson52baa292009-03-24 00:56:30 +0000641 if not isinstance(other, self.__class__):
642 return NotImplemented
Guido van Rossumd8faa362007-04-27 19:54:29 +0000643
644 return self.__setUpFunc == other.__setUpFunc and \
645 self.__tearDownFunc == other.__tearDownFunc and \
646 self.__testFunc == other.__testFunc and \
647 self.__description == other.__description
648
649 def __ne__(self, other):
650 return not self == other
651
652 def __hash__(self):
653 return hash((type(self), self.__setUpFunc, self.__tearDownFunc,
Collin Winterce36ad82007-08-30 01:19:48 +0000654 self.__testFunc, self.__description))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000655
Fred Drake02538202001-03-21 18:09:46 +0000656 def __str__(self):
Collin Winterce36ad82007-08-30 01:19:48 +0000657 return "%s (%s)" % (_strclass(self.__class__),
658 self.__testFunc.__name__)
Fred Drake02538202001-03-21 18:09:46 +0000659
660 def __repr__(self):
Collin Winterce36ad82007-08-30 01:19:48 +0000661 return "<%s testFunc=%s>" % (_strclass(self.__class__),
662 self.__testFunc)
Fred Drake02538202001-03-21 18:09:46 +0000663
664 def shortDescription(self):
665 if self.__description is not None: return self.__description
666 doc = self.__testFunc.__doc__
Steve Purcell7e743842003-09-22 11:08:12 +0000667 return doc and doc.split("\n")[0].strip() or None
Fred Drake02538202001-03-21 18:09:46 +0000668
669
670
671##############################################################################
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000672# Locating and loading tests
Fred Drake02538202001-03-21 18:09:46 +0000673##############################################################################
674
Raymond Hettingerd4cb56d2008-01-30 02:55:10 +0000675def CmpToKey(mycmp):
676 'Convert a cmp= function into a key= function'
677 class K(object):
678 def __init__(self, obj, *args):
679 self.obj = obj
680 def __lt__(self, other):
681 return mycmp(self.obj, other.obj) == -1
682 return K
683
Mark Dickinsona56c4672009-01-27 18:17:45 +0000684def three_way_cmp(x, y):
685 """Return -1 if x < y, 0 if x == y and 1 if x > y"""
686 return (x > y) - (x < y)
687
Benjamin Peterson1467ac82009-01-09 03:42:38 +0000688class TestLoader(object):
Benjamin Peterson52baa292009-03-24 00:56:30 +0000689 """
690 This class is responsible for loading tests according to various criteria
691 and returning them wrapped in a TestSuite
Fred Drake02538202001-03-21 18:09:46 +0000692 """
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000693 testMethodPrefix = 'test'
Mark Dickinsona56c4672009-01-27 18:17:45 +0000694 sortTestMethodsUsing = staticmethod(three_way_cmp)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000695 suiteClass = TestSuite
Benjamin Peterson5254c042009-03-23 22:25:03 +0000696 classSuiteClass = ClassTestSuite
Fred Drake02538202001-03-21 18:09:46 +0000697
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000698 def loadTestsFromTestCase(self, testCaseClass):
Steve Purcell15d89272001-04-12 09:05:01 +0000699 """Return a suite of all tests cases contained in testCaseClass"""
Johannes Gijsbersd7b6ad42004-11-07 15:46:25 +0000700 if issubclass(testCaseClass, TestSuite):
Benjamin Peterson52baa292009-03-24 00:56:30 +0000701 raise TypeError("Test cases should not be derived from TestSuite." \
702 " Maybe you meant to derive from TestCase?")
Steve Purcell7e743842003-09-22 11:08:12 +0000703 testCaseNames = self.getTestCaseNames(testCaseClass)
704 if not testCaseNames and hasattr(testCaseClass, 'runTest'):
705 testCaseNames = ['runTest']
Benjamin Peterson5254c042009-03-23 22:25:03 +0000706 suite = self.classSuiteClass(map(testCaseClass, testCaseNames),
707 testCaseClass)
708 return suite
Fred Drake02538202001-03-21 18:09:46 +0000709
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000710 def loadTestsFromModule(self, module):
Steve Purcell15d89272001-04-12 09:05:01 +0000711 """Return a suite of all tests cases contained in the given module"""
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000712 tests = []
713 for name in dir(module):
714 obj = getattr(module, name)
Guido van Rossum13257902007-06-07 23:15:56 +0000715 if isinstance(obj, type) and issubclass(obj, TestCase):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000716 tests.append(self.loadTestsFromTestCase(obj))
717 return self.suiteClass(tests)
Fred Drake02538202001-03-21 18:09:46 +0000718
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000719 def loadTestsFromName(self, name, module=None):
Steve Purcell15d89272001-04-12 09:05:01 +0000720 """Return a suite of all tests cases given a string specifier.
721
722 The name may resolve either to a module, a test case class, a
723 test method within a test case class, or a callable object which
724 returns a TestCase or TestSuite instance.
Tim Peters613b2222001-04-13 05:37:27 +0000725
Steve Purcell15d89272001-04-12 09:05:01 +0000726 The method optionally resolves the names relative to a given module.
727 """
Steve Purcell7e743842003-09-22 11:08:12 +0000728 parts = name.split('.')
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000729 if module is None:
Steve Purcell7e743842003-09-22 11:08:12 +0000730 parts_copy = parts[:]
731 while parts_copy:
732 try:
733 module = __import__('.'.join(parts_copy))
734 break
735 except ImportError:
736 del parts_copy[-1]
Benjamin Peterson52baa292009-03-24 00:56:30 +0000737 if not parts_copy:
738 raise
Armin Rigo1b3c04b2003-10-24 17:15:29 +0000739 parts = parts[1:]
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000740 obj = module
741 for part in parts:
Steve Purcell7e743842003-09-22 11:08:12 +0000742 parent, obj = obj, getattr(obj, part)
Fred Drake02538202001-03-21 18:09:46 +0000743
Benjamin Peterson1467ac82009-01-09 03:42:38 +0000744 if isinstance(obj, types.ModuleType):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000745 return self.loadTestsFromModule(obj)
Guido van Rossum13257902007-06-07 23:15:56 +0000746 elif isinstance(obj, type) and issubclass(obj, TestCase):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000747 return self.loadTestsFromTestCase(obj)
Christian Heimes4a22b5d2007-11-25 09:39:14 +0000748 elif (isinstance(obj, types.FunctionType) and
Guido van Rossum13257902007-06-07 23:15:56 +0000749 isinstance(parent, type) and
Guido van Rossumd8faa362007-04-27 19:54:29 +0000750 issubclass(parent, TestCase)):
Christian Heimes4a22b5d2007-11-25 09:39:14 +0000751 name = obj.__name__
752 inst = parent(name)
753 # static methods follow a different path
Christian Heimes4975a1f2007-11-26 10:14:51 +0000754 if not isinstance(getattr(inst, name), types.FunctionType):
Christian Heimes4a22b5d2007-11-25 09:39:14 +0000755 return TestSuite([inst])
Steve Purcell397b45d2003-10-26 10:41:03 +0000756 elif isinstance(obj, TestSuite):
Steve Purcell7e743842003-09-22 11:08:12 +0000757 return obj
Christian Heimes4a22b5d2007-11-25 09:39:14 +0000758
759 if hasattr(obj, '__call__'):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000760 test = obj()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000761 if isinstance(test, TestSuite):
762 return test
763 elif isinstance(test, TestCase):
764 return TestSuite([test])
765 else:
766 raise TypeError("calling %s returned %s, not a test" %
767 (obj, test))
Fred Drake02538202001-03-21 18:09:46 +0000768 else:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000769 raise TypeError("don't know how to make test from: %s" % obj)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000770
771 def loadTestsFromNames(self, names, module=None):
Steve Purcell15d89272001-04-12 09:05:01 +0000772 """Return a suite of all tests cases found using the given sequence
773 of string specifiers. See 'loadTestsFromName()'.
774 """
Steve Purcell7e743842003-09-22 11:08:12 +0000775 suites = [self.loadTestsFromName(name, module) for name in names]
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000776 return self.suiteClass(suites)
777
778 def getTestCaseNames(self, testCaseClass):
Steve Purcell15d89272001-04-12 09:05:01 +0000779 """Return a sorted sequence of method names found within testCaseClass
780 """
Collin Winterce36ad82007-08-30 01:19:48 +0000781 def isTestMethod(attrname, testCaseClass=testCaseClass,
782 prefix=self.testMethodPrefix):
Benjamin Peterson52baa292009-03-24 00:56:30 +0000783 return attrname.startswith(prefix) and \
784 hasattr(getattr(testCaseClass, attrname), '__call__')
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000785 testFnNames = list(filter(isTestMethod, dir(testCaseClass)))
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000786 if self.sortTestMethodsUsing:
Raymond Hettingerd4cb56d2008-01-30 02:55:10 +0000787 testFnNames.sort(key=CmpToKey(self.sortTestMethodsUsing))
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000788 return testFnNames
789
790
791
792defaultTestLoader = TestLoader()
793
794
795##############################################################################
796# Patches for old functions: these functions should be considered obsolete
797##############################################################################
798
799def _makeLoader(prefix, sortUsing, suiteClass=None):
800 loader = TestLoader()
801 loader.sortTestMethodsUsing = sortUsing
802 loader.testMethodPrefix = prefix
803 if suiteClass: loader.suiteClass = suiteClass
804 return loader
805
Mark Dickinsonc429a832009-01-27 20:27:05 +0000806def getTestCaseNames(testCaseClass, prefix, sortUsing=three_way_cmp):
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000807 return _makeLoader(prefix, sortUsing).getTestCaseNames(testCaseClass)
808
Mark Dickinsonc429a832009-01-27 20:27:05 +0000809def makeSuite(testCaseClass, prefix='test', sortUsing=three_way_cmp,
810 suiteClass=TestSuite):
811 return _makeLoader(prefix, sortUsing, suiteClass).loadTestsFromTestCase(
812 testCaseClass)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000813
Mark Dickinsonc429a832009-01-27 20:27:05 +0000814def findTestCases(module, prefix='test', sortUsing=three_way_cmp,
815 suiteClass=TestSuite):
816 return _makeLoader(prefix, sortUsing, suiteClass).loadTestsFromModule(
817 module)
Fred Drake02538202001-03-21 18:09:46 +0000818
819
820##############################################################################
821# Text UI
822##############################################################################
823
Benjamin Peterson1467ac82009-01-09 03:42:38 +0000824class _WritelnDecorator(object):
Fred Drake02538202001-03-21 18:09:46 +0000825 """Used to decorate file-like objects with a handy 'writeln' method"""
826 def __init__(self,stream):
827 self.stream = stream
Fred Drake02538202001-03-21 18:09:46 +0000828
829 def __getattr__(self, attr):
830 return getattr(self.stream,attr)
831
Raymond Hettinger91dd19d2003-09-13 02:58:00 +0000832 def writeln(self, arg=None):
833 if arg: self.write(arg)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000834 self.write('\n') # text-mode streams translate to \r\n if needed
Tim Petersa19a1682001-03-29 04:36:09 +0000835
Fred Drake02538202001-03-21 18:09:46 +0000836
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000837class _TextTestResult(TestResult):
Fred Drake02538202001-03-21 18:09:46 +0000838 """A test result class that can print formatted text results to a stream.
839
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000840 Used by TextTestRunner.
Fred Drake02538202001-03-21 18:09:46 +0000841 """
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000842 separator1 = '=' * 70
843 separator2 = '-' * 70
Fred Drake02538202001-03-21 18:09:46 +0000844
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000845 def __init__(self, stream, descriptions, verbosity):
Benjamin Peterson52baa292009-03-24 00:56:30 +0000846 super(_TextTestResult, self).__init__()
Fred Drake02538202001-03-21 18:09:46 +0000847 self.stream = stream
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000848 self.showAll = verbosity > 1
849 self.dots = verbosity == 1
Fred Drake02538202001-03-21 18:09:46 +0000850 self.descriptions = descriptions
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000851
852 def getDescription(self, test):
853 if self.descriptions:
854 return test.shortDescription() or str(test)
855 else:
856 return str(test)
857
Fred Drake02538202001-03-21 18:09:46 +0000858 def startTest(self, test):
Benjamin Peterson52baa292009-03-24 00:56:30 +0000859 super(_TextTestResult, self).startTest(test)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000860 if self.showAll:
861 self.stream.write(self.getDescription(test))
862 self.stream.write(" ... ")
Alexandre Vassalotti8ae3e052008-05-16 00:41:41 +0000863 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +0000864
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000865 def addSuccess(self, test):
Benjamin Peterson52baa292009-03-24 00:56:30 +0000866 super(_TextTestResult, self).addSuccess(test)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000867 if self.showAll:
Fred Drake02538202001-03-21 18:09:46 +0000868 self.stream.writeln("ok")
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000869 elif self.dots:
870 self.stream.write('.')
Alexandre Vassalotti8ae3e052008-05-16 00:41:41 +0000871 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +0000872
873 def addError(self, test, err):
Benjamin Peterson52baa292009-03-24 00:56:30 +0000874 super(_TextTestResult, self).addError(test, err)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000875 if self.showAll:
876 self.stream.writeln("ERROR")
877 elif self.dots:
878 self.stream.write('E')
Alexandre Vassalotti8ae3e052008-05-16 00:41:41 +0000879 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +0000880
881 def addFailure(self, test, err):
Benjamin Peterson52baa292009-03-24 00:56:30 +0000882 super(_TextTestResult, self).addFailure(test, err)
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000883 if self.showAll:
884 self.stream.writeln("FAIL")
885 elif self.dots:
886 self.stream.write('F')
Alexandre Vassalotti8ae3e052008-05-16 00:41:41 +0000887 self.stream.flush()
Fred Drake02538202001-03-21 18:09:46 +0000888
Benjamin Peterson5254c042009-03-23 22:25:03 +0000889 def addSkip(self, test, reason):
Benjamin Peterson52baa292009-03-24 00:56:30 +0000890 super(_TextTestResult, self).addSkip(test, reason)
Benjamin Peterson5254c042009-03-23 22:25:03 +0000891 if self.showAll:
892 self.stream.writeln("skipped {0!r}".format(reason))
893 elif self.dots:
894 self.stream.write("s")
895 self.stream.flush()
896
897 def addExpectedFailure(self, test, err):
Benjamin Peterson52baa292009-03-24 00:56:30 +0000898 super(_TextTestResult, self).addExpectedFailure(test, err)
Benjamin Peterson5254c042009-03-23 22:25:03 +0000899 if self.showAll:
900 self.stream.writeln("expected failure")
901 elif self.dots:
902 self.stream.write(".")
903 self.stream.flush()
904
905 def addUnexpectedSuccess(self, test):
Benjamin Peterson52baa292009-03-24 00:56:30 +0000906 super(_TextTestResult, self).addUnexpectedSuccess(test)
Benjamin Peterson5254c042009-03-23 22:25:03 +0000907 if self.showAll:
908 self.stream.writeln("unexpected success")
909 elif self.dots:
910 self.stream.write(".")
911 self.stream.flush()
912
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000913 def printErrors(self):
914 if self.dots or self.showAll:
Fred Drake02538202001-03-21 18:09:46 +0000915 self.stream.writeln()
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000916 self.printErrorList('ERROR', self.errors)
917 self.printErrorList('FAIL', self.failures)
918
919 def printErrorList(self, flavour, errors):
920 for test, err in errors:
921 self.stream.writeln(self.separator1)
922 self.stream.writeln("%s: %s" % (flavour,self.getDescription(test)))
923 self.stream.writeln(self.separator2)
Steve Purcell7b065702001-09-06 08:24:40 +0000924 self.stream.writeln("%s" % err)
Fred Drake02538202001-03-21 18:09:46 +0000925
926
Benjamin Peterson1467ac82009-01-09 03:42:38 +0000927class TextTestRunner(object):
Fred Drake02538202001-03-21 18:09:46 +0000928 """A test runner class that displays results in textual form.
Tim Petersa19a1682001-03-29 04:36:09 +0000929
Fred Drake02538202001-03-21 18:09:46 +0000930 It prints out the names of tests as they are run, errors as they
931 occur, and a summary of the results at the end of the test run.
932 """
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000933 def __init__(self, stream=sys.stderr, descriptions=1, verbosity=1):
Fred Drake02538202001-03-21 18:09:46 +0000934 self.stream = _WritelnDecorator(stream)
935 self.descriptions = descriptions
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000936 self.verbosity = verbosity
937
938 def _makeResult(self):
939 return _TextTestResult(self.stream, self.descriptions, self.verbosity)
Fred Drake02538202001-03-21 18:09:46 +0000940
941 def run(self, test):
942 "Run the given test case or test suite."
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000943 result = self._makeResult()
Fred Drake02538202001-03-21 18:09:46 +0000944 startTime = time.time()
945 test(result)
946 stopTime = time.time()
Steve Purcell397b45d2003-10-26 10:41:03 +0000947 timeTaken = stopTime - startTime
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000948 result.printErrors()
949 self.stream.writeln(result.separator2)
Fred Drake02538202001-03-21 18:09:46 +0000950 run = result.testsRun
951 self.stream.writeln("Ran %d test%s in %.3fs" %
Neal Norwitz76165042002-05-31 14:15:11 +0000952 (run, run != 1 and "s" or "", timeTaken))
Fred Drake02538202001-03-21 18:09:46 +0000953 self.stream.writeln()
Benjamin Peterson52baa292009-03-24 00:56:30 +0000954 results = map(len, (result.expectedFailures,
955 result.unexpectedSuccesses,
Benjamin Peterson5254c042009-03-23 22:25:03 +0000956 result.skipped))
Benjamin Peterson52baa292009-03-24 00:56:30 +0000957 expectedFails, unexpectedSuccesses, skipped = results
Benjamin Peterson5254c042009-03-23 22:25:03 +0000958 infos = []
Fred Drake02538202001-03-21 18:09:46 +0000959 if not result.wasSuccessful():
Benjamin Peterson5254c042009-03-23 22:25:03 +0000960 self.stream.write("FAILED")
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000961 failed, errored = len(result.failures), len(result.errors)
Fred Drake02538202001-03-21 18:09:46 +0000962 if failed:
Benjamin Peterson5254c042009-03-23 22:25:03 +0000963 infos.append("failures=%d" % failed)
Fred Drake02538202001-03-21 18:09:46 +0000964 if errored:
Benjamin Peterson5254c042009-03-23 22:25:03 +0000965 infos.append("errors=%d" % errored)
Fred Drake02538202001-03-21 18:09:46 +0000966 else:
Benjamin Peterson52baa292009-03-24 00:56:30 +0000967 self.stream.writeln("OK")
Benjamin Peterson5254c042009-03-23 22:25:03 +0000968 if skipped:
969 infos.append("skipped=%d" % skipped)
Benjamin Peterson52baa292009-03-24 00:56:30 +0000970 if expectedFails:
971 infos.append("expected failures=%d" % expectedFails)
972 if unexpectedSuccesses:
973 infos.append("unexpected successes=%d" % unexpectedSuccesses)
Benjamin Peterson5254c042009-03-23 22:25:03 +0000974 if infos:
975 self.stream.writeln(" (%s)" % (", ".join(infos),))
Fred Drake02538202001-03-21 18:09:46 +0000976 return result
Tim Petersa19a1682001-03-29 04:36:09 +0000977
Fred Drake02538202001-03-21 18:09:46 +0000978
Fred Drake02538202001-03-21 18:09:46 +0000979
980##############################################################################
981# Facilities for running tests from the command line
982##############################################################################
983
Benjamin Peterson1467ac82009-01-09 03:42:38 +0000984class TestProgram(object):
Fred Drake02538202001-03-21 18:09:46 +0000985 """A command-line program that runs a set of tests; this is primarily
986 for making test modules conveniently executable.
987 """
988 USAGE = """\
Steve Purcell17a781b2001-04-09 15:37:31 +0000989Usage: %(progName)s [options] [test] [...]
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000990
991Options:
992 -h, --help Show this message
993 -v, --verbose Verbose output
994 -q, --quiet Minimal output
Fred Drake02538202001-03-21 18:09:46 +0000995
996Examples:
997 %(progName)s - run default set of tests
998 %(progName)s MyTestSuite - run suite 'MyTestSuite'
Steve Purcell5ddd1a82001-03-22 08:45:36 +0000999 %(progName)s MyTestCase.testSomething - run MyTestCase.testSomething
1000 %(progName)s MyTestCase - run all 'test*' test methods
Fred Drake02538202001-03-21 18:09:46 +00001001 in MyTestCase
1002"""
1003 def __init__(self, module='__main__', defaultTest=None,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001004 argv=None, testRunner=TextTestRunner,
1005 testLoader=defaultTestLoader):
Antoine Pitroue7bd8682009-01-09 19:29:16 +00001006 if isinstance(module, str):
Fred Drake02538202001-03-21 18:09:46 +00001007 self.module = __import__(module)
Steve Purcell7e743842003-09-22 11:08:12 +00001008 for part in module.split('.')[1:]:
Fred Drake02538202001-03-21 18:09:46 +00001009 self.module = getattr(self.module, part)
1010 else:
1011 self.module = module
1012 if argv is None:
1013 argv = sys.argv
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001014 self.verbosity = 1
Fred Drake02538202001-03-21 18:09:46 +00001015 self.defaultTest = defaultTest
1016 self.testRunner = testRunner
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001017 self.testLoader = testLoader
Fred Drake02538202001-03-21 18:09:46 +00001018 self.progName = os.path.basename(argv[0])
1019 self.parseArgs(argv)
Fred Drake02538202001-03-21 18:09:46 +00001020 self.runTests()
1021
1022 def usageExit(self, msg=None):
Benjamin Peterson52baa292009-03-24 00:56:30 +00001023 if msg:
1024 print(msg)
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001025 print(self.USAGE % self.__dict__)
Fred Drake02538202001-03-21 18:09:46 +00001026 sys.exit(2)
1027
1028 def parseArgs(self, argv):
1029 import getopt
Benjamin Peterson5254c042009-03-23 22:25:03 +00001030 long_opts = ['help','verbose','quiet']
Fred Drake02538202001-03-21 18:09:46 +00001031 try:
Benjamin Peterson5254c042009-03-23 22:25:03 +00001032 options, args = getopt.getopt(argv[1:], 'hHvq', long_opts)
Fred Drake02538202001-03-21 18:09:46 +00001033 for opt, value in options:
1034 if opt in ('-h','-H','--help'):
1035 self.usageExit()
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001036 if opt in ('-q','--quiet'):
1037 self.verbosity = 0
1038 if opt in ('-v','--verbose'):
1039 self.verbosity = 2
Fred Drake02538202001-03-21 18:09:46 +00001040 if len(args) == 0 and self.defaultTest is None:
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001041 self.test = self.testLoader.loadTestsFromModule(self.module)
1042 return
Fred Drake02538202001-03-21 18:09:46 +00001043 if len(args) > 0:
1044 self.testNames = args
1045 else:
1046 self.testNames = (self.defaultTest,)
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001047 self.createTests()
Guido van Rossumb940e112007-01-10 16:19:56 +00001048 except getopt.error as msg:
Fred Drake02538202001-03-21 18:09:46 +00001049 self.usageExit(msg)
1050
1051 def createTests(self):
Steve Purcell5ddd1a82001-03-22 08:45:36 +00001052 self.test = self.testLoader.loadTestsFromNames(self.testNames,
1053 self.module)
Fred Drake02538202001-03-21 18:09:46 +00001054
1055 def runTests(self):
Guido van Rossum13257902007-06-07 23:15:56 +00001056 if isinstance(self.testRunner, type):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001057 try:
1058 testRunner = self.testRunner(verbosity=self.verbosity)
1059 except TypeError:
1060 # didn't accept the verbosity argument
1061 testRunner = self.testRunner()
1062 else:
1063 # it is assumed to be a TestRunner instance
1064 testRunner = self.testRunner
1065 result = testRunner.run(self.test)
Tim Petersa19a1682001-03-29 04:36:09 +00001066 sys.exit(not result.wasSuccessful())
Fred Drake02538202001-03-21 18:09:46 +00001067
1068main = TestProgram
1069
1070
1071##############################################################################
1072# Executing this module from the command line
1073##############################################################################
1074
1075if __name__ == "__main__":
1076 main(module=None)