Closes #22002: Merge with 3.4

This commit is contained in:
Zachary Ware 2014-07-23 12:06:47 -05:00
commit f886697659
21 changed files with 104 additions and 169 deletions

View File

@ -461,7 +461,7 @@ The :mod:`test.support` module defines the following functions:
.. function:: make_bad_fd() .. function:: make_bad_fd()
Create an invalid file descriptor by opening and closing a temporary file, Create an invalid file descriptor by opening and closing a temporary file,
and returning its descripor. and returning its descriptor.
.. function:: import_module(name, deprecated=False) .. function:: import_module(name, deprecated=False)
@ -554,6 +554,21 @@ The :mod:`test.support` module defines the following functions:
run simultaneously, which is a problem for buildbots. run simultaneously, which is a problem for buildbots.
.. function:: load_package_tests(pkg_dir, loader, standard_tests, pattern)
Generic implementation of the :mod:`unittest` ``load_tests`` protocol for
use in test packages. *pkg_dir* is the root directory of the package;
*loader*, *standard_tests*, and *pattern* are the arguments expected by
``load_tests``. In simple cases, the test package's ``__init__.py``
can be the following::
import os
from test.support import load_package_tests
def load_tests(*args):
return load_package_tests(os.path.dirname(__file__), *args)
The :mod:`test.support` module defines the following classes: The :mod:`test.support` module defines the following classes:
.. class:: TransientResource(exc, **kwargs) .. class:: TransientResource(exc, **kwargs)

View File

