https://github.com/python/cpython/commit/a9bb0092d0a713eb297f8c8001a697c30202f38d
commit: a9bb0092d0a713eb297f8c8001a697c30202f38d
branch: 3.13
author: Serhiy Storchaka <storch...@gmail.com>
committer: ambv <luk...@langa.pl>
date: 2025-04-08T12:43:04+02:00
summary:

[3.13] gh-71339: Use new assertion methods in test_import and test_importlib 
(GH-129052) (#129123)

(cherry picked from commit f7cc7d296c2cbb33d3f0bde4ace82e8569f7dbc3)

Co-authored-by: Serhiy Storchaka <storch...@gmail.com>

files:
M Lib/test/test_import/__init__.py
M Lib/test/test_importlib/extension/test_path_hook.py
M Lib/test/test_importlib/frozen/test_loader.py
M Lib/test/test_importlib/import_/test_caching.py
M Lib/test/test_importlib/import_/test_fromlist.py
M Lib/test/test_importlib/import_/test_meta_path.py
M Lib/test/test_importlib/import_/test_path.py
M Lib/test/test_importlib/import_/test_relative_imports.py
M Lib/test/test_importlib/resources/test_path.py
M Lib/test/test_importlib/source/test_finder.py
M Lib/test/test_importlib/source/test_path_hook.py
M Lib/test/test_importlib/test_abc.py
M Lib/test/test_importlib/test_api.py
M Lib/test/test_importlib/test_lazy.py
M Lib/test/test_importlib/test_namespace_pkgs.py
M Lib/test/test_importlib/test_pkg_import.py
M Lib/test/test_importlib/test_spec.py
M Lib/test/test_importlib/test_util.py
M Lib/test/test_importlib/util.py

diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py
index fe70ac7d8713c0..45d5a94acfd079 100644
--- a/Lib/test/test_import/__init__.py
+++ b/Lib/test/test_import/__init__.py
@@ -50,6 +50,7 @@
     TESTFN, rmtree, temp_umask, TESTFN_UNENCODABLE)
 from test.support import script_helper
 from test.support import threading_helper
+from test.support.testcase import ExtraAssertions
 from test.test_importlib.util import uncache
 from types import ModuleType
 try:
@@ -364,7 +365,7 @@ def _from_subinterp(cls, name, interpid, pipe, 
script_kwargs):
 
 
 @force_not_colorized_test_class
-class ImportTests(unittest.TestCase):
+class ImportTests(unittest.TestCase, ExtraAssertions):
 
     def setUp(self):
         remove_files(TESTFN)
@@ -570,7 +571,7 @@ def test_import_name_binding(self):
         import test as x
         import test.support
         self.assertIs(x, test, x.__name__)
-        self.assertTrue(hasattr(test.support, "__file__"))
+        self.assertHasAttr(test.support, "__file__")
 
         # import x.y.z as w binds z as w
         import test.support as y
@@ -641,7 +642,7 @@ def test_file_to_source(self):
         sys.path.insert(0, os.curdir)
         try:
             mod = __import__(TESTFN)
-            self.assertTrue(mod.__file__.endswith('.py'))
+            self.assertEndsWith(mod.__file__, '.py')
             os.remove(source)
             del sys.modules[TESTFN]
             make_legacy_pyc(source)
@@ -1447,7 +1448,7 @@ def test_foreign_code(self):
         self.assertEqual(mod.constant.co_filename, foreign_code.co_filename)
 
 
-class PathsTests(unittest.TestCase):
+class PathsTests(unittest.TestCase, ExtraAssertions):
     SAMPLES = ('test', 'test\u00e4\u00f6\u00fc\u00df', 'test\u00e9\u00e8',
                'test\u00b0\u00b3\u00b2')
     path = TESTFN
@@ -1497,11 +1498,11 @@ def test_UNC_path(self):
             self.fail("could not import 'test_unc_path' from %r: %r"
                       % (unc, e))
         self.assertEqual(mod.testdata, 'test_unc_path')
-        self.assertTrue(mod.__file__.startswith(unc), mod.__file__)
+        self.assertStartsWith(mod.__file__, unc)
         unload("test_unc_path")
 
 
