如何在没有 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(并不难 - 网上有很多说明)但您不需要任何其他库。
只需阅读代码 - 它非常简单明了。只用了一个小时左右的时间编写并运行
出于某些原因,我想使用 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(并不难 - 网上有很多说明)但您不需要任何其他库。
只需阅读代码 - 它非常简单明了。只用了一个小时左右的时间编写并运行