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

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

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

 Jens A. Koch10 нояб. 2012 г., 11:51
Та же проблема здесь. Это'Матрица сборки. Каждый clover.xml имеет определенные пропуски. Пока объединенный clover.xml не должену них есть. PHPUnit не предоставляет утилиту объединения покрытия.
 jkrnak22 янв. 2014 г., 18:42
Я думаю, что это не может быть сделано. Поскольку PHPUnit использует xdebug, чтобы узнать, какие строки были вызваны, а какие нетт. Просто объединить покрытие линии представляется возможным. Но если вы посмотрите в XML-файл, вы 'Посмотрим, что есть другие метрики, такие как охват заявления. Для этого вам нужно токенизировать источник, чтобы решить, полностью ли охвачен оператор (функция) или нет.

Ответы на вопрос(3)

Как прокомментировал 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» флаг.

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

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

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

 Josh Woodcock20 июл. 2014 г., 17:17
Вот'Пример того, как объединить 2 xml-отчета. Хотя это для объединения файлов phpcs.xml, концепция та же самая.beagile.biz/merge-2-php-code-sniffer-clover-xml-reports
 Obaid Maroof21 мар. 2014 г., 14:35
Извините, но я не могt найти способ отформатировать / структурировать XML в разделе комментариев.
 Obaid Maroof21 мар. 2014 г., 14:32
Но как именно объединить разные покрытия XML? Я имею в виду на основе какого узла XML? Мой XML имеет (примерно) следующую структуру: <покрытие ...>  <проект ...>   <файл ...>    <класс ...> ... </ Класс>    <линия ... />    <линия ... />    ... </ Файл> </ Проект> </ Освещение>

Спустя годы эта проблема все еще частично не решена. Eстьпроект SB это может объединить файлы клевера, но это требует php 5.6.

Ни один из ответов выше не работает достаточно хорошо.Вот суть слияния, брошенного вместе. Конструктивная критика приветствуется.

Использование:

php clover-merge.php -o merged.xml -f clover-phpunit.xml -f clover-phpspec.xml

Размещать его здесь и для потомков:

project->asXML();
}

$fh = fopen($output ,'w');
if (! $fh) {
    echo "Cannot open '$output' for writing\n";
    exit(2);
}
fwrite($fh, sprintf('%s', $buffer));
fclose($fh);

Ваш ответ на вопрос