Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. TestRunner.php

function TestRunner::run

Same name in this branch
  1. 11.1.x vendor/phpunit/phpunit/src/TextUI/TestRunner.php \PHPUnit\TextUI\TestRunner::run()

Throws

\PHPUnit\Runner\Exception

CodeCoverageException

InvalidArgumentException

MoreThanOneDataSetFromDataProviderException

UnintentionallyCoveredCodeException

File

vendor/phpunit/phpunit/src/Framework/TestRunner.php, line 69

Class

TestRunner
@no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit

Namespace

PHPUnit\Framework

Code

public function run(TestCase $test) : void {
    Assert::resetCount();
    if ($this->configuration
        ->registerMockObjectsFromTestArgumentsRecursively()) {
        $test->registerMockObjectsFromTestArgumentsRecursively();
    }
    $shouldCodeCoverageBeCollected = (new CodeCoverageMetadataApi())->shouldCodeCoverageBeCollectedFor($test::class, $test->name());
    $error = false;
    $failure = false;
    $incomplete = false;
    $risky = false;
    $skipped = false;
    error_clear_last();
    if ($this->shouldErrorHandlerBeUsed($test)) {
        ErrorHandler::instance()->enable();
    }
    $collectCodeCoverage = CodeCoverage::instance()->isActive() && $shouldCodeCoverageBeCollected;
    if ($collectCodeCoverage) {
        CodeCoverage::instance()->start($test);
    }
    try {
        if ($this->canTimeLimitBeEnforced() && $this->shouldTimeLimitBeEnforced($test)) {
            $risky = $this->runTestWithTimeout($test);
        }
        else {
            $test->runBare();
        }
    } catch (AssertionFailedError $e) {
        $failure = true;
        if ($e instanceof IncompleteTestError) {
            $incomplete = true;
        }
        elseif ($e instanceof SkippedTest) {
            $skipped = true;
        }
    } catch (AssertionError $e) {
        $test->addToAssertionCount(1);
        $failure = true;
        $frame = $e->getTrace()[0];
        assert(isset($frame['file']));
        assert(isset($frame['line']));
        $e = new AssertionFailedError(sprintf('%s in %s:%s', $e->getMessage(), $frame['file'], $frame['line']));
    } catch (Throwable $e) {
        $error = true;
    }
    $test->addToAssertionCount(Assert::getCount());
    if ($this->configuration
        ->reportUselessTests() && !$test->doesNotPerformAssertions() && $test->numberOfAssertionsPerformed() === 0) {
        $risky = true;
    }
    if (!$error && !$failure && !$incomplete && !$skipped && !$risky && $this->configuration
        ->requireCoverageMetadata() && !$this->hasCoverageMetadata($test::class, $test->name())) {
        Event\Facade::emitter()->testConsideredRisky($test->valueObjectForEvents(), 'This test does not define a code coverage target but is expected to do so');
        $risky = true;
    }
    if ($collectCodeCoverage) {
        $append = !$risky && !$incomplete && !$skipped;
        $linesToBeCovered = [];
        $linesToBeUsed = [];
        if ($append) {
            try {
                $linesToBeCovered = (new CodeCoverageMetadataApi())->linesToBeCovered($test::class, $test->name());
                $linesToBeUsed = (new CodeCoverageMetadataApi())->linesToBeUsed($test::class, $test->name());
            } catch (InvalidCoversTargetException $cce) {
                Event\Facade::emitter()->testTriggeredPhpunitWarning($test->valueObjectForEvents(), $cce->getMessage());
                $append = false;
            }
        }
        try {
            CodeCoverage::instance()->stop($append, $linesToBeCovered, $linesToBeUsed);
        } catch (UnintentionallyCoveredCodeException $cce) {
            Event\Facade::emitter()->testConsideredRisky($test->valueObjectForEvents(), 'This test executed code that is not listed as code to be covered or used:' . PHP_EOL . $cce->getMessage());
        } catch (OriginalCodeCoverageException $cce) {
            $error = true;
            $e = $e ?? $cce;
        }
    }
    ErrorHandler::instance()->disable();
    if (!$error && !$incomplete && !$skipped && $this->configuration
        ->reportUselessTests() && !$test->doesNotPerformAssertions() && $test->numberOfAssertionsPerformed() === 0) {
        Event\Facade::emitter()->testConsideredRisky($test->valueObjectForEvents(), 'This test did not perform any assertions');
    }
    if ($test->doesNotPerformAssertions() && $test->numberOfAssertionsPerformed() > 0) {
        Event\Facade::emitter()->testConsideredRisky($test->valueObjectForEvents(), sprintf('This test is not expected to perform assertions but performed %d assertion%s', $test->numberOfAssertionsPerformed(), $test->numberOfAssertionsPerformed() > 1 ? 's' : ''));
    }
    if ($test->hasUnexpectedOutput()) {
        Event\Facade::emitter()->testPrintedUnexpectedOutput($test->output());
    }
    if ($this->configuration
        ->disallowTestOutput() && $test->hasUnexpectedOutput()) {
        Event\Facade::emitter()->testConsideredRisky($test->valueObjectForEvents(), sprintf('This test printed output: %s', $test->output()));
    }
    if ($test->wasPrepared()) {
        Event\Facade::emitter()->testFinished($test->valueObjectForEvents(), $test->numberOfAssertionsPerformed());
    }
}
RSS feed
Powered by Drupal