diff --git a/src/Framework/TestResult.php b/src/Framework/TestResult.php index fd81c867be9..d8a87e52f9b 100644 --- a/src/Framework/TestResult.php +++ b/src/Framework/TestResult.php @@ -198,6 +198,12 @@ public static function isAnyCoverageRequired(TestCase $test) { $annotations = $test->getAnnotations(); + // If there is a @coversNothing annotation on the test method then code + // coverage data does not need to be collected + if (isset($annotations['method']['coversNothing'])) { + return false; + } + // If any methods have covers, coverage must me generated if (isset($annotations['method']['covers'])) { return true; diff --git a/tests/_files/CoverageMethodNothingCoversMethod.php b/tests/_files/CoverageMethodNothingCoversMethod.php new file mode 100644 index 00000000000..f594452d126 --- /dev/null +++ b/tests/_files/CoverageMethodNothingCoversMethod.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +use PHPUnit\Framework\TestCase; + +class CoverageMethodNothingCoversMethod extends TestCase +{ + /** + * @covers CoveredClass::publicMethod + * @coversNothing + */ + public function testSomething(): void + { + $o = new CoveredClass; + $o->publicMethod(); + } +} diff --git a/tests/_files/CoverageMethodNothingTest.php b/tests/_files/CoverageMethodNothingTest.php index 11d65f8e3a8..a3b62788e2b 100644 --- a/tests/_files/CoverageMethodNothingTest.php +++ b/tests/_files/CoverageMethodNothingTest.php @@ -12,7 +12,6 @@ class CoverageMethodNothingTest extends TestCase { /** - * @covers CoveredClass::publicMethod * @coversNothing */ public function testSomething(): void diff --git a/tests/unit/Framework/TestResultTest.php b/tests/unit/Framework/TestResultTest.php index 3334482e21a..467df42f92f 100644 --- a/tests/unit/Framework/TestResultTest.php +++ b/tests/unit/Framework/TestResultTest.php @@ -67,10 +67,10 @@ public function canSkipCoverageProvider(): array { return [ ['CoverageClassTest', false], - ['CoverageClassNothingTest', true], - ['CoverageMethodNothingTest', false], ['CoverageClassWithoutAnnotationsTest', false], ['CoverageCoversOverridesCoversNothingTest', false], + ['CoverageClassNothingTest', true], + ['CoverageMethodNothingTest', true], ]; } diff --git a/tests/unit/Util/TestTest.php b/tests/unit/Util/TestTest.php index 91b5ddbbf0b..c6675fb0e71 100644 --- a/tests/unit/Util/TestTest.php +++ b/tests/unit/Util/TestTest.php @@ -782,10 +782,14 @@ public function testGetLinesToBeCovered($test, $lines): void $expected = [ TEST_FILES_PATH . 'NamespaceCoveredClass.php' => $lines, ]; + } elseif ($test === 'CoverageMethodNothingCoversMethod') { + $expected = false; } elseif ($test === 'CoverageCoversOverridesCoversNothingTest') { $expected = [TEST_FILES_PATH . 'CoveredClass.php' => $lines]; } elseif ($test === 'CoverageNoneTest') { $expected = []; + } elseif ($test === 'CoverageClassNothingTest') { + $expected = false; } elseif ($test === 'CoverageMethodNothingTest') { $expected = false; } elseif ($test === 'CoverageFunctionTest') { @@ -1008,6 +1012,10 @@ public function getLinesToBeCoveredProvider(): array 'NamespaceCoverageCoversClassPublicTest', \range(31, 35), ], + [ + 'CoverageClassNothingTest', + false, + ], [ 'CoverageMethodNothingTest', false, @@ -1016,6 +1024,10 @@ public function getLinesToBeCoveredProvider(): array 'CoverageCoversOverridesCoversNothingTest', \range(29, 33), ], + [ + 'CoverageMethodNothingCoversMethod', + false, + ], ]; }