Ben*_*LET 5 php phpunit code-coverage
出于某些原因,我想使用 PHP_CodeCoverage 来分析我的应用程序的代码覆盖率,而不是使用 PHP 单元(通过手动测试)。
我知道如何长期使用 XDebug(跨多个请求,通过将代码覆盖率分析保留在共享内存中)。使用 XDebug 的输出(它是一个简单的关联数组并记录在案)之后,在一些测试之后构建简单的 XML 文件,例如 clover.xml(或任何其他格式)并不困难。
有没有办法指示 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);
Run Code Online (Sandbox Code Playgroud)
当我的测试活动完成后,我可以将所有临时文件合并到同一个 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');
Run Code Online (Sandbox Code Playgroud)
不要忘记设置 PHP_CodeCoverage_Filter 以便消除您的框架和您可能使用的许多库中所有不需要的脚本。
如果您使用 CodeIgniter,您可以像我为我的项目所做的那样依赖钩子。