phpunit объединяет два или более отчетов clover.xml

У меня есть несколько отчетов clover.xml о различных расширениях проектов. Я хочу объединить их в один clover.xml, а затем создать его в HTML клевера. Но я не вижу пути с классами phpunit PHP_CodeCoverage, PHP_CodeCoverage_Report_HTML, PHP_CodeCoverage_Report_Clover,

Ни один из этих классов не принимает существующий clover.xml. Я думал, что смогу работать с методами добавления и слияния PHP_CodeCoverage, Но это не принимает файлы.

3 ответа

Если вы работаете с jenkins или чем-то подобным, включите скрипт php в файл сборки Ant, чтобы объединить файлы с помощью SimpleXML

Пример здесь http://kuttler.eu/post/merging-and-splitting-xml-files-with-simplexml/

Затем в ваших действиях пост-сборки jenkins будет использовать clover.xml для генерации покрытия кода

Спустя годы эта проблема все еще частично не решена. Существует проект 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);

Как прокомментировал jkrnak выше, вы не можете просто объединить файлы XML, так как есть вычисленные значения, такие как покрытые строки и т. Д., Которые вычисляются во время вывода. Вам нужно "объединить", все еще работая с нативным кодом PHP. В моем случае я хотел охватить серию вызовов веб-сервисов, выполняемых newman. Чтобы сделать это, я установил флаг в начале выполнения, который сохраняется во всех вызовах (с использованием кэша), а затем также сохранил объект 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".

Другие вопросы по тегам