-class RelativeImportTests(unittest.TestCase):
+class RelativeImportTests(unittest.TestCase, ExtraAssertions):
 
     def tearDown(self):
         unload("test.relimport")
@@ -1510,7 +1511,7 @@ def tearDown(self):
     def test_relimport_star(self):
         # This will import * from .test_import.
         from .. import relimport
-        self.assertTrue(hasattr(relimport, "RelativeImportTests"))
+        self.assertHasAttr(relimport, "RelativeImportTests")
 
     def test_issue3221(self):
         # Note for mergers: the 'absolute' tests from the 2.x branch
@@ -1827,7 +1828,7 @@ def test_symlinked_dir_importable(self):
 
 
 @cpython_only
-class ImportlibBootstrapTests(unittest.TestCase):
+class ImportlibBootstrapTests(unittest.TestCase, ExtraAssertions):
     # These tests check that importlib is bootstrapped.
 
     def test_frozen_importlib(self):
@@ -1840,7 +1841,7 @@ def test_frozen_importlib_is_bootstrap(self):
         self.assertIs(mod, _bootstrap)
         self.assertEqual(mod.__name__, 'importlib._bootstrap')
         self.assertEqual(mod.__package__, 'importlib')
-        self.assertTrue(mod.__file__.endswith('_bootstrap.py'), mod.__file__)
+        self.assertEndsWith(mod.__file__, '_bootstrap.py')
 
     def test_frozen_importlib_external_is_bootstrap_external(self):
         from importlib import _bootstrap_external
@@ -1848,7 +1849,7 @@ def 
test_frozen_importlib_external_is_bootstrap_external(self):
         self.assertIs(mod, _bootstrap_external)
         self.assertEqual(mod.__name__, 'importlib._bootstrap_external')
         self.assertEqual(mod.__package__, 'importlib')
-        self.assertTrue(mod.__file__.endswith('_bootstrap_external.py'), 
mod.__file__)
+        self.assertEndsWith(mod.__file__, '_bootstrap_external.py')
 
     def test_there_can_be_only_one(self):
         # Issue #15386 revealed a tricky loophole in the bootstrapping
@@ -2698,7 +2699,7 @@ def parse(cls, text):
 
 
 @requires_singlephase_init
-class SinglephaseInitTests(unittest.TestCase):
+class SinglephaseInitTests(unittest.TestCase, ExtraAssertions):
 
     NAME = '_testsinglephase'
 
@@ -2869,7 +2870,7 @@ def check_common(self, loaded):
         self.assertEqual(mod.__file__, self.FILE)
         self.assertEqual(mod.__spec__.origin, self.ORIGIN)
         if not isolated:
-            self.assertTrue(issubclass(mod.error, Exception))
+            self.assertIsSubclass(mod.error, Exception)
         self.assertEqual(mod.int_const, 1969)
         self.assertEqual(mod.str_const, 'something different')
         self.assertIsInstance(mod._module_initialized, float)
diff --git a/Lib/test/test_importlib/extension/test_path_hook.py 
b/Lib/test/test_importlib/extension/test_path_hook.py
index 314a635c77e082..941dcd5432ce46 100644
--- a/Lib/test/test_importlib/extension/test_path_hook.py
+++ b/Lib/test/test_importlib/extension/test_path_hook.py
@@ -21,7 +21,7 @@ def hook(self, entry):
     def test_success(self):
         # Path hook should handle a directory where a known extension module
         # exists.
