public function TestDiscovery::getTestClasses in Zircon Profile 8
Same name and namespace in other branches
- 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\simpletestCode
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;
}