如何在没有 PHPUnit 的情况下使用 PHP_CodeCoverage?

How to use PHP_CodeCoverage without PHPUnit?

出于某些原因,我想使用 PHP_CodeCoverage 来分析我的应用程序的代码覆盖率,而不是使用 PHP 单元(手动测试)。

我知道如何在长 运行 上使用 XDebug(跨多个请求,通过将代码覆盖分析保存在共享内存中)。在一些测试之后构建简单的 XML 文件,例如 clover.xml(或任何其他格式)对于 XDebug 的输出并不困难(它是一个简单的关联数组,并且已记录)。

有没有办法指示 PHP_CodeCoverage 使用 clover.xml(或其他文件格式)以生成 HTML 报告(非常好)。或者您知道一个简单的 hack 依赖 PHP_CodeCoverage 内部函数直接处理 XDebug 的输出以生成 HTML 报告。

经过一些实验,这就是我开发的。

首先,您需要按照文档中的说明使用 PHP_CodeCoverage。覆盖代码分析结束后,可以将PHP_CodeCoverage对象序列化到一个临时文件中。在这里,我使用 uniqid 以便为每个请求提供唯一的名称。您需要使用下面的代码片段将您的代码插入应用程序的通用脚本中(请求开始的第一部分和请求结束的第二部分):

require_once "phpcov/vendor/autoload.php";
$filter = new PHP_CodeCoverage_Filter();
$filter->addDirectoryToBlacklist(__DIR__ . "/phpcov");
$token = uniqid();
$coverage = new PHP_CodeCoverage(null, $filter);
$coverage->start($token);

//Do something

$coverage->stop();

$s = serialize($coverage);
file_put_contents('tmp/' . $token, $s);

当我的测试活动完成后,我可以将所有临时文件合并到同一个 PHP_CodeCoverage_Report_HTML:

require_once "phpcov/vendor/autoload.php";
$coverage = new PHP_CodeCoverage();

$files = glob('tmp/*');
foreach($files as $file) {
    $s = file_get_contents($file);
    $data = unserialize($s);
    $coverage->merge($data);
}

$writer = new PHP_CodeCoverage_Report_HTML;
$writer->process($coverage, 'report-coverage');

不要忘记设置 PHP_CodeCoverage_Filter 以消除您的框架和您可能使用的许多库中所有不需要的脚本。

如果您使用的是 CodeIgniter,则可以像我对 my project 所做的那样依赖钩子。

因此,如果您不想使用 php_unit 或 php_CodeCoverage 来获取代码覆盖率信息,我意识到自己编写它非常容易。将数据捕获到多个文件中(每个 运行 一个文件)大约需要 50 行代码,然后合并所有代码覆盖 运行s 大约需要 100 行代码(我可以得到它降到 80 - 这真的没那么难)。这 100 行代码输出了一个非常漂亮的文档,其中覆盖的行为淡绿色,未覆盖的代码行为粉红色背景,无关紧要的行(例如注释和空格)为白色背景。

代码非常简单易读,可以在这里找到: https://github.com/jlgtechnologies/php_code_coverage/blob/master/php_code_coverage_report.php

我添加了一个 lgpl,但如果您想要不同的许可证,请在 github 上告诉我。

只需将 php_code_coverage.php 添加到您想要覆盖的文件之一的顶部,如果您只想对某些文件进行代码覆盖,则可选择调用白名单过滤器。

然后从浏览器调用另一个文件以获取报告:php_code_coverage_report.php

文件最终在 /tmp/ 中,因此如果您更改代码或想要重置覆盖范围,您只需执行 rm -f /tmp/phpcc_*

您需要将 xdebug 模块安装到 php(并不难 - 网上有很多说明)但您不需要任何其他库。

只需阅读代码 - 它非常简单明了。只用了一个小时左右的时间编写并运行