Skip to content

Commit

Permalink
bpo-5846: Fix deprecations for obsolete unittest functions and add te…
Browse files Browse the repository at this point in the history
…sts. (GH-28382)
  • Loading branch information
serhiy-storchaka authored Sep 17, 2021
1 parent 7733195 commit b2b035a
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 30 deletions.
31 changes: 1 addition & 30 deletions Lib/unittest/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,40 +66,11 @@ def testMultiply(self):
from .runner import TextTestRunner, TextTestResult
from .signals import installHandler, registerResult, removeResult, removeHandler
# IsolatedAsyncioTestCase will be imported lazily.
from .loader import makeSuite, getTestCaseNames, findTestCases

# deprecated
_TextTestResult = TextTestResult

from .loader import (
makeSuite as _makeSuite,
findTestCases as _findTestCases,
getTestCaseNames as _getTestCaseNames,
)

import warnings
def makeSuite(*args, **kwargs):
warnings.warn(
"unittest.makeSuite() is deprecated and will be removed in Python 3.13. "
"Please use unittest.TestLoader.loadTestsFromTestCase() instead.",
DeprecationWarning, stacklevel=2
)
return _makeSuite(*args, **kwargs)

def getTestCaseNames(*args, **kwargs):
warnings.warn(
"unittest.getTestCaseNames() is deprecated and will be removed in Python 3.13. "
"Please use unittest.TestLoader.getTestCaseNames() instead.",
DeprecationWarning, stacklevel=2
)
return _getTestCaseNames(*args, **kwargs)

def findTestCases(*args, **kwargs):
warnings.warn(
"unittest.findTestCases() is deprecated and will be removed in Python 3.13. "
"Please use unittest.TestLoader.loadTestsFromModule() instead.",
DeprecationWarning, stacklevel=2
)
return _findTestCases(*args, **kwargs)

# There are no tests here, so don't try to run anything discovered from
# introspecting the symbols (e.g. FunctionTestCase). Instead, all our
Expand Down
21 changes: 21 additions & 0 deletions Lib/unittest/loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -494,6 +494,9 @@ def _find_test_path(self, full_path, pattern, namespace=False):
defaultTestLoader = TestLoader()


# These functions are considered obsolete for long time.
# They will be removed in Python 3.13.

def _makeLoader(prefix, sortUsing, suiteClass=None, testNamePatterns=None):
loader = TestLoader()
loader.sortTestMethodsUsing = sortUsing
Expand All @@ -504,14 +507,32 @@ def _makeLoader(prefix, sortUsing, suiteClass=None, testNamePatterns=None):
return loader

def getTestCaseNames(testCaseClass, prefix, sortUsing=util.three_way_cmp, testNamePatterns=None):
import warnings
warnings.warn(
"unittest.getTestCaseNames() is deprecated and will be removed in Python 3.13. "
"Please use unittest.TestLoader.getTestCaseNames() instead.",
DeprecationWarning, stacklevel=2
)
return _makeLoader(prefix, sortUsing, testNamePatterns=testNamePatterns).getTestCaseNames(testCaseClass)

def makeSuite(testCaseClass, prefix='test', sortUsing=util.three_way_cmp,
suiteClass=suite.TestSuite):
import warnings
warnings.warn(
"unittest.makeSuite() is deprecated and will be removed in Python 3.13. "
"Please use unittest.TestLoader.loadTestsFromTestCase() instead.",
DeprecationWarning, stacklevel=2
)
return _makeLoader(prefix, sortUsing, suiteClass).loadTestsFromTestCase(
testCaseClass)

def findTestCases(module, prefix='test', sortUsing=util.three_way_cmp,
suiteClass=suite.TestSuite):
import warnings
warnings.warn(
"unittest.findTestCases() is deprecated and will be removed in Python 3.13. "
"Please use unittest.TestLoader.loadTestsFromModule() instead.",
DeprecationWarning, stacklevel=2
)
return _makeLoader(prefix, sortUsing, suiteClass).loadTestsFromModule(\
module)
47 changes: 47 additions & 0 deletions Lib/unittest/test/test_loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -1591,5 +1591,52 @@ class Foo(unittest.TestCase):
self.assertEqual(loader.getTestCaseNames(Foo), test_names)


class TestObsoleteFunctions(unittest.TestCase):
class MyTestSuite(unittest.TestSuite):
pass

class MyTestCase(unittest.TestCase):
def check_1(self): pass
def check_2(self): pass
def test(self): pass

@staticmethod
def reverse_three_way_cmp(a, b):
return unittest.util.three_way_cmp(b, a)

def test_getTestCaseNames(self):
with self.assertWarns(DeprecationWarning) as w:
tests = unittest.getTestCaseNames(self.MyTestCase,
prefix='check', sortUsing=self.reverse_three_way_cmp,
testNamePatterns=None)
self.assertEqual(w.warnings[0].filename, __file__)
self.assertEqual(tests, ['check_2', 'check_1'])

def test_makeSuite(self):
with self.assertWarns(DeprecationWarning) as w:
suite = unittest.makeSuite(self.MyTestCase,
prefix='check', sortUsing=self.reverse_three_way_cmp,
suiteClass=self.MyTestSuite)
self.assertEqual(w.warnings[0].filename, __file__)
self.assertIsInstance(suite, self.MyTestSuite)
expected = self.MyTestSuite([self.MyTestCase('check_2'),
self.MyTestCase('check_1')])
self.assertEqual(suite, expected)

def test_findTestCases(self):
m = types.ModuleType('m')
m.testcase_1 = self.MyTestCase

with self.assertWarns(DeprecationWarning) as w:
suite = unittest.findTestCases(m,
prefix='check', sortUsing=self.reverse_three_way_cmp,
suiteClass=self.MyTestSuite)
self.assertEqual(w.warnings[0].filename, __file__)
self.assertIsInstance(suite, self.MyTestSuite)
expected = [self.MyTestSuite([self.MyTestCase('check_2'),
self.MyTestCase('check_1')])]
self.assertEqual(list(suite), expected)


if __name__ == "__main__":
unittest.main()

0 comments on commit b2b035a

Please sign in to comment.