生成PHPUnit代码覆盖,同时忽略@covers

时间:2018-01-29 01:15:33

标签: php testing phpunit code-coverage

我正在使用PHPUnit生成代码覆盖率报告

vendor/bin/phpunit --coverage-clover coverage.clover

我有一些代码库在他们的测试中使用@covers标记,表明他们测试的服务。在这些代码库中,没有专门的测试来处理诸如值对象之类的事情。这导致覆盖率报告指示许多代码未经测试,而实际上是。这使得通过查看覆盖率报告很难找到实际未测试的代码。解决此问题的一种方法是删除@covers标记,但这些标记对于指示意图非常有用,并且在IDE识别它们时它们有助于导航。因此,我希望PHPUnit忽略这些标签。

我发现有一个--disable-coverage-ignore标志,这使得PHPUnit忽略了coverage忽略标记。我所寻找的基本上是相反的。

有没有办法生成代码覆盖率报告,这些报告可以计算所有已执行的行,而无需通过这些整个代码库进行更改,例如删除所有@covers标记?

2 个答案:

答案 0 :(得分:1)

创建了一个PR来实现此目的,但幸运的是从未合并。 作为快速而肮脏的 hack ,您可以在PHPUnit的源代码中添加一行。 只需将return false;作为applyCoversAnnotationFilter文件中vendor/phpunit/php-code-coverage/src/CodeCoverage.php方法的第一行,就像这样:

 private function applyCoversAnnotationFilter(array &$data, $linesToBeCovered, array $linesToBeUsed, $ignoreForceCoversAnnotation)
{
    return false;

PHPUnit 6.5.14中为我工作。

答案 1 :(得分:0)

根据PhpUnit的手册: “如果提供的话,这将有效地过滤代码覆盖率报告,使其仅包含来自引用的代码部分的已执行代码。这将确保仅在有专用测试的情况下,才将代码标记为覆盖,而不是由测试间接使用针对不同的类,从而避免代码覆盖率出现误报。”

因此,通过添加@coverage,您要求系统仅标记参考零件的内容。如果您想检查其他部分的覆盖范围,则可能要删除注释,或者也创建其他测试以覆盖这些部分,或者创建其他没有@covers的测试。

如果在phpunit.xml中将“ forceCoversAnnotation”设置为“ false”,则可以根据需要创建带@covers注释的teszt。

(我当前的版本是8.3.4)