@ -85,7 +85,7 @@ __all__ = [
"skip_unless_symlink", "requires_gzip", "requires_bz2", "requires_lzma", "skip_unless_symlink", "requires_gzip", "requires_bz2", "requires_lzma",
"bigmemtest", "bigaddrspacetest", "cpython_only", "get_attribute", "bigmemtest", "bigaddrspacetest", "cpython_only", "get_attribute",
"requires_IEEE_754", "skip_unless_xattr", "requires_zlib", "requires_IEEE_754", "skip_unless_xattr", "requires_zlib",
"anticipate_failure", "anticipate_failure", "load_package_tests",
# sys # sys
"is_jython", "check_impl_detail", "is_jython", "check_impl_detail",
# network # network
@ -188,6 +188,25 @@ def anticipate_failure(condition):
return unittest.expectedFailure return unittest.expectedFailure
return lambda f: f return lambda f: f
def load_package_tests(pkg_dir, loader, standard_tests, pattern):
"""Generic load_tests implementation for simple test packages.
Most packages can implement load_tests using this function as follows:
def load_tests(*args):
return load_package_tests(os.path.dirname(__file__), *args)
"""
if pattern is None:
pattern = "test*"
top_dir = os.path.dirname( # Lib
os.path.dirname( # test
os.path.dirname(__file__))) # support
package_tests = loader.discover(start_dir=pkg_dir,
top_level_dir=top_dir,
pattern=pattern)
standard_tests.addTests(package_tests)
return standard_tests
def import_fresh_module(name, fresh=(), blocked=(), deprecated=False): def import_fresh_module(name, fresh=(), blocked=(), deprecated=False):
"""Import and return a module, deliberately bypassing sys.modules. """Import and return a module, deliberately bypassing sys.modules.

View File

@ -1,29 +1,10 @@
import os import os
import sys from test.support import load_package_tests, import_module
import unittest
from test.support import run_unittest, import_module
# Skip tests if we don't have threading. # Skip tests if we don't have threading.
import_module('threading') import_module('threading')
# Skip tests if we don't have concurrent.futures. # Skip tests if we don't have concurrent.futures.
import_module('concurrent.futures') import_module('concurrent.futures')
def load_tests(*args):
def suite(): return load_package_tests(os.path.dirname(__file__), *args)
tests = unittest.TestSuite()
loader = unittest.TestLoader()
for fn in os.listdir(os.path.dirname(__file__)):
if fn.startswith("test") and fn.endswith(".py"):
mod_name = 'test.test_asyncio.' + fn[:-3]
try:
__import__(mod_name)
except unittest.SkipTest:
pass
else:
mod = sys.modules[mod_name]
tests.addTests(loader.loadTestsFromModule(mod))
return tests
def test_main():
run_unittest(suite())

View File

@ -1,5 +1,4 @@
from . import test_main from . import load_tests
import unittest
unittest.main()
if __name__ == '__main__':
test_main()

View File

@ -1,31 +1,16 @@
import os import os
import sys import sys
import unittest import unittest
import test.support
import collections import collections
import email import email
from email.message import Message from email.message import Message
from email._policybase import compat32 from email._policybase import compat32
from test.support import load_package_tests
from test.test_email import __file__ as landmark from test.test_email import __file__ as landmark
# Run all tests in package for '-m unittest test.test_email' # Load all tests in package
def load_tests(loader, standard_tests, pattern): def load_tests(*args):
this_dir = os.path.dirname(__file__) return load_package_tests(os.path.dirname(__file__), *args)
if pattern is None:
pattern = "test*"
package_tests = loader.discover(start_dir=this_dir, pattern=pattern)
standard_tests.addTests(package_tests)
return standard_tests
# used by regrtest and __main__.
def test_main():
here = os.path.dirname(__file__)
# Unittest mucks with the path, so we have to save and restore
# it to keep regrtest happy.
savepath = sys.path[:]
test.support._run_suite(unittest.defaultTestLoader.discover(here))
sys.path[:] = savepath
# helper code used by a number of test modules. # helper code used by a number of test modules.

View File

@ -1,3 +1,4 @@
from test.test_email import test_main from test.test_email import load_tests
import unittest
test_main() unittest.main()

View File

@ -1,33 +1,5 @@
import os import os
import sys from test.support import load_package_tests
from test import support
import unittest
def test_suite(package=__package__, directory=os.path.dirname(__file__)): def load_tests(*args):
suite = unittest.TestSuite() return load_package_tests(os.path.dirname(__file__), *args)
for name in os.listdir(directory):
if name.startswith(('.', '__')):
continue
path = os.path.join(directory, name)
if (os.path.isfile(path) and name.startswith('test_') and
name.endswith('.py')):
submodule_name = os.path.splitext(name)[0]
module_name = "{0}.{1}".format(package, submodule_name)
__import__(module_name, level=0)
module_tests = unittest.findTestCases(sys.modules[module_name])
suite.addTest(module_tests)
elif os.path.isdir(path):
package_name = "{0}.{1}".format(package, name)
__import__(package_name, level=0)
package_tests = getattr(sys.modules[package_name], 'test_suite')()
suite.addTest(package_tests)
else:
continue
return suite
def test_main():
start_dir = os.path.dirname(__file__)
top_dir = os.path.dirname(os.path.dirname(start_dir))
test_loader = unittest.TestLoader()
support.run_unittest(test_loader.discover(start_dir, top_level_dir=top_dir))

View File

@ -1,9 +1,4 @@
"""Run importlib's test suite. from . import load_tests
import unittest
Specifying the ``--builtin`` flag will run tests, where applicable, with unittest.main()
builtins.__import__ instead of importlib.__import__.
"""
if __name__ == '__main__':
from . import test_main
test_main()

View File

@ -1,12 +1,5 @@
from .. import test_suite
import os import os
from test.support import load_package_tests
def load_tests(*args):
def test_suite(): return load_package_tests(os.path.dirname(__file__), *args)
directory = os.path.dirname(__file__)
return test_suite('importlib.test.builtin', directory)
if __name__ == '__main__':
from test.support import run_unittest
run_unittest(test_suite())

View File

@ -0,0 +1,4 @@
from . import load_tests
import unittest
unittest.main()

View File

@ -1,13 +1,5 @@
from .. import test_suite import os
import os.path from test.support import load_package_tests
import unittest
def load_tests(*args):
def test_suite(): return load_package_tests(os.path.dirname(__file__), *args)
directory = os.path.dirname(__file__)
return test_suite('importlib.test.extension', directory)
if __name__ == '__main__':
from test.support import run_unittest
run_unittest(test_suite())

View File

@ -0,0 +1,4 @@
from . import load_tests
import unittest
unittest.main()

View File

@ -1,13 +1,5 @@
from .. import test_suite import os
import os.path from test.support import load_package_tests
import unittest
def load_tests(*args):
def test_suite(): return load_package_tests(os.path.dirname(__file__), *args)
directory = os.path.dirname(__file__)
return test_suite('importlib.test.frozen', directory)
if __name__ == '__main__':
from test.support import run_unittest
run_unittest(test_suite())

View File

@ -0,0 +1,4 @@
from . import load_tests
import unittest
unittest.main()

View File

@ -1,13 +1,5 @@
from .. import test_suite import os
import os.path from test.support import load_package_tests
import unittest
def load_tests(*args):
def test_suite(): return load_package_tests(os.path.dirname(__file__), *args)
directory = os.path.dirname(__file__)
return test_suite('importlib.test.import_', directory)
if __name__ == '__main__':
from test.support import run_unittest
run_unittest(test_suite())

View File

@ -0,0 +1,4 @@
from . import load_tests
import unittest
unittest.main()

View File

@ -1,13 +1,5 @@
from .. import test_suite import os
import os.path from test.support import load_package_tests
import unittest
def load_tests(*args):
def test_suite(): return load_package_tests(os.path.dirname(__file__), *args)
directory = os.path.dirname(__file__)
return test.test_suite('importlib.test.source', directory)
if __name__ == '__main__':
from test.support import run_unittest
run_unittest(test_suite())

View File

@ -0,0 +1,4 @@
from . import load_tests
import unittest
unittest.main()

View File

@ -42,23 +42,12 @@ class TestCTest(CTest):
'_json') '_json')
here = os.path.dirname(__file__) def load_tests(loader, _, pattern):
def load_tests(*args):
suite = additional_tests()
loader = unittest.TestLoader()
for fn in os.listdir(here):
if fn.startswith("test") and fn.endswith(".py"):
modname = "test.test_json." + fn[:-3]
__import__(modname)
module = sys.modules[modname]
suite.addTests(loader.loadTestsFromModule(module))
return suite
def additional_tests():
suite = unittest.TestSuite() suite = unittest.TestSuite()
for mod in (json, json.encoder, json.decoder): for mod in (json, json.encoder, json.decoder):
suite.addTest(doctest.DocTestSuite(mod)) suite.addTest(doctest.DocTestSuite(mod))
suite.addTest(TestPyTest('test_pyjson')) suite.addTest(TestPyTest('test_pyjson'))
suite.addTest(TestCTest('test_cjson')) suite.addTest(TestCTest('test_cjson'))
return suite
pkg_dir = os.path.dirname(__file__)
return support.load_package_tests(pkg_dir, loader, suite, pattern)

View File

@ -21,11 +21,5 @@ def import_tool(toolname):
with support.DirsOnSysPath(scriptsdir): with support.DirsOnSysPath(scriptsdir):
return importlib.import_module(toolname) return importlib.import_module(toolname)
def load_tests(loader, standard_tests, pattern): def load_tests(*args):
this_dir = os.path.dirname(__file__) return support.load_package_tests(os.path.dirname(__file__), *args)
if pattern is None:
pattern = "test*"
with support.DirsOnSysPath():
package_tests = loader.discover(start_dir=this_dir, pattern=pattern)
standard_tests.addTests(package_tests)
return standard_tests

View File

@ -716,6 +716,10 @@ Documentation
Tests Tests
----- -----
- Issue #22002: Added ``load_package_tests`` function to test.support and used
it to implement/augment test discovery in test_asyncio, test_email,
test_importlib, test_json, and test_tools.
- Issue #21976: Fix test_ssl to accept LibreSSL version strings. Thanks - Issue #21976: Fix test_ssl to accept LibreSSL version strings. Thanks
to William Orr. to William Orr.