-        self.assertTrue(hasattr(self.hook(util.EXTENSIONS.path), 'find_spec'))
+        self.assertHasAttr(self.hook(util.EXTENSIONS.path), 'find_spec')
 
 
 (Frozen_PathHooksTests,
diff --git a/Lib/test/test_importlib/frozen/test_loader.py 
b/Lib/test/test_importlib/frozen/test_loader.py
index 1112c0664ad477..c808bb73291a7c 100644
--- a/Lib/test/test_importlib/frozen/test_loader.py
+++ b/Lib/test/test_importlib/frozen/test_loader.py
@@ -61,7 +61,7 @@ def exec_module(self, name, origname=None):
             module.main()
 
         self.assertTrue(module.initialized)
-        self.assertTrue(hasattr(module, '__spec__'))
+        self.assertHasAttr(module, '__spec__')
         self.assertEqual(module.__spec__.origin, 'frozen')
         return module, stdout.getvalue()
 
@@ -72,7 +72,7 @@ def test_module(self):
         for attr, value in check.items():
             self.assertEqual(getattr(module, attr), value)
         self.assertEqual(output, 'Hello world!\n')
-        self.assertTrue(hasattr(module, '__spec__'))
+        self.assertHasAttr(module, '__spec__')
         self.assertEqual(module.__spec__.loader_state.origname, name)
 
     def test_package(self):
@@ -136,7 +136,7 @@ def test_get_code(self):
             exec(code, mod.__dict__)
         with captured_stdout() as stdout:
             mod.main()
-        self.assertTrue(hasattr(mod, 'initialized'))
+        self.assertHasAttr(mod, 'initialized')
         self.assertEqual(stdout.getvalue(), 'Hello world!\n')
 
     def test_get_source(self):
diff --git a/Lib/test/test_importlib/import_/test_caching.py 
b/Lib/test/test_importlib/import_/test_caching.py
index aedf0fd4f9db02..954cffc4f62166 100644
--- a/Lib/test/test_importlib/import_/test_caching.py
+++ b/Lib/test/test_importlib/import_/test_caching.py
@@ -1,5 +1,6 @@
 """Test that sys.modules is used properly by import."""
 from test.test_importlib import util
+from test.support.testcase import ExtraAssertions
 import sys
 from types import MethodType
 import unittest
@@ -45,7 +46,7 @@ def test_None_in_cache(self):
  ) = util.test_both(UseCache, __import__=util.__import__)
 
 
-class ImportlibUseCache(UseCache, unittest.TestCase):
+class ImportlibUseCache(UseCache, unittest.TestCase, ExtraAssertions):
 
     # Pertinent only to PEP 302; exec_module() doesn't return a module.
 
@@ -78,7 +79,7 @@ def test_using_cache_for_assigning_to_attribute(self):
             with self.create_mock('pkg.__init__', 'pkg.module') as importer:
                 with util.import_state(meta_path=[importer]):
                     module = self.__import__('pkg.module')
-                    self.assertTrue(hasattr(module, 'module'))
+                    self.assertHasAttr(module, 'module')
                     self.assertEqual(id(module.module),
                                     id(sys.modules['pkg.module']))
 
@@ -88,7 +89,7 @@ def test_using_cache_for_fromlist(self):
         with self.create_mock('pkg.__init__', 'pkg.module') as importer:
             with util.import_state(meta_path=[importer]):
                 module = self.__import__('pkg', fromlist=['module'])
-                self.assertTrue(hasattr(module, 'module'))
+                self.assertHasAttr(module, 'module')
                 self.assertEqual(id(module.module),
                                  id(sys.modules['pkg.module']))
 
diff --git a/Lib/test/test_importlib/import_/test_fromlist.py 
b/Lib/test/test_importlib/import_/test_fromlist.py
index 4b4b9bc3f5e04a..feccc7be09a98c 100644
--- a/Lib/test/test_importlib/import_/test_fromlist.py
+++ b/Lib/test/test_importlib/import_/test_fromlist.py
@@ -63,7 +63,7 @@ def test_nonexistent_object(self):
             with util.import_state(meta_path=[importer]):
                 module = self.__import__('module', fromlist=['non_existent'])
                 self.assertEqual(module.__name__, 'module')
-                self.assertFalse(hasattr(module, 'non_existent'))
+                self.assertNotHasAttr(module, 'non_existent')
 
     def test_module_from_package(self):
         # [module]
@@ -71,7 +71,7 @@ def test_module_from_package(self):
             with util.import_state(meta_path=[importer]):
                 module = self.__import__('pkg', fromlist=['module'])
                 self.assertEqual(module.__name__, 'pkg')
-                self.assertTrue(hasattr(module, 'module'))
+                self.assertHasAttr(module, 'module')
                 self.assertEqual(module.module.__name__, 'pkg.module')
 
     def test_nonexistent_from_package(self):
