我有几个项目不同扩展的 clover.xml 报告。我想将它们组合成一个 clover.xml,然后将其创建成一个 clover html。但我认为 phpunit 类没有办法PHP_CodeCoverage
,,,PHP_CodeCoverage_Report_HTML
。PHP_CodeCoverage_Report_Clover
这些类都不接受现有的 clover.xml。我想我也许可以使用 append 和 merge 的方法PHP_CodeCoverage
。但这不接受文件。
我有几个项目不同扩展的 clover.xml 报告。我想将它们组合成一个 clover.xml,然后将其创建成一个 clover html。但我认为 phpunit 类没有办法PHP_CodeCoverage
,,,PHP_CodeCoverage_Report_HTML
。PHP_CodeCoverage_Report_Clover
这些类都不接受现有的 clover.xml。我想我也许可以使用 append 和 merge 的方法PHP_CodeCoverage
。但这不接受文件。
如果您正在运行 jenkins 或类似工具,请在您的 Ant 构建文件中包含一个 php 脚本,以使用SimpleXML合并文件
一个例子在这里 http://kuttler.eu/post/merging-and-splitting-xml-files-with-simplexml/
然后在您的后期构建操作中,jenkins 将使用 clover.xml 生成您的代码覆盖率
正如上面 jkrnak 评论的那样,您不能简单地合并 XML 文件,因为在输出时计算了诸如覆盖的行等计算值。您需要在使用原生 PHP 代码的同时“合并”。在我的例子中,我想捕获由 newman 执行的一系列 Web 服务调用的覆盖范围。为此,我在执行开始时设置了一个标志,该标志在调用中持续存在(使用缓存),然后还将 PHP_CodeCoverage 对象也保存在缓存中。我的实现(在 Laravel 中)看起来像这样:
if ( isset($_GET['initCoverage']) )
{
Cache::put( 'recordCoverage', true, 1440 );
}
if ( Cache::has('recordCoverage') )
{
if ( Cache::has('coverage') )
{
$coverage = Cache::get('coverage');
}
else
{
$filter = new PHP_CodeCoverage_Filter;
$filter->addDirectoryToBlacklist( base_path() . '/vendor' );
$coverage = new PHP_CodeCoverage( null, $filter );
}
$coverage->start( Request::method() . " " . Request::path() );
if ( isset($_GET['dumpCoverage']) )
{
if ( Cache::has('coverage') )
{
// Prevent timeout as writing coverage reports takes a long time
set_time_limit( 0 );
$coverage = Cache::get( 'coverage' );
$writer = new PHP_CodeCoverage_Report_Clover;
$writer->process($coverage, 'results/coverage/clover.xml');
}
Cache::forget('recordCoverage');
Cache::forget('coverage');
}
else
{
register_shutdown_function( function($coverage)
{
$coverage->stop();
Cache::put( 'coverage', $coverage, 1440);
}, $coverage);
}
}
这会在单个覆盖对象中捕获一系列测试,然后在我使用“dumpCoverage”标志进行调用时输出。
多年后,这个问题仍然部分未解决。SB有一个项目可以合并三叶草文件,但它需要 php 5.6。
上述答案都不够好。这是合并的要点。欢迎建设性批评。
用法:
php clover-merge.php -o merged.xml -f clover-phpunit.xml -f clover-phpspec.xml
也将其发布在这里以供后代使用:
<?php
$options = getopt("f:o:");
if (! isset($options['f'])) {
echo "Files have to be specified with -f\n";
exit(1);
}
if (! isset($options['o'])) {
echo "Output has to be specified with -o\n";
exit(1);
}
$files = $options['f'];
if (! is_array($files)) {
$files = array($files);
}
$output = $options['o'];
$buffer = '';
foreach ($files as $file) {
if (! file_exists($file)) {
echo "File '$file' doesn't exist\n";
exit(2);
}
$report = simplexml_load_file($file);
$buffer .= $report->project->asXML();
}
$fh = fopen($output ,'w');
if (! $fh) {
echo "Cannot open '$output' for writing\n";
exit(2);
}
fwrite($fh, sprintf('<?xml version="1.0" encoding="UTF-8"?><coverage>%s</coverage>', $buffer));
fclose($fh);