if these test directories are encountered recurse into them and treat each test py file or each subdirectory as a separate test module this can increase parallelism beware this can t generally be done for any directory with subtests as the init py may do things which alter what tests are to be run return a list of all applicable test modules testdir findtestdirtestdir tests for name in os listdirtestdir mod ext os path splitextname if not mod startswithtest or mod in exclude continue if basemod fullname fbasemod mod else fullname mod if fullname in splittestdirs subdir os path jointestdir mod if not basemod fullname ftest mod tests extendfindteststestdirsubdir excludeexclude splittestdirssplittestdirs basemodfullname elif ext in py tests appendfullname return sortedtests def splittestpackagestests testdir strpath none none exclude splittestdirssplittestdirs testdir findtestdirtestdir splitted for name in tests if name in splittestdirs subdir os path jointestdir name splitted extendfindteststestdirsubdir excludeexclude splittestdirssplittestdirs basemodname else splitted appendname return splitted def listcasessuite for test in suite if isinstancetest unittest loader failedtest continue if isinstancetest unittest testsuite listcasestest elif isinstancetest unittest testcase if matchtesttest printtest id def listcasestests testtuple matchtests testfilter none none testdir strpath none none support verbose false setmatchtestsmatchtests skipped for testname in tests modulename absmodulenametestname testdir try suite unittest defaulttestloader loadtestsfromnamemodulename listcasessuite except unittest skiptest skipped appendtestname if skipped sys stdout flush stderr sys stderr printfilestderr printcountlenskipped test skipped filestderr printlistskipped filestderr 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 return a list of all applicable test modules
import os
import sys
import unittest

from test import support

from .filter import match_test, set_match_tests
from .utils import (
    StrPath, TestName, TestTuple, TestList, TestFilter,
    abs_module_name, count, printlist)








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:
    
    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 match_test(test):
                print(test.id())

def list_cases(tests: TestTuple, *,
               match_tests: TestFilter | None = None,
               test_dir: StrPath | None = None):
    support.verbose = False
    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)