PHPUnit的代码覆盖率

PHPUnit的代码覆盖率,php,phpunit,code-coverage,phpundercontrol,Php,Phpunit,Code Coverage,Phpundercontrol,我在尝试确定网站上的代码覆盖率时遇到了一个问题。我让PHPUnit在三个应用程序上运行单元测试时生成html代码覆盖率报告。我们有一个公共应用程序、一个管理应用程序和一个报告应用程序。我想以某种方式将它们合并到一个代码覆盖率报告中,因为应用程序共享代码 代码覆盖率似乎只是计算测试“接触”的文件的覆盖率,因此在计算中没有使用完全未测试的文件。有人知道如何将这些未使用的文件拉入计算吗?有没有一种方法可以告诉覆盖率生成器使用某些目录进行计算,这样它就可以提取未触及的文件?我在phpunit的配置文件中

我在尝试确定网站上的代码覆盖率时遇到了一个问题。我让PHPUnit在三个应用程序上运行单元测试时生成html代码覆盖率报告。我们有一个公共应用程序、一个管理应用程序和一个报告应用程序。我想以某种方式将它们合并到一个代码覆盖率报告中,因为应用程序共享代码


代码覆盖率似乎只是计算测试“接触”的文件的覆盖率,因此在计算中没有使用完全未测试的文件。有人知道如何将这些未使用的文件拉入计算吗?有没有一种方法可以告诉覆盖率生成器使用某些目录进行计算,这样它就可以提取未触及的文件?我在phpunit的配置文件中设置了一个白名单,并将其设置为项目的根目录。欢迎所有评论、答案和建议。

我认为PHPUnit使用XDebug,它为实际执行的文件提供了覆盖率数据。它无法为从未执行过的文件提供数据,因为调试器从未看到它们。您可以手动修补PHPUnit机制,将您认为存在于应用程序中的所有文件的列表添加到XDebug返回的结果中

我们的工作方式不同。你给它一个你认为所有文件的列表 是您申请的一部分;它可以帮助你建立这个列表。(这与您必须修补到第一个解决方案中的列表相同)它为所有提到的文件提供工具,并收集测试覆盖率数据。您现在获得的覆盖率数据正确地包括了所有内容。它应该与PHPUnit一起工作


你可以走得更远。您可以为每个“单独”的应用程序创建测试覆盖率,并分别运行它们。然后,您可以组合所有这些文件的覆盖率数据,以查看整个集合的覆盖率。

如果您在
phpunit.xml
配置文件中设置了
,则应该会看到所有未覆盖的文件。路径可能有问题,请尝试绝对路径,以确保它为某些文件创建0%的覆盖率,然后使相对路径正常工作

就我所知,对于合并覆盖范围而言,您无法与phpunit进行太多的合作。您可以手动组合覆盖结果(PHPUnit_覆盖包),然后找出如何渲染它们,但您需要手动完成。至少我不知道有什么项目/工具/方式能为你做到这一点


最简单的方法是在一次phpunit运行中运行所有3个测试套件,并让它为您所关注的部分生成代码覆盖率。

这听起来可能很疯狂,但为什么不创建一个测试用例,在项目文件夹中递归循环,并在找到的每个文件上运行一次?这应该允许XDebug为每个需要的文件创建一个新的代码覆盖率html文件。

我遇到了同样的问题,我只是在运行测试套件之前添加了测试存根的生成(针对每个类和公共方法)。您甚至可以在phpUnit中选择:

像这样使用

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

../文件夹/


显而易见的答案是编写调用未触及文件的测试。这是事实,但我试图避免这种情况,因为我希望获得相对准确的代码覆盖率百分比,以便设定目标。PHPUnit在线文档似乎给人的印象是,将这些文件添加到白名单中会包括它们,但我不太确定。我不知道我是否真的理解您的问题,但为什么您希望在代码覆盖率报告中包括未触及的文件?e、 g.如果有一个脚本a在运行testX时与之无关(因此未被触及),为什么脚本a应该包含在代码覆盖率报告中???是的,问题是我有三个单独的应用程序运行它们。因此必须有三个单独的phpunit调用。感谢您在白名单上提供的信息,我将仔细检查我的路径。为什么您不能在一个php进程中运行所有这三个应用程序?我们有一个phpunit管理程序来运行管理应用程序,一个phpunit报告程序用于我们的报告应用程序。您在phpunit调用周围有自定义包装脚本,或者是那些.xml文件还是什么?:)很抱歉,除了说“创建一个phpunit all来运行所有应用程序”是的包装器脚本,它基本上只是为该应用程序定义了一组常量之外,你并没有给我一些东西来处理。每个应用程序都要求设置不同的常量。不知道PHPUnit是否能够生成骨架代码!谢谢你!看起来我仍然会遇到我们的应用程序共享代码并生成单独的代码覆盖率报告的问题。@Dave Dohr:您应该在一个脚本中运行三个套件,并使用PHP_CodeCoverage::merge()连接这些实例中的数据,然后生成HTML/Clover报告我正在用带有巡航控制的ant脚本运行套件。我该怎么做呢?谷歌搜索PHP_CodeCoverage::merge()无效。蛮力!这真的有效吗?如果是这样的话,这可能是一个快速修复,直到我能想出一些不太“黑客”了。谢谢你,詹姆斯!此外,我们正在使用symfony框架,我们正在测试的一些操作目前有重复的名称。(例如listAction)我们在网站上使用了一个类名mangler,以避免与此相关的一些问题。如果文件名相同,运行require_一次不会导致错误吗?不同目录中的相同文件名不是问题。这种方法的问题是某些文件可能包含您可能不想执行的可执行代码(即:方法/函数之外的代码)。伙计们,我说这太疯狂了!PHPUnit还支持列出未在其覆盖率报告中运行的代码,只需将其添加到
PHPUnit.xml
中的白名单中即可。停止传播FUD。