function TestDiscovery::getTestClasses

Same name and namespace in other branches
  1. 8.9.x core/modules/simpletest/src/TestDiscovery.php \Drupal\simpletest\TestDiscovery::getTestClasses()
  2. 8.9.x core/lib/Drupal/Core/Test/TestDiscovery.php \Drupal\Core\Test\TestDiscovery::getTestClasses()
  3. 10 core/lib/Drupal/Core/Test/TestDiscovery.php \Drupal\Core\Test\TestDiscovery::getTestClasses()
  4. 11.x core/lib/Drupal/Core/Test/TestDiscovery.php \Drupal\Core\Test\TestDiscovery::getTestClasses()

Discovers all available tests in all extensions.


    $groups['block'] => array(
      'Drupal\Tests\block\Functional\BlockTest' => array(
        'name' => 'Drupal\Tests\block\Functional\BlockTest',
        'description' => 'Tests block UI CRUD functionality.',
        'group' => 'block',
        'groups' => ['block', 'group2', 'group3'],
      ),
    );

@todo Remove singular grouping; retain list of groups in 'group' key.

Parameters

string $extension: (optional) The name of an extension to limit discovery to; e.g., 'node'.

string[] $types: An array of included test types.

Return value

array An array of tests keyed by the group name. If a test is annotated to belong to multiple groups, it will appear under all group keys it belongs to.

See also

https://www.drupal.org/node/2296615

File

core/lib/Drupal/Core/Test/TestDiscovery.php, line 154

Class

TestDiscovery
Discovers available tests.

Namespace

Drupal\Core\Test

Code

public function getTestClasses($extension = NULL, array $types = []) {
    if (!isset($extension) && empty($types)) {
        if (!empty($this->testClasses)) {
            return $this->testClasses;
        }
    }
    $list = [];
    $classmap = $this->findAllClassFiles($extension);
    // Prevent expensive class loader lookups for each reflected test class by
    // registering the complete classmap of test classes to the class loader.
    // This also ensures that test classes are loaded from the discovered
    // pathnames; a namespace/classname mismatch will throw an exception.
    $this->classLoader
        ->addClassMap($classmap);
    foreach ($classmap as $classname => $pathname) {
        $finder = MockFileFinder::create($pathname);
        $parser = new StaticReflectionParser($classname, $finder, TRUE);
        try {
            $info = static::getTestInfo($classname, $parser->getDocComment());
        } catch (MissingGroupException $e) {
            // If the class name ends in Test and is not a migrate table dump.
            if (preg_match('/Test$/', $classname) && strpos($classname, 'migrate_drupal\\Tests\\Table') === FALSE) {
                throw $e;
            }
            // If the class is @group annotation just skip it. Most likely it is an
            // abstract class, trait or test fixture.
            continue;
        }
        // Skip this test class if it is a Simpletest-based test and requires
        // unavailable modules. TestDiscovery should not filter out module
        // requirements for PHPUnit-based test classes.
        // @todo Move this behavior to \Drupal\simpletest\TestBase so tests can be
        //   marked as skipped, instead.
        // @see https://www.drupal.org/node/1273478
        if ($info['type'] == 'Simpletest') {
            if (!empty($info['requires']['module'])) {
                if (array_diff($info['requires']['module'], $this->availableExtensions['module'])) {
                    continue;
                }
            }
        }
        foreach ($info['groups'] as $group) {
            $list[$group][$classname] = $info;
        }
    }
    // Sort the groups and tests within the groups by name.
    uksort($list, 'strnatcasecmp');
    foreach ($list as &$tests) {
        uksort($tests, 'strnatcasecmp');
    }
    if (!isset($extension) && empty($types)) {
        $this->testClasses = $list;
    }
    if ($types) {
        $list = NestedArray::filter($list, function ($element) use ($types) {
            return !(is_array($element) && isset($element['type']) && !in_array($element['type'], $types));
        });
    }
    return $list;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.