public function TestBase::run

Run all tests in this class.

Regardless of whether $methods are passed or not, only method names starting with "test" are executed.

Parameters

$methods: (optional) A list of method names in the test case class to run; e.g., array('testFoo', 'testBar'). By default, all methods of the class are taken into account, but it can be useful to only run a few selected test methods during debugging.

File

drupal/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php, line 642
Definition of Drupal\simpletest\TestBase.

Class

TestBase
Base class for Drupal tests.

Namespace

Drupal\simpletest

Code

public function run(array $methods = array()) {
  TestBundle::$currentTest = $this;
  $simpletest_config = config('simpletest.settings');
  $class = get_class($this);
  if ($simpletest_config
    ->get('verbose')) {

    // Initialize verbose debugging.
    $this->verbose = TRUE;
    $this->verboseDirectory = variable_get('file_public_path', conf_path() . '/files') . '/simpletest/verbose';
    $this->verboseDirectoryUrl = file_create_url($this->verboseDirectory);
    if (file_prepare_directory($this->verboseDirectory, FILE_CREATE_DIRECTORY) && !file_exists($this->verboseDirectory . '/.htaccess')) {
      file_put_contents($this->verboseDirectory . '/.htaccess', "<IfModule mod_expires.c>\nExpiresActive Off\n</IfModule>\n");
    }
    $this->verboseClassName = str_replace("\\", "_", $class);
  }

  // HTTP auth settings (<username>:<password>) for the simpletest browser
  // when sending requests to the test site.
  $this->httpauth_method = (int) $simpletest_config
    ->get('httpauth.method');
  $username = $simpletest_config
    ->get('httpauth.username');
  $password = $simpletest_config
    ->get('httpauth.password');
  if (!empty($username) && !empty($password)) {
    $this->httpauth_credentials = $username . ':' . $password;
  }
  set_error_handler(array(
    $this,
    'errorHandler',
  ));

  // Iterate through all the methods in this class, unless a specific list of
  // methods to run was passed.
  $class_methods = get_class_methods($class);
  if ($methods) {
    $class_methods = array_intersect($class_methods, $methods);
  }
  $missing_requirements = $this
    ->checkRequirements();
  if (!empty($missing_requirements)) {
    $missing_requirements_object = new ReflectionObject($this);
    $caller = array(
      'file' => $missing_requirements_object
        ->getFileName(),
    );
    foreach ($missing_requirements as $missing_requirement) {
      TestBase::insertAssert($this->testId, $class, FALSE, $missing_requirement, 'Requirements check.', $caller);
    }
  }
  else {
    foreach ($class_methods as $method) {

      // If the current method starts with "test", run it - it's a test.
      if (strtolower(substr($method, 0, 4)) == 'test') {

        // Insert a fail record. This will be deleted on completion to ensure
        // that testing completed.
        $method_info = new ReflectionMethod($class, $method);
        $caller = array(
          'file' => $method_info
            ->getFileName(),
          'line' => $method_info
            ->getStartLine(),
          'function' => $class . '->' . $method . '()',
        );
        $completion_check_id = TestBase::insertAssert($this->testId, $class, FALSE, t('The test did not complete due to a fatal error.'), 'Completion check', $caller);
        $this
          ->setUp();
        if ($this->setup) {
          try {
            $this
              ->{$method}();

            // Finish up.
          } catch (Exception $e) {
            $this
              ->exceptionHandler($e);
          }
          $this
            ->tearDown();
        }
        else {
          $this
            ->fail(t("The test cannot be executed because it has not been set up properly."));
        }

        // Remove the completion check record.
        TestBase::deleteAssert($completion_check_id);
      }
    }
  }
  TestBundle::$currentTest = NULL;

  // Clear out the error messages and restore error handler.
  drupal_get_messages();
  restore_error_handler();
}