使用PHPUnit进行代码覆盖率测试

4
我在尝试确定我们网站的代码覆盖率时遇到了问题。我使用PHPUnit在运行三个应用程序的单元测试时生成HTML代码覆盖报告。我们有一个公共应用程序、一个管理应用程序和一个报告应用程序。由于这些应用程序共享代码,我想将它们合并成一个代码覆盖报告。
看起来代码覆盖率仅计算测试“触及”的文件的覆盖率,因此未经测试的文件不会被纳入计算。是否有人知道如何将这些未使用的文件纳入计算?是否有一种方法可以告诉覆盖率生成器使用某些目录进行计算,以便它可以包含未被触及的文件?我在phpunit的配置文件中设置了白名单,根据我们项目的根目录设置。欢迎所有评论、答案和建议。

1
显而易见的答案是编写测试来调用未经修改的文件。 - Ira Baxter
这是正确的,但我想避免这种情况,因为我希望获得相对准确的代码覆盖率百分比以设定目标。在线的PHPUnit文档似乎给人的印象是将这些文件添加到白名单中将包括它们,但我不太确定。 - Dave
我不确定我是否真正理解你的问题,但是为什么你想在代码覆盖率报告中包含未被触及的文件呢?例如,如果有一个脚本A在运行testX时没有任何作用(因此未被触及),那么为什么应该将脚本A包含在代码覆盖率报告中呢? - Obaid Maroof
5个回答

5
如果您在phpunit.xml配置文件中设置了<whitelist>,则应该看到所有未覆盖的文件。这可能与路径有关,请尝试使用绝对路径来查看它是否为某些文件创建了0%的覆盖率,然后使相对路径起作用。
关于合并覆盖率,我不知道phpunit能做什么。您可以手动组合覆盖率结果(PHPUnit_Coverage package),然后找出如何呈现它们,但您需要手动完成。至少我不知道有任何项目/工具/方法可以为您完成此操作。
最简单的方法是在一个phpunit运行中运行您的三个测试套件,并让其生成您所关心的部分的代码覆盖率。

是的,问题在于我有三个不同的应用程序需要运行。因此必须进行三个单独的phpunit调用。感谢您提供白名单信息,我会仔细检查我的路径。 - Dave
为什么不能在一个PHP进程中运行这三个应用程序? - edorian
我们有一个phpunit-admin来运行管理应用程序,还有一个phpunit-reporting用于我们的报告应用程序。 - Dave
你是否在你的phpunit调用周围有自定义包装脚本,或者那些是.xml文件或其他什么? :) 抱歉,除了说“创建一个运行所有应用程序的phpunit-all”之外,你没有真正给我任何可以使用的东西。 - edorian
是的,包装脚本基本上只是为该应用程序定义一组常量。每个应用程序都需要以不同的方式设置这些常量。 - Dave

2

像这样使用<whitelist processUncoveredFilesFromWhitelist="true">

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

0

不知道PHPUnit能够生成框架代码!谢谢你的提醒!看起来我仍然会遇到我们应用程序共享代码和生成单独代码覆盖报告的问题。 - Dave
@Dave Dohr:你应该在一个脚本中运行三个测试套件,并使用PHP_CodeCoverage::merge()来合并这些实例的数据,然后生成HTML/Clover报告。 - ts.
我正在使用Cruise Control在ant脚本中运行测试套件。我该怎么做呢?尝试了谷歌搜索PHP_CodeCoverage::merge(),但没有结果。 - Dave

-1

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

我们的PHP测试覆盖工具的工作方式不同。您提供一个包含您认为是应用程序一部分的所有文件的列表;它会帮助您构建此列表。(这与第一种解决方案中必须打补丁的列表相同)它会对提到的所有文件进行检测,并收集测试覆盖数据。现在您获得的覆盖数据包括所有正确的内容。它应该可以很好地与PHPUnit配合使用。

您可以进一步操作。您可以为每个“独立”的应用程序创建测试覆盖,并单独运行它们。然后,您可以将所有应用程序的覆盖数据组合起来,以查看整体集的覆盖范围。


3
PHPUnit也支持在其覆盖率报告中列出未运行的代码,只需将其添加到phpunit.xml中的白名单即可。停止散布恐惧和怀疑。 - cweiske

-1
这可能听起来有些疯狂,但为什么不创建一个测试用例,递归地遍历您的项目文件夹,并在找到的每个文件上运行 require_once 呢?这样应该可以让 XDebug 为每个所需文件创建一个新的代码覆盖率 HTML 文件。

暴力破解!这真的行得通吗?如果可以,那么在我想出更少“hacky”的东西之前,这可能是一个快速解决方案。谢谢James! - Dave
另外,我们正在使用Symfony框架,目前正在测试的一些操作具有重复的名称(例如listAction)。我们在网站上使用类名修改器来避免与此相关的某些问题。如果文件名相同,运行require_once会导致错误吗? - Dave
不同目录中相同的文件名并不是问题。 - Edson Medina
这种方法的问题在于,有些文件可能包含可执行代码(即:在方法/函数之外),而您可能不希望执行它们。 - Edson Medina
嘿,伙计们,我说过这很疯狂! - james

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