diff --git a/src/Util/Test.php b/src/Util/Test.php index f8339ba8f82..893a2aad8ea 100644 --- a/src/Util/Test.php +++ b/src/Util/Test.php @@ -156,6 +156,12 @@ public static function requiresCodeCoverageDataCollection(TestCase $test): bool { $annotations = $test->getAnnotations(); + // If there is no @covers annotation but 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 there is at least one @covers annotation then // code coverage data needs to be collected if (isset($annotations['method']['covers'])) { 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 14afc7086de..61faf9eb1c2 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/Util/TestTest.php b/tests/unit/Util/TestTest.php index d92ff7ddb7b..b1b1cae942b 100644 --- a/tests/unit/Util/TestTest.php +++ b/tests/unit/Util/TestTest.php @@ -1065,10 +1065,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') { @@ -1291,6 +1295,10 @@ public function getLinesToBeCoveredProvider(): array 'NamespaceCoverageCoversClassPublicTest', \range(31, 35), ], + [ + 'CoverageClassNothingTest', + false, + ], [ 'CoverageMethodNothingTest', false, @@ -1299,6 +1307,10 @@ public function getLinesToBeCoveredProvider(): array 'CoverageCoversOverridesCoversNothingTest', \range(29, 33), ], + [ + 'CoverageMethodNothingCoversMethod', + false, + ], ]; } @@ -1343,10 +1355,10 @@ public function canSkipCoverageProvider(): array { return [ ['CoverageClassTest', false], - ['CoverageClassNothingTest', true], - ['CoverageMethodNothingTest', false], ['CoverageClassWithoutAnnotationsTest', false], ['CoverageCoversOverridesCoversNothingTest', false], + ['CoverageClassNothingTest', true], + ['CoverageMethodNothingTest', true], ]; }