A few tweaks for issue16662 based on feedback from Robert Collins.

This commit is contained in:
Barry Warsaw 2014-09-08 17:29:02 -04:00
parent d78742a260
commit bb1e3f1ebe
2 changed files with 46 additions and 38 deletions

View File

@ -79,12 +79,15 @@ class TestLoader(object):
# use_load_tests argument. For backward compatibility, we still # use_load_tests argument. For backward compatibility, we still
# accept the argument (which can also be the first position) but we # accept the argument (which can also be the first position) but we
# ignore it and issue a deprecation warning if it's present. # ignore it and issue a deprecation warning if it's present.
if len(args) == 1 or 'use_load_tests' in kws: if len(args) > 0 or 'use_load_tests' in kws:
warnings.warn('use_load_tests is deprecated and ignored', warnings.warn('use_load_tests is deprecated and ignored',
DeprecationWarning) DeprecationWarning)
kws.pop('use_load_tests', None) kws.pop('use_load_tests', None)
if len(args) > 1: if len(args) > 1:
raise TypeError('loadTestsFromModule() takes 1 positional argument but {} were given'.format(len(args))) # Complain about the number of arguments, but don't forget the
# required `module` argument.
complaint = len(args) + 1
raise TypeError('loadTestsFromModule() takes 1 positional argument but {} were given'.format(complaint))
if len(kws) != 0: if len(kws) != 0:
# Since the keyword arguments are unsorted (see PEP 468), just # Since the keyword arguments are unsorted (see PEP 468), just
# pick the alphabetically sorted first argument to complain about, # pick the alphabetically sorted first argument to complain about,

View File

@ -196,23 +196,23 @@ class Test_TestLoader(unittest.TestCase):
@warningregistry @warningregistry
def test_loadTestsFromModule__use_load_tests_deprecated_positional(self): def test_loadTestsFromModule__use_load_tests_deprecated_positional(self):
m = types.ModuleType('m')
class MyTestCase(unittest.TestCase):
def test(self):
pass
m.testcase_1 = MyTestCase
load_tests_args = []
def load_tests(loader, tests, pattern):
self.assertIsInstance(tests, unittest.TestSuite)
load_tests_args.extend((loader, tests, pattern))
return tests
m.load_tests = load_tests
# The method still works.
loader = unittest.TestLoader()
# use_load_tests=True as a positional argument.
with warnings.catch_warnings(record=True) as w: with warnings.catch_warnings(record=True) as w:
warnings.simplefilter('always') warnings.simplefilter('always')
m = types.ModuleType('m')
class MyTestCase(unittest.TestCase):
def test(self):
pass
m.testcase_1 = MyTestCase
load_tests_args = []
def load_tests(loader, tests, pattern):
self.assertIsInstance(tests, unittest.TestSuite)
load_tests_args.extend((loader, tests, pattern))
return tests
m.load_tests = load_tests
# The method still works.
loader = unittest.TestLoader()
# use_load_tests=True as a positional argument.
suite = loader.loadTestsFromModule(m, False) suite = loader.loadTestsFromModule(m, False)
self.assertIsInstance(suite, unittest.TestSuite) self.assertIsInstance(suite, unittest.TestSuite)
# load_tests was still called because use_load_tests is deprecated # load_tests was still called because use_load_tests is deprecated
@ -225,22 +225,22 @@ class Test_TestLoader(unittest.TestCase):
@warningregistry @warningregistry
def test_loadTestsFromModule__use_load_tests_deprecated_keyword(self): def test_loadTestsFromModule__use_load_tests_deprecated_keyword(self):
m = types.ModuleType('m')
class MyTestCase(unittest.TestCase):
def test(self):
pass
m.testcase_1 = MyTestCase
load_tests_args = []
def load_tests(loader, tests, pattern):
self.assertIsInstance(tests, unittest.TestSuite)
load_tests_args.extend((loader, tests, pattern))
return tests
m.load_tests = load_tests
# The method still works.
loader = unittest.TestLoader()
with warnings.catch_warnings(record=True) as w: with warnings.catch_warnings(record=True) as w:
warnings.simplefilter('always') warnings.simplefilter('always')
m = types.ModuleType('m')
class MyTestCase(unittest.TestCase):
def test(self):
pass
m.testcase_1 = MyTestCase
load_tests_args = []
def load_tests(loader, tests, pattern):
self.assertIsInstance(tests, unittest.TestSuite)
load_tests_args.extend((loader, tests, pattern))
return tests
m.load_tests = load_tests
# The method still works.
loader = unittest.TestLoader()
suite = loader.loadTestsFromModule(m, use_load_tests=False) suite = loader.loadTestsFromModule(m, use_load_tests=False)
self.assertIsInstance(suite, unittest.TestSuite) self.assertIsInstance(suite, unittest.TestSuite)
# load_tests was still called because use_load_tests is deprecated # load_tests was still called because use_load_tests is deprecated
@ -251,6 +251,7 @@ class Test_TestLoader(unittest.TestCase):
self.assertEqual(str(w[-1].message), self.assertEqual(str(w[-1].message),
'use_load_tests is deprecated and ignored') 'use_load_tests is deprecated and ignored')
@warningregistry
def test_loadTestsFromModule__too_many_positional_args(self): def test_loadTestsFromModule__too_many_positional_args(self):
m = types.ModuleType('m') m = types.ModuleType('m')
class MyTestCase(unittest.TestCase): class MyTestCase(unittest.TestCase):
@ -265,14 +266,18 @@ class Test_TestLoader(unittest.TestCase):
return tests return tests
m.load_tests = load_tests m.load_tests = load_tests
loader = unittest.TestLoader() loader = unittest.TestLoader()
with self.assertRaises(TypeError) as cm: with self.assertRaises(TypeError) as cm, \
warnings.catch_warning(record=True) as w:
loader.loadTestsFromModule(m, False, 'testme.*') loader.loadTestsFromModule(m, False, 'testme.*')
self.assertEqual(type(cm.exception), TypeError) # We still got the deprecation warning.
# The error message names the first bad argument alphabetically, self.assertIs(w[-1].category, DeprecationWarning)
# however use_load_tests (which sorts first) is ignored. self.assertEqual(str(w[-1].message),
self.assertEqual( 'use_load_tests is deprecated and ignored')
str(cm.exception), # We also got a TypeError for too many positional arguments.
'loadTestsFromModule() takes 1 positional argument but 2 were given') self.assertEqual(type(cm.exception), TypeError)
self.assertEqual(
str(cm.exception),
'loadTestsFromModule() takes 1 positional argument but 3 were given')
@warningregistry @warningregistry
def test_loadTestsFromModule__use_load_tests_other_bad_keyword(self): def test_loadTestsFromModule__use_load_tests_other_bad_keyword(self):