5

プロジェクトのさまざまな拡張機能に関するいくつかの clover.xml レポートがあります。それらを 1 つの clover.xml に結合し、それを clover html に作成したいと考えています。しかし、私は phpunit クラスでは方法がありませんPHP_CodeCoverage, PHP_CodeCoverage_Report_HTML, PHP_CodeCoverage_Report_Clover.

これらのクラスはいずれも、既存の clover.xml を受け入れません。のメソッド append と merge で作業できるかもしれないと思いましたPHP_CodeCoverage。しかし、それはファイルを受け入れません。

4

3 に答える 3

0

jenkinsなどを実行している場合は、Antビルドファイルにphpスクリプトを含めて、SimpleXMLを使用してファイルをマージします。

例はここにあります http://kuttler.eu/post/merging-and-splitting-xml-files-with-simplexml/

次に、ビルド後のアクションで、jenkinsはclover.xmlを使用してコードカバレッジを生成します

ここに画像の説明を入力してください

于 2013-02-18T04:41:24.367 に答える
0

数年後、この問題はまだ部分的に解決されていません。clover ファイルをマージできる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);
于 2016-02-01T14:14:21.367 に答える
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」フラグを使用して呼び出しを行うと出力されます。

于 2014-11-25T05:11:13.357 に答える