A faulty load_tests in a test module no longer halts test discovery. A placeholder test, that reports the failure, is created instead.

This commit is contained in:
Michael Foord 2010-03-21 00:53:39 +00:00
parent 134fb10408
commit 73dbe04619
2 changed files with 36 additions and 7 deletions

View file

@ -33,12 +33,18 @@ def _make_failed_import_test(name, suiteClass):
# Python 2.3 compatibility
# format_exc returns two frames of discover.py as well
message += '\n%s' % traceback.format_exc()
return _make_failed_test('ModuleImportFailure', name, suiteClass,
ImportError(message))
def testImportFailure(self):
raise ImportError(message)
attrs = {name: testImportFailure}
ModuleImportFailure = type('ModuleImportFailure', (case.TestCase,), attrs)
return suiteClass((ModuleImportFailure(name),))
def _make_failed_load_tests(name, exception, suiteClass):
return _make_failed_test('LoadTestsFailure', name, suiteClass, exception)
def _make_failed_test(classname, methodname, suiteClass, exception):
def testFailure(self):
raise exception
attrs = {methodname: testFailure}
TestClass = type(classname, (case.TestCase,), attrs)
return suiteClass((TestClass(methodname),))
class TestLoader(object):
@ -73,7 +79,11 @@ class TestLoader(object):
load_tests = getattr(module, 'load_tests', None)
tests = self.suiteClass(tests)
if use_load_tests and load_tests is not None:
return load_tests(self, tests, None)
try:
return load_tests(self, tests, None)
except Exception, e:
return _make_failed_load_tests(module.__name__, e,
self.suiteClass)
return tests
def loadTestsFromName(self, name, module=None):
@ -239,7 +249,11 @@ class TestLoader(object):
for test in self._find_tests(full_path, pattern):
yield test
else:
yield load_tests(self, tests, pattern)
try:
yield load_tests(self, tests, pattern)
except Exception, e:
yield _make_failed_load_tests(package.__name__, e,
self.suiteClass)
defaultTestLoader = TestLoader()