mirror of
https://github.com/python/cpython.git
synced 2025-07-23 11:15:24 +00:00

Test case matching patterns specified by options --match, --ignore, --matchfile and --ignorefile are now tested in the order of specification, and the last match determines whether the test case be run or ignored.
105 lines
3.4 KiB
Python
105 lines
3.4 KiB
Python
import os
|
|
import sys
|
|
import unittest
|
|
|
|
from test import support
|
|
|
|
from .utils import (
|
|
StrPath, TestName, TestTuple, TestList, TestFilter,
|
|
abs_module_name, count, printlist)
|
|
|
|
|
|
# If these test directories are encountered recurse into them and treat each
|
|
# "test_*.py" file or each sub-directory as a separate test module. This can
|
|
# increase parallelism.
|
|
#
|
|
# Beware this can't generally be done for any directory with sub-tests as the
|
|
# __init__.py may do things which alter what tests are to be run.
|
|
SPLITTESTDIRS: set[TestName] = {
|
|
"test_asyncio",
|
|
"test_concurrent_futures",
|
|
"test_future_stmt",
|
|
"test_gdb",
|
|
"test_inspect",
|
|
"test_multiprocessing_fork",
|
|
"test_multiprocessing_forkserver",
|
|
"test_multiprocessing_spawn",
|
|
}
|
|
|
|
|
|
def findtestdir(path: StrPath | None = None) -> StrPath:
|
|
return path or os.path.dirname(os.path.dirname(__file__)) or os.curdir
|
|
|
|
|
|
def findtests(*, testdir: StrPath | None = None, exclude=(),
|
|
split_test_dirs: set[TestName] = SPLITTESTDIRS,
|
|
base_mod: str = "") -> TestList:
|
|
"""Return a list of all applicable test modules."""
|
|
testdir = findtestdir(testdir)
|
|
tests = []
|
|
for name in os.listdir(testdir):
|
|
mod, ext = os.path.splitext(name)
|
|
if (not mod.startswith("test_")) or (mod in exclude):
|
|
continue
|
|
if base_mod:
|
|
fullname = f"{base_mod}.{mod}"
|
|
else:
|
|
fullname = mod
|
|
if fullname in split_test_dirs:
|
|
subdir = os.path.join(testdir, mod)
|
|
if not base_mod:
|
|
fullname = f"test.{mod}"
|
|
tests.extend(findtests(testdir=subdir, exclude=exclude,
|
|
split_test_dirs=split_test_dirs,
|
|
base_mod=fullname))
|
|
elif ext in (".py", ""):
|
|
tests.append(fullname)
|
|
return sorted(tests)
|
|
|
|
|
|
def split_test_packages(tests, *, testdir: StrPath | None = None, exclude=(),
|
|
split_test_dirs=SPLITTESTDIRS):
|
|
testdir = findtestdir(testdir)
|
|
splitted = []
|
|
for name in tests:
|
|
if name in split_test_dirs:
|
|
subdir = os.path.join(testdir, name)
|
|
splitted.extend(findtests(testdir=subdir, exclude=exclude,
|
|
split_test_dirs=split_test_dirs,
|
|
base_mod=name))
|
|
else:
|
|
splitted.append(name)
|
|
return splitted
|
|
|
|
|
|
def _list_cases(suite):
|
|
for test in suite:
|
|
if isinstance(test, unittest.loader._FailedTest):
|
|
continue
|
|
if isinstance(test, unittest.TestSuite):
|
|
_list_cases(test)
|
|
elif isinstance(test, unittest.TestCase):
|
|
if support.match_test(test):
|
|
print(test.id())
|
|
|
|
def list_cases(tests: TestTuple, *,
|
|
match_tests: TestFilter | None = None,
|
|
test_dir: StrPath | None = None):
|
|
support.verbose = False
|
|
support.set_match_tests(match_tests)
|
|
|
|
skipped = []
|
|
for test_name in tests:
|
|
module_name = abs_module_name(test_name, test_dir)
|
|
try:
|
|
suite = unittest.defaultTestLoader.loadTestsFromName(module_name)
|
|
_list_cases(suite)
|
|
except unittest.SkipTest:
|
|
skipped.append(test_name)
|
|
|
|
if skipped:
|
|
sys.stdout.flush()
|
|
stderr = sys.stderr
|
|
print(file=stderr)
|
|
print(count(len(skipped), "test"), "skipped:", file=stderr)
|
|
printlist(skipped, file=stderr)
|