[Python-checkins] python/dist/src/Lib unittest.py,1.26,1.27
purcell at users.sourceforge.net
purcell at users.sourceforge.net
Mon Sep 22 07:08:14 EDT 2003
Update of /cvsroot/python/python/dist/src/Lib
In directory sc8-pr-cvs1:/tmp/cvs-serv29369
Modified Files:
unittest.py
Log Message:
- Fixed loading of tests by name when name refers to unbound
method (PyUnit issue 563882, thanks to Alexandre Fayolle)
- Ignore non-callable attributes of classes when searching for test
method names (PyUnit issue 769338, thanks to Seth Falcon)
- New assertTrue and assertFalse aliases for comfort of JUnit users
- Automatically discover 'runTest()' test methods (PyUnit issue 469444,
thanks to Roeland Rengelink)
- Dropped Python 1.5.2 compatibility, merged appropriate shortcuts from
Python CVS; should work with Python >= 2.1.
- Removed all references to string module by using string methods instead
Index: unittest.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/unittest.py,v
retrieving revision 1.26
retrieving revision 1.27
diff -C2 -d -r1.26 -r1.27
*** unittest.py 15 Sep 2003 11:01:21 -0000 1.26
--- unittest.py 22 Sep 2003 11:08:12 -0000 1.27
***************
*** 28,32 ****
http://pyunit.sourceforge.net/
! Copyright (c) 1999, 2000, 2001 Steve Purcell
This module is free software, and you may redistribute it and/or modify
it under the same terms as Python itself, so long as this copyright message
--- 28,32 ----
http://pyunit.sourceforge.net/
! Copyright (c) 1999-2003 Steve Purcell
This module is free software, and you may redistribute it and/or modify
it under the same terms as Python itself, so long as this copyright message
***************
*** 47,56 ****
__author__ = "Steve Purcell"
__email__ = "stephen_purcell at yahoo dot com"
! __version__ = "#Revision: 1.46 $"[11:-2]
import time
import sys
import traceback
- import string
import os
import types
--- 47,55 ----
__author__ = "Steve Purcell"
__email__ = "stephen_purcell at yahoo dot com"
! __version__ = "#Revision: 1.56 $"[11:-2]
import time
import sys
import traceback
import os
import types
***************
*** 62,70 ****
'TestLoader', 'FunctionTestCase', 'main', 'defaultTestLoader']
! # Expose obsolete functions for backwards compatability
__all__.extend(['getTestCaseNames', 'makeSuite', 'findTestCases'])
##############################################################################
# Test framework core
##############################################################################
--- 61,85 ----
'TestLoader', 'FunctionTestCase', 'main', 'defaultTestLoader']
! # Expose obsolete functions for backwards compatibility
__all__.extend(['getTestCaseNames', 'makeSuite', 'findTestCases'])
##############################################################################
+ # Backward compatibility
+ ##############################################################################
+ if sys.version_info[:2] < (2, 2):
+ False, True = 0, 1
+ def isinstance(obj, clsinfo):
+ import __builtin__
+ if type(clsinfo) in (types.TupleType, types.ListType):
+ for cls in clsinfo:
+ if cls is type: cls = types.ClassType
+ if __builtin__.isinstance(obj, cls):
+ return 1
+ return 0
+ else: return __builtin__.isinstance(obj, clsinfo)
+
+
+ ##############################################################################
# Test framework core
##############################################################################
***************
*** 122,130 ****
def stop(self):
"Indicates that the tests should be aborted"
! self.shouldStop = 1
def _exc_info_to_string(self, err):
"""Converts a sys.exc_info()-style tuple of values into a string."""
! return string.join(traceback.format_exception(*err), '')
def __repr__(self):
--- 137,145 ----
def stop(self):
"Indicates that the tests should be aborted"
! self.shouldStop = True
def _exc_info_to_string(self, err):
"""Converts a sys.exc_info()-style tuple of values into a string."""
! return ''.join(traceback.format_exception(*err))
def __repr__(self):
***************
*** 197,201 ****
"""
doc = self.__testMethodDoc
! return doc and string.strip(string.split(doc, "\n")[0]) or None
def id(self):
--- 212,216 ----
"""
doc = self.__testMethodDoc
! return doc and doc.split("\n")[0].strip() or None
def id(self):
***************
*** 210,216 ****
def run(self, result=None):
- return self(result)
-
- def __call__(self, result=None):
if result is None: result = self.defaultTestResult()
result.startTest(self)
--- 225,228 ----
***************
*** 225,232 ****
return
! ok = 0
try:
testMethod()
! ok = 1
except self.failureException:
result.addFailure(self, self.__exc_info())
--- 237,244 ----
return
! ok = False
try:
testMethod()
! ok = True
except self.failureException:
result.addFailure(self, self.__exc_info())
***************
*** 242,250 ****
except:
result.addError(self, self.__exc_info())
! ok = 0
if ok: result.addSuccess(self)
finally:
result.stopTest(self)
def debug(self):
"""Run the test without collecting errors in a TestResult"""
--- 254,264 ----
except:
result.addError(self, self.__exc_info())
! ok = False
if ok: result.addSuccess(self)
finally:
result.stopTest(self)
+ __call__ = run
+
def debug(self):
"""Run the test without collecting errors in a TestResult"""
***************
*** 293,297 ****
if hasattr(excClass,'__name__'): excName = excClass.__name__
else: excName = str(excClass)
! raise self.failureException, excName
def failUnlessEqual(self, first, second, msg=None):
--- 307,311 ----
if hasattr(excClass,'__name__'): excName = excClass.__name__
else: excName = str(excClass)
! raise self.failureException, "%s not raised" % excName
def failUnlessEqual(self, first, second, msg=None):
***************
*** 335,338 ****
--- 349,354 ----
(msg or '%s == %s within %s places' % (`first`, `second`, `places`))
+ # Synonyms for assertion methods
+
assertEqual = assertEquals = failUnlessEqual
***************
*** 345,349 ****
assertRaises = failUnlessRaises
! assert_ = failUnless
--- 361,367 ----
assertRaises = failUnlessRaises
! assert_ = assertTrue = failUnless
!
! assertFalse = failIf
***************
*** 370,374 ****
cases = 0
for test in self._tests:
! cases = cases + test.countTestCases()
return cases
--- 388,392 ----
cases = 0
for test in self._tests:
! cases += test.countTestCases()
return cases
***************
*** 435,439 ****
if self.__description is not None: return self.__description
doc = self.__testFunc.__doc__
! return doc and string.strip(string.split(doc, "\n")[0]) or None
--- 453,457 ----
if self.__description is not None: return self.__description
doc = self.__testFunc.__doc__
! return doc and doc.split("\n")[0].strip() or None
***************
*** 453,458 ****
def loadTestsFromTestCase(self, testCaseClass):
"""Return a suite of all tests cases contained in testCaseClass"""
! return self.suiteClass(map(testCaseClass,
! self.getTestCaseNames(testCaseClass)))
def loadTestsFromModule(self, module):
--- 471,478 ----
def loadTestsFromTestCase(self, testCaseClass):
"""Return a suite of all tests cases contained in testCaseClass"""
! testCaseNames = self.getTestCaseNames(testCaseClass)
! if not testCaseNames and hasattr(testCaseClass, 'runTest'):
! testCaseNames = ['runTest']
! return self.suiteClass(map(testCaseClass, testCaseNames))
def loadTestsFromModule(self, module):
***************
*** 475,495 ****
The method optionally resolves the names relative to a given module.
"""
! parts = string.split(name, '.')
if module is None:
! if not parts:
! raise ValueError, "incomplete test name: %s" % name
! else:
! parts_copy = parts[:]
! while parts_copy:
! try:
! module = __import__(string.join(parts_copy,'.'))
! break
! except ImportError:
! del parts_copy[-1]
! if not parts_copy: raise
parts = parts[1:]
obj = module
for part in parts:
! obj = getattr(obj, part)
import unittest
--- 495,512 ----
The method optionally resolves the names relative to a given module.
"""
! parts = name.split('.')
if module is None:
! parts_copy = parts[:]
! while parts_copy:
! try:
! module = __import__('.'.join(parts_copy))
! break
! except ImportError:
! del parts_copy[-1]
! if not parts_copy: raise
parts = parts[1:]
obj = module
for part in parts:
! parent, obj = obj, getattr(obj, part)
import unittest
***************
*** 500,508 ****
return self.loadTestsFromTestCase(obj)
elif type(obj) == types.UnboundMethodType:
return obj.im_class(obj.__name__)
elif callable(obj):
test = obj()
! if not isinstance(test, unittest.TestCase) and \
! not isinstance(test, unittest.TestSuite):
raise ValueError, \
"calling %s returned %s, not a test" % (obj,test)
--- 517,527 ----
return self.loadTestsFromTestCase(obj)
elif type(obj) == types.UnboundMethodType:
+ return parent(obj.__name__)
return obj.im_class(obj.__name__)
+ elif isinstance(obj, unittest.TestSuite):
+ return obj
elif callable(obj):
test = obj()
! if not isinstance(test, (unittest.TestCase, unittest.TestSuite)):
raise ValueError, \
"calling %s returned %s, not a test" % (obj,test)
***************
*** 515,521 ****
of string specifiers. See 'loadTestsFromName()'.
"""
! suites = []
! for name in names:
! suites.append(self.loadTestsFromName(name, module))
return self.suiteClass(suites)
--- 534,538 ----
of string specifiers. See 'loadTestsFromName()'.
"""
! suites = [self.loadTestsFromName(name, module) for name in names]
return self.suiteClass(suites)
***************
*** 523,528 ****
"""Return a sorted sequence of method names found within testCaseClass
"""
! testFnNames = filter(lambda n,p=self.testMethodPrefix: n[:len(p)] == p,
! dir(testCaseClass))
for baseclass in testCaseClass.__bases__:
for testFnName in self.getTestCaseNames(baseclass):
--- 540,546 ----
"""Return a sorted sequence of method names found within testCaseClass
"""
! def isTestMethod(attrname, testCaseClass=testCaseClass, prefix=self.testMethodPrefix):
! return attrname[:len(prefix)] == prefix and callable(getattr(testCaseClass, attrname))
! testFnNames = filter(isTestMethod, dir(testCaseClass))
for baseclass in testCaseClass.__bases__:
for testFnName in self.getTestCaseNames(baseclass):
***************
*** 707,711 ****
if type(module) == type(''):
self.module = __import__(module)
! for part in string.split(module,'.')[1:]:
self.module = getattr(self.module, part)
else:
--- 725,729 ----
if type(module) == type(''):
self.module = __import__(module)
! for part in module.split('.')[1:]:
self.module = getattr(self.module, part)
else:
More information about the Python-checkins
mailing list