@@ -79,7 +79,7 @@ def test_nonexistent_from_package(self):
             with util.import_state(meta_path=[importer]):
                 module = self.__import__('pkg', fromlist=['non_existent'])
                 self.assertEqual(module.__name__, 'pkg')
-                self.assertFalse(hasattr(module, 'non_existent'))
+                self.assertNotHasAttr(module, 'non_existent')
 
     def test_module_from_package_triggers_ModuleNotFoundError(self):
         # If a submodule causes an ModuleNotFoundError because it tries
@@ -107,7 +107,7 @@ def basic_star_test(self, fromlist=['*']):
                 mock['pkg'].__all__ = ['module']
                 module = self.__import__('pkg', fromlist=fromlist)
                 self.assertEqual(module.__name__, 'pkg')
-                self.assertTrue(hasattr(module, 'module'))
+                self.assertHasAttr(module, 'module')
                 self.assertEqual(module.module.__name__, 'pkg.module')
 
     def test_using_star(self):
@@ -125,8 +125,8 @@ def test_star_with_others(self):
                 mock['pkg'].__all__ = ['module1']
                 module = self.__import__('pkg', fromlist=['module2', '*'])
                 self.assertEqual(module.__name__, 'pkg')
-                self.assertTrue(hasattr(module, 'module1'))
-                self.assertTrue(hasattr(module, 'module2'))
+                self.assertHasAttr(module, 'module1')
+                self.assertHasAttr(module, 'module2')
                 self.assertEqual(module.module1.__name__, 'pkg.module1')
                 self.assertEqual(module.module2.__name__, 'pkg.module2')
 
@@ -136,7 +136,7 @@ def test_nonexistent_in_all(self):
                 importer['pkg'].__all__ = ['non_existent']
                 module = self.__import__('pkg', fromlist=['*'])
                 self.assertEqual(module.__name__, 'pkg')
-                self.assertFalse(hasattr(module, 'non_existent'))
+                self.assertNotHasAttr(module, 'non_existent')
 
     def test_star_in_all(self):
         with util.mock_spec('pkg.__init__') as importer:
@@ -144,7 +144,7 @@ def test_star_in_all(self):
                 importer['pkg'].__all__ = ['*']
                 module = self.__import__('pkg', fromlist=['*'])
                 self.assertEqual(module.__name__, 'pkg')
-                self.assertFalse(hasattr(module, '*'))
+                self.assertNotHasAttr(module, '*')
 
     def test_invalid_type(self):
         with util.mock_spec('pkg.__init__') as importer:
diff --git a/Lib/test/test_importlib/import_/test_meta_path.py 
b/Lib/test/test_importlib/import_/test_meta_path.py
index 8689017ba43112..4c00f60681acf1 100644
--- a/Lib/test/test_importlib/import_/test_meta_path.py
+++ b/Lib/test/test_importlib/import_/test_meta_path.py
@@ -43,7 +43,7 @@ def test_empty(self):
                 self.assertIsNone(importlib._bootstrap._find_spec('nothing',
                                                                   None))
                 self.assertEqual(len(w), 1)
