phpunit合并两个或多个clover.xml报告

phpunit合并两个或多个clover.xml报告,php,phpunit,code-coverage,clover,Php,Phpunit,Code Coverage,Clover,我有几个关于项目不同扩展的clover.xml报告。我想将它们组合成一个clover.xml,然后将其创建成一个clover html。但是我看不到phpunit类PHP\u CodeCoverage,PHP\u CodeCoverage\u Report\u HTML,PHP\u CodeCoverage\u Report\u Clover 这些类都不接受现有的clover.xml。我想我可能能够使用PHP\u CodeCoverage的append和merge方法。但是这不接受文件。如果您正

我有几个关于项目不同扩展的clover.xml报告。我想将它们组合成一个clover.xml,然后将其创建成一个clover html。但是我看不到phpunit类
PHP\u CodeCoverage
PHP\u CodeCoverage\u Report\u HTML
PHP\u CodeCoverage\u Report\u Clover


这些类都不接受现有的clover.xml。我想我可能能够使用
PHP\u CodeCoverage
的append和merge方法。但是这不接受文件。

如果您正在运行jenkins或类似程序,请在Ant构建文件中包含一个php脚本,以便使用

这里就是一个例子

然后在构建后的操作中,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”标志进行调用时输出。

几年后,这个问题仍然部分没有解决。有一种方法可以合并clover文件,但它需要PHP5.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);
project->asXML();
}
$fh=fopen($output,'w');
如果(!$fh){
echo“无法打开“$output”进行写入\n”;
出口(2);
}
fwrite($fh,sprintf('%s',$buffer));
fclose($fh);

这里也有同样的问题。这是一个矩阵构建。每个clover.xml都有某些跳过。而合并的clover.xml不应该包含它们。PHPUnit不提供覆盖合并util。我想这是不可能的。因为PHPUnit正在使用xdebug来找出哪些行被调用,哪些行没有被调用。仅仅合并线路覆盖似乎是可能的。但是,如果查看xml文件,您将看到还有其他指标,比如语句覆盖率。为此,您需要对源代码进行标记,以确定语句(函数)是否已完全覆盖?我的意思是基于哪个XML节点?我的XML(大致)具有以下结构:。。。很抱歉,我在评论部分找不到格式化/构造XML的方法。下面是一个如何合并两个XML报告的示例。虽然这是为了合并phpcs.xml文件,但概念是相同的。