function TestRunner::run
Same name in this branch
- 11.1.x vendor/phpunit/phpunit/src/TextUI/TestRunner.php \PHPUnit\TextUI\TestRunner::run()
Throws
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\FrameworkCode
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());
}
}