PHPUnit如何合并两个或多个clover.xml报告。

5
我有几份来自同一项目不同扩展的 clover.xml 报告。我想将它们合并成一个 clover.xml 文件,然后生成为 clover html 文件。但是,我发现使用 phpunit 类 PHP_CodeCoveragePHP_CodeCoverage_Report_HTMLPHP_CodeCoverage_Report_Clover 无法实现。
这些类都不接受已存在的 clover.xml 文件。我曾尝试使用 PHP_CodeCoverage 的 append 和 merge 方法,但是这些方法不支持文件。

这里也有同样的问题。这是一个矩阵构建。每个clover.xml都有一些跳过。而合并后的clover.xml不应该有它们。PHPUnit没有提供覆盖率合并工具。 - Jens A. Koch
我猜这是做不到的。因为PHPUnit使用xdebug来找出哪些行已经被调用,哪些没有被调用。只是合并行覆盖率似乎是可能的。但是,如果您查看XML文件,您会发现还有其他指标,例如语句覆盖率。为了实现这一点,您需要对源代码进行分词以确定一个语句(函数)是否已经完全覆盖或未覆盖。 - jkrnak
3个回答

0

正如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”标志进行调用时,该对象将被输出。


0
多年以后,这个问题仍然部分未解决。有一个SB 项目可以合并 clover 文件,但它需要 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);

0

但是如何合并不同的覆盖率XML呢?我的意思是基于哪个XML节点?我的XML大致具有以下结构: <coverage ...> <project ...> <file ...> <class ...> ... </class> <line .../> <line .../> ... </file></project></coverage> - Obaid Maroof
抱歉,我无法在注释部分格式化/结构化XML。 - Obaid Maroof
以下是如何合并两个XML报告的示例。虽然这是用于合并phpcs.xml文件,但概念是相同的。http://beagile.biz/merge-2-php-code-sniffer-clover-xml-reports/ - Josh Woodcock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接