You are here

public function TestDiscovery::getTestClasses in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 core/modules/simpletest/src/TestDiscovery.php \Drupal\simpletest\TestDiscovery::getTestClasses()

Discovers all available tests in all extensions.

@todo Remove singular grouping; retain list of groups in 'group' key. @todo Add base class groups 'Kernel' + 'Web', complementing 'PHPUnit'.

Parameters

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

Return value

array An array of tests keyed by the first @group specified in each test's PHPDoc comment block, and then keyed by class names. For example:


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

Throws

\ReflectionException If a discovered test class does not match the expected class name.

See also

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

File

core/modules/simpletest/src/TestDiscovery.php, line 139
Contains \Drupal\simpletest\TestDiscovery.

Class

TestDiscovery
Discovers available tests.

Namespace

Drupal\simpletest

Code

public function getTestClasses($extension = NULL) {
  $reader = new SimpleAnnotationReader();
  $reader
    ->addNamespace('Drupal\\simpletest\\Annotation');
  if (!isset($extension)) {
    if ($this->cacheBackend && ($cache = $this->cacheBackend
      ->get('simpletest:discovery:classes'))) {
      return $cache->data;
    }
  }
  $list = array();
  $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 requires unavailable modules.
    // @todo PHPUnit skips tests with unmet requirements when executing a test
    //   (instead of excluding them upfront). Refactor test runner to follow
    //   that approach.
    // @see https://www.drupal.org/node/1273478
    if (!empty($info['requires']['module'])) {
      if (array_diff($info['requires']['module'], $this->availableExtensions['module'])) {
        continue;
      }
    }
    $list[$info['group']][$classname] = $info;
  }

  // Sort the groups and tests within the groups by name.
  uksort($list, 'strnatcasecmp');
  foreach ($list as &$tests) {
    uksort($tests, 'strnatcasecmp');
  }

  // Allow modules extending core tests to disable originals.
  \Drupal::moduleHandler()
    ->alter('simpletest', $list);
  if (!isset($extension)) {
    if ($this->cacheBackend) {
      $this->cacheBackend
        ->set('simpletest:discovery:classes', $list);
    }
  }
  return $list;
}