Phpunit覆盖率:'addUncoveredFilesFromWhitelist'和'processUncoveredFilesFromWhitelist'选项有什么区别?

28

我正在尝试为phpunit建立特定目录的代码覆盖率。 有人可以告诉我这两者之间有什么区别吗:

<filter>
    <whitelist>
        <directory suffix=".php">lib/</directory>
    </whitelist>
</filter>

<filter>
    <whitelist addUncoveredFilesFromWhitelist="true">
        <directory suffix=".php">lib/</directory>
    </whitelist>
</filter>

<filter>
    <whitelist processUncoveredFilesFromWhitelist="true">
        <directory suffix=".php">lib/</directory>
    </whitelist>
</filter>

目前前两个选项可以使用(覆盖率数字不同),但第三个选项将会失败并出现类似于如何在 Yii 应用程序的 PHPUnit 代码覆盖报告中添加未覆盖的文件的错误。

刚开始接触 phpunit,并希望了解这些白名单选项之间的区别。我已经阅读了官方文档,但不确定是否理解正确。

2个回答

39
在GitHub上查看 php-code-coverage 包的源代码,可以发现以下真相:
  • 如果 addUncoveredFilesFromWhitelistFALSE,那么代码覆盖率仅包含有加载和执行过的文件信息(只包括包含代码的行);
    在这种情况下,忽略 processUncoveredFilesFromWhitelist 的值;
  • 如果 addUncoveredFilesFromWhitelistTRUE,则白名单中未加载和执行的文件也会包含在代码覆盖率中:
    • 如果 processUncoveredFilesFromWhitelistFALSE,则这些文件不会以任何方式进行处理;它们的所有行都将出现在代码覆盖率中,包括空行和仅包含注释的行;这是一种快捷而粗暴的方法来完成任务;
    • 如果 processUncoveredFilesFromWhitelistTRUE,则这些文件将被包含,并使用 XDebug 的代码覆盖率功能(与实际运行的文件相同)将仅包括包含代码的行放入报告中;这是一种缓慢而辛苦的方式。
addUncoveredFilesFromWhitelist 的默认值为 TRUE,而 processUncoveredFilesFromWhitelist 的默认值为 FALSE。这意味着来自白名单的未覆盖文件(因为它们没有运行)将使用快速方法并在报告中包含其覆盖报告,虽然准确度为零(0%),但使用略微大于真实值的总行数进行计算。
然而,由于任何数量的零仍为 0%,因此认为这是将未覆盖的文件包含在报告中的最佳方式。

300行代码中未覆盖的0行代码将导致0%,但0/300会影响总行数计数,这可能只有100个实际语句。因此,虽然提供了更快的收集覆盖率统计信息的方法,但它增加了实际覆盖率统计信息的误差。 - Eduard Sukharev
1
@EduardSukharev 不要把高代码覆盖率作为目标,而是要验证代码行为是否符合规格。达到 100% 的代码覆盖率很容易,但这是否意味着代码已经完全测试过了呢? - axiac
2
对我而言,在PHPStorm 2017.3中运行PHPUnit 6.5.6并使用processUncoveredFilesFromWhitelist="true"比使用processUncoveredFilesFromWhitelist="false"快大约两倍。 - steros

6
我认为我错了。这是文档对此的说法:
可选地,通过在您的PHPUnit配置中设置addUncoveredFilesFromWhitelist="true"(请参见“为代码覆盖率包含和排除文件”一节),可以将所有已列入白名单的文件添加到代码覆盖率报告中。这允许包括尚未进行任何测试的文件。如果您想获取有关这样一个未覆盖文件的哪些行是可执行的信息,例如,您还需要在您的PHPUnit配置中设置processUncoveredFilesFromWhitelist="true"(请参见“为代码覆盖率包含和排除文件”一节)。
因此,答案是添加未覆盖的文件将把它们包含在覆盖率报告中,但实际上处理它们将收集更多信息。

请查看Sebastian的这个twitter对话。从Twitter上的简洁来看,很难说清楚,但看起来addUncoveredFilesFromWhitelist可能只是旧形式的processUncoveredFilesFromWhitelist提供的同样功能,用于遗留代码。

Twitter对话的内容如下:

@user1:在@phpunit中,addUncoveredFilesFromWhitelist="true"和processUncoveredFilesFromWhitelist="true"有什么区别?

@s_bergmann:你应该使用processUncoveredFilesFromWhitelist。如果它不起作用(遗留代码),那么使用addUncoveredFilesFromWhitelist。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接