-                self.assertTrue(issubclass(w[-1].category, ImportWarning))
+                self.assertIsSubclass(w[-1].category, ImportWarning)
 
 
 (Frozen_CallingOrder,
diff --git a/Lib/test/test_importlib/import_/test_path.py 
b/Lib/test/test_importlib/import_/test_path.py
index 89b52fbd1e1aff..bcd5ad6e76005a 100644
--- a/Lib/test/test_importlib/import_/test_path.py
+++ b/Lib/test/test_importlib/import_/test_path.py
@@ -80,7 +80,7 @@ def test_empty_path_hooks(self):
                 self.assertIsNone(self.find('os'))
                 self.assertIsNone(sys.path_importer_cache[path_entry])
                 self.assertEqual(len(w), 1)
-                self.assertTrue(issubclass(w[-1].category, ImportWarning))
+                self.assertIsSubclass(w[-1].category, ImportWarning)
 
     def test_path_importer_cache_empty_string(self):
         # The empty string should create a finder using the cwd.
diff --git a/Lib/test/test_importlib/import_/test_relative_imports.py 
b/Lib/test/test_importlib/import_/test_relative_imports.py
index 99c24f1fd9487c..e535d119763148 100644
--- a/Lib/test/test_importlib/import_/test_relative_imports.py
+++ b/Lib/test/test_importlib/import_/test_relative_imports.py
@@ -81,7 +81,7 @@ def callback(global_):
             self.__import__('pkg')  # For __import__().
             module = self.__import__('', global_, fromlist=['mod2'], level=1)
             self.assertEqual(module.__name__, 'pkg')
-            self.assertTrue(hasattr(module, 'mod2'))
+            self.assertHasAttr(module, 'mod2')
             self.assertEqual(module.mod2.attr, 'pkg.mod2')
         self.relative_import_test(create, globals_, callback)
 
@@ -107,7 +107,7 @@ def callback(global_):
             module = self.__import__('', global_, fromlist=['module'],
                              level=1)
             self.assertEqual(module.__name__, 'pkg')
-            self.assertTrue(hasattr(module, 'module'))
+            self.assertHasAttr(module, 'module')
             self.assertEqual(module.module.attr, 'pkg.module')
         self.relative_import_test(create, globals_, callback)
 
@@ -131,7 +131,7 @@ def callback(global_):
             module = self.__import__('', global_, fromlist=['subpkg2'],
                                             level=2)
             self.assertEqual(module.__name__, 'pkg')
-            self.assertTrue(hasattr(module, 'subpkg2'))
+            self.assertHasAttr(module, 'subpkg2')
             self.assertEqual(module.subpkg2.attr, 'pkg.subpkg2.__init__')
         self.relative_import_test(create, globals_, callback)
 
diff --git a/Lib/test/test_importlib/resources/test_path.py 
b/Lib/test/test_importlib/resources/test_path.py
index 378dc7a2baeb23..96f63b533a8fba 100644
--- a/Lib/test/test_importlib/resources/test_path.py
+++ b/Lib/test/test_importlib/resources/test_path.py
@@ -4,6 +4,7 @@
 
 from importlib import resources
 from . import util
+from test.support.testcase import ExtraAssertions
 
 
 class CommonTests(util.CommonTests, unittest.TestCase):
@@ -12,7 +13,7 @@ def execute(self, package, path):
             pass
 
 
-class PathTests:
+class PathTests(ExtraAssertions):
     def test_reading(self):
         """
         Path should be readable and a pathlib.Path instance.
@@ -20,7 +21,7 @@ def test_reading(self):
         target = resources.files(self.data) / 'utf-8.file'
         with resources.as_file(target) as path:
             self.assertIsInstance(path, pathlib.Path)
-            self.assertTrue(path.name.endswith("utf-8.file"), repr(path))
+            self.assertEndsWith(path.name, "utf-8.file")
             self.assertEqual('Hello, UTF-8 world!\n', 
path.read_text(encoding='utf-8'))
 
 
diff --git a/Lib/test/test_importlib/source/test_finder.py 
b/Lib/test/test_importlib/source/test_finder.py
index 8c06c4da1f5cba..4de736a6bf3b2d 100644
--- a/Lib/test/test_importlib/source/test_finder.py
+++ b/Lib/test/test_importlib/source/test_finder.py
@@ -73,7 +73,7 @@ def run_test(self, test, create=None, *, compile_=None, 
unlink=None):
                         if error.errno != errno.ENOENT:
                             raise
             loader = self.import_(mapping['.root'], test)
-            self.assertTrue(hasattr(loader, 'load_module'))
+            self.assertHasAttr(loader, 'load_module')
             return loader
 
     def test_module(self):
@@ -100,7 +100,7 @@ def test_module_in_package(self):
         with util.create_modules('pkg.__init__', 'pkg.sub') as mapping:
             pkg_dir = os.path.dirname(mapping['pkg.__init__'])
             loader = self.import_(pkg_dir, 'pkg.sub')
-            self.assertTrue(hasattr(loader, 'load_module'))
+            self.assertHasAttr(loader, 'load_module')
 
     # [sub package]
     def test_package_in_package(self):
@@ -108,7 +108,7 @@ def test_package_in_package(self):
         with context as mapping:
             pkg_dir = os.path.dirname(mapping['pkg.__init__'])
             loader = self.import_(pkg_dir, 'pkg.sub')
-            self.assertTrue(hasattr(loader, 'load_module'))
+            self.assertHasAttr(loader, 'load_module')
 
     # [package over modules]
     def test_package_over_module(self):
@@ -129,7 +129,7 @@ def test_empty_string_for_dir(self):
             file.write("# test file for importlib")
         try:
             loader = self._find(finder, 'mod', loader_only=True)
-            self.assertTrue(hasattr(loader, 'load_module'))
+            self.assertHasAttr(loader, 'load_module')
         finally:
             os.unlink('mod.py')
 
diff --git a/Lib/test/test_importlib/source/test_path_hook.py 
b/Lib/test/test_importlib/source/test_path_hook.py
index f274330e0b333b..6e1c23e6a9842b 100644
--- a/Lib/test/test_importlib/source/test_path_hook.py
+++ b/Lib/test/test_importlib/source/test_path_hook.py
@@ -15,12 +15,12 @@ def path_hook(self):
 
     def test_success(self):
         with util.create_modules('dummy') as mapping:
-            self.assertTrue(hasattr(self.path_hook()(mapping['.root']),
-                                    'find_spec'))
+            self.assertHasAttr(self.path_hook()(mapping['.root']),
+                               'find_spec')
 
     def test_empty_string(self):
         # The empty string represents the cwd.
-        self.assertTrue(hasattr(self.path_hook()(''), 'find_spec'))
+        self.assertHasAttr(self.path_hook()(''), 'find_spec')
 
 
 (Frozen_PathHookTest,
diff --git a/Lib/test/test_importlib/test_abc.py 
b/Lib/test/test_importlib/test_abc.py
index 1a77773255165b..5140e55caa0a5a 100644
--- a/Lib/test/test_importlib/test_abc.py
+++ b/Lib/test/test_importlib/test_abc.py
@@ -43,14 +43,12 @@ def setUp(self):
     def test_subclasses(self):
         # Test that the expected subclasses inherit.
         for subclass in self.subclasses:
-            self.assertTrue(issubclass(subclass, self.__test),
-                "{0} is not a subclass of {1}".format(subclass, self.__test))
+            self.assertIsSubclass(subclass, self.__test)
 
     def test_superclasses(self):
         # Test that the class inherits from the expected superclasses.
         for superclass in self.superclasses:
-            self.assertTrue(issubclass(self.__test, superclass),
-               "{0} is not a superclass of {1}".format(superclass, 
self.__test))
+            self.assertIsSubclass(self.__test, superclass)
 
 
 class MetaPathFinder(InheritanceTests):
@@ -416,14 +414,14 @@ def test_source_to_code_source(self):
         # Since compile() can handle strings, so should source_to_code().
         source = 'attr = 42'
         module = self.source_to_module(source)
-        self.assertTrue(hasattr(module, 'attr'))
+        self.assertHasAttr(module, 'attr')
         self.assertEqual(module.attr, 42)
 
     def test_source_to_code_bytes(self):
         # Since compile() can handle bytes, so should source_to_code().
         source = b'attr = 42'
         module = self.source_to_module(source)
-        self.assertTrue(hasattr(module, 'attr'))
+        self.assertHasAttr(module, 'attr')
         self.assertEqual(module.attr, 42)
 
     def test_source_to_code_path(self):
@@ -757,7 +755,7 @@ def test_package_settings(self):
                     warnings.simplefilter('ignore', DeprecationWarning)
                     module = self.loader.load_module(self.name)
                 self.verify_module(module)
-                self.assertFalse(hasattr(module, '__path__'))
+                self.assertNotHasAttr(module, '__path__')
 
     def test_get_source_encoding(self):
         # Source is considered encoded in UTF-8 by default unless otherwise
diff --git a/Lib/test/test_importlib/test_api.py 
b/Lib/test/test_importlib/test_api.py
index 3bf8d7ac9c4022..f77ca76b9f4490 100644
--- a/Lib/test/test_importlib/test_api.py
+++ b/Lib/test/test_importlib/test_api.py
@@ -430,8 +430,7 @@ def test_everyone_has___loader__(self):
         for name, module in sys.modules.items():
             if isinstance(module, types.ModuleType):
                 with self.subTest(name=name):
-                    self.assertTrue(hasattr(module, '__loader__'),
-                                    '{!r} lacks a __loader__ 
attribute'.format(name))
+                    self.assertHasAttr(module, '__loader__')
                     if self.machinery.BuiltinImporter.find_spec(name):
                         self.assertIsNot(module.__loader__, None)
                     elif self.machinery.FrozenImporter.find_spec(name):
@@ -441,7 +440,7 @@ def test_everyone_has___spec__(self):
         for name, module in sys.modules.items():
             if isinstance(module, types.ModuleType):
                 with self.subTest(name=name):
-                    self.assertTrue(hasattr(module, '__spec__'))
+                    self.assertHasAttr(module, '__spec__')
                     if self.machinery.BuiltinImporter.find_spec(name):
                         self.assertIsNot(module.__spec__, None)
                     elif self.machinery.FrozenImporter.find_spec(name):
diff --git a/Lib/test/test_importlib/test_lazy.py 
b/Lib/test/test_importlib/test_lazy.py
index 5c6e0303528906..193fe6ed140e01 100644
--- a/Lib/test/test_importlib/test_lazy.py
+++ b/Lib/test/test_importlib/test_lazy.py
@@ -9,6 +9,7 @@
 
 from test.support import threading_helper
 from test.test_importlib import util as test_util
+from test.support.testcase import ExtraAssertions
 
 
 class CollectInit:
@@ -58,7 +59,7 @@ def exec_module(self, module):
         self.load_count += 1
 
 
-class LazyLoaderTests(unittest.TestCase):
+class LazyLoaderTests(unittest.TestCase, ExtraAssertions):
 
     def test_init(self):
         with self.assertRaises(TypeError):
@@ -125,12 +126,12 @@ def test_delete_eventual_attr(self):
         # Deleting an attribute should stay deleted.
         module = self.new_module()
         del module.attr
-        self.assertFalse(hasattr(module, 'attr'))
+        self.assertNotHasAttr(module, 'attr')
 
     def test_delete_preexisting_attr(self):
         module = self.new_module()
         del module.__name__
-        self.assertFalse(hasattr(module, '__name__'))
+        self.assertNotHasAttr(module, '__name__')
 
     def test_module_substitution_error(self):
         with test_util.uncache(TestingImporter.module_name):
diff --git a/Lib/test/test_importlib/test_namespace_pkgs.py 
b/Lib/test/test_importlib/test_namespace_pkgs.py
index 072e198795d394..c6be64eaed4260 100644
--- a/Lib/test/test_importlib/test_namespace_pkgs.py
+++ b/Lib/test/test_importlib/test_namespace_pkgs.py
@@ -8,6 +8,7 @@
 import unittest
 
 from test.test_importlib import util
+from test.support.testcase import ExtraAssertions
 
 # needed tests:
 #
@@ -53,7 +54,7 @@ def namespace_tree_context(**kwargs):
     with import_context, sys_modules_context():
         yield
 
-class NamespacePackageTest(unittest.TestCase):
+class NamespacePackageTest(unittest.TestCase, ExtraAssertions):
     """
     Subclasses should define self.root and self.paths (under that root)
     to be added to sys.path.
@@ -80,7 +81,7 @@ def test_cant_import_other(self):
 
     def test_simple_repr(self):
         import foo.one
-        self.assertTrue(repr(foo).startswith("<module 'foo' (namespace) from 
["))
+        self.assertStartsWith(repr(foo), "<module 'foo' (namespace) from [")
 
 
 class DynamicPathNamespacePackage(NamespacePackageTest):
diff --git a/Lib/test/test_importlib/test_pkg_import.py 
b/Lib/test/test_importlib/test_pkg_import.py
index 66f5f8bc253a85..1083e9d77ec86a 100644
--- a/Lib/test/test_importlib/test_pkg_import.py
+++ b/Lib/test/test_importlib/test_pkg_import.py
@@ -8,8 +8,9 @@
 
 from importlib.util import cache_from_source
 from test.support.os_helper import create_empty_file
+from test.support.testcase import ExtraAssertions
 
-class TestImport(unittest.TestCase):
+class TestImport(unittest.TestCase, ExtraAssertions):
 
     def __init__(self, *args, **kw):
         self.package_name = 'PACKAGE_'
@@ -55,7 +56,7 @@ def test_package_import__semantics(self):
         except SyntaxError: pass
         else: raise RuntimeError('Failed to induce SyntaxError') # self.fail()?
         self.assertNotIn(self.module_name, sys.modules)
-        self.assertFalse(hasattr(sys.modules[self.package_name], 'foo'))
+        self.assertNotHasAttr(sys.modules[self.package_name], 'foo')
 
         # ...make up a variable name that isn't bound in __builtins__
         var = 'a'
diff --git a/Lib/test/test_importlib/test_spec.py 
b/Lib/test/test_importlib/test_spec.py
index 02318926f35eee..aebeabaf83f75d 100644
--- a/Lib/test/test_importlib/test_spec.py
+++ b/Lib/test/test_importlib/test_spec.py
@@ -237,7 +237,7 @@ def test_exec(self):
         self.spec.loader = NewLoader()
         module = self.util.module_from_spec(self.spec)
         sys.modules[self.name] = module
-        self.assertFalse(hasattr(module, 'eggs'))
+        self.assertNotHasAttr(module, 'eggs')
         self.bootstrap._exec(self.spec, module)
 
         self.assertEqual(module.eggs, 1)
@@ -348,9 +348,9 @@ def test_reload_init_module_attrs(self):
         self.assertIs(loaded.__loader__, self.spec.loader)
         self.assertEqual(loaded.__package__, self.spec.parent)
         self.assertIs(loaded.__spec__, self.spec)
-        self.assertFalse(hasattr(loaded, '__path__'))
-        self.assertFalse(hasattr(loaded, '__file__'))
-        self.assertFalse(hasattr(loaded, '__cached__'))
+        self.assertNotHasAttr(loaded, '__path__')
+        self.assertNotHasAttr(loaded, '__file__')
+        self.assertNotHasAttr(loaded, '__cached__')
 
 
 (Frozen_ModuleSpecMethodsTests,
diff --git a/Lib/test/test_importlib/test_util.py 
b/Lib/test/test_importlib/test_util.py
index 3dfd775c11573c..f3d042b21a7f8f 100644
--- a/Lib/test/test_importlib/test_util.py
+++ b/Lib/test/test_importlib/test_util.py
@@ -321,7 +321,7 @@ def test_length(self):
 
     def test_incorporates_rn(self):
         # The magic number uses \r\n to come out wrong when splitting on lines.
-        self.assertTrue(self.util.MAGIC_NUMBER.endswith(b'\r\n'))
+        self.assertEndsWith(self.util.MAGIC_NUMBER, b'\r\n')
 
 
 (Frozen_MagicNumberTests,
diff --git a/Lib/test/test_importlib/util.py b/Lib/test/test_importlib/util.py
index edbe78545a2536..dc04ffb4c3b4e7 100644
--- a/Lib/test/test_importlib/util.py
+++ b/Lib/test/test_importlib/util.py
@@ -10,6 +10,7 @@
 from test.support import import_helper
 from test.support import is_apple_mobile
 from test.support import os_helper
+from test.support.testcase import ExtraAssertions
 import unittest
 import sys
 import tempfile
@@ -80,7 +81,7 @@ def specialize_class(cls, kind, base=None, **kwargs):
     elif not isinstance(base, type):
         base = base[kind]
     name = '{}_{}'.format(kind, cls.__name__)
-    bases = (cls, base)
+    bases = (cls, base, ExtraAssertions)
     specialized = types.new_class(name, bases)
     specialized.__module__ = cls.__module__
     specialized._NAME = cls.__name__

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to