提问人:Dave 提问时间:4/21/2011 最后编辑:halferDave 更新时间:3/5/2016 访问量:11088
PHPUnit 的代码覆盖率
Code Coverage with PHPUnit
问:
我在尝试确定我们网站上的代码覆盖率时遇到了问题。我让 PHPUnit 在三个应用程序上运行单元测试时生成一个 html 代码覆盖率报告。我们有一个公共应用程序、一个管理应用程序和一个报告应用程序。我想以某种方式将这些合并到一个代码覆盖率报告中,因为应用程序共享代码。
代码覆盖率似乎只是在计算测试“接触”的文件的覆盖率,因此在计算中没有使用完全未经测试的文件。有谁知道如何将这些未使用的文件拉入计算中?有没有办法告诉覆盖率生成器使用某些目录进行计算,以便它拉入未触及的文件?我在 phpunit 的配置文件中设置了一个白名单,设置为我们项目的根目录。欢迎所有评论、答案和建议。
答:
我认为 PHPUnit 使用 XDebug,它为实际执行的文件提供了字面上的覆盖率数据。它无法为从未执行的文件提供数据,因为调试器永远不会看到它们。您可以手动修补 PHPUnit 机制,将您认为在应用程序中的所有文件的列表添加到从 XDebug 返回的结果中。
我们的 PHP 测试覆盖率工具的工作方式不同。你给它一个你认为的所有文件的列表 是您申请的一部分;它可以帮助您构建此列表。(这与您必须修补到第一个解决方案中的列表相同)它检测所有提到的文件,并收集测试覆盖率数据。您现在获得的覆盖率数据正确地包含了所有内容。它应该可以与 PHPUnit 一起使用。
你可以走得更远。您可以为每个“独立”应用程序创建测试覆盖率,并单独运行它们。然后,您可以合并所有数据集的覆盖率数据,以查看整个集合的覆盖率。
评论
phpunit.xml
如果你在配置文件中设置了一个,你应该看到所有未覆盖的文件。这可能是路径的问题,请尝试绝对路径,看看它为某些文件创建了 0% 的覆盖率,然后使相对路径起作用。<whitelist>
phpunit.xml
对于结合覆盖范围,我所知道的 phpunit 没有太多可以做到的。您可以手动组合覆盖率结果(PHPUnit_Coverage包),然后弄清楚如何渲染它们,但您需要手动完成。至少我不知道有任何项目/工具/方法可以为您做到这一点。
最简单的方法是在一次 phpunit 运行中运行所有 3 个测试套件,并让它为您要访问的部分生成代码覆盖率。
评论
这听起来可能很疯狂,但为什么不创建一个测试用例,以递归方式循环访问您的项目文件夹,并在它找到的每个文件上运行require_once呢?这应该允许 XDebug 为每个所需的文件创建一个新的代码覆盖率 html 文件。
评论
我遇到了同样的问题,我只是在运行测试套件之前添加了测试存根的生成(针对每个类和公共方法)。在phpUnit中,你甚至可以选择:
http://www.phpunit.de/manual/current/en/skeleton-generator.html
评论
像这样使用:<whitelist processUncoveredFilesFromWhitelist="true">
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">../folder/</directory>
</whitelist>
</filter>
评论