3

私はPHPUnit3.5.14を使用しており、// @codeCoverageIgnore [Start | End]で特定の部分を除いて、PHPアプリケーションの100%をカバーする一連のテストを行っています。HTMLカバレッジレポートには、100%のカバレッジが表示されます。しかし、100%のカバレッジ要件を適用するためにJenkinsに読んでもらいたいClover XMLカバレッジレポートを生成すると、無視されたすべてのコードがカバーされていないものとして表示されます。

たとえば、20個のメソッドを持つコントローラークラスがあり、そのうちの1つは次のようになります。

// @codeCoverageIgnoreStart
/**
 * Gets an instance of Foo.  Abstracted for testing.
 *
 * @param array $options The constructor argument
 *
 * @return Foo
 */
protected function _getFoo(array $options)
{
    return new Foo($options);
}
// @codeCoverageIgnoreEnd

HTMLカバレッジレポートには、完全に無視されたものを含め、カバーされた20のメソッドが表示されます。

写真:カバレッジレポートの抜粋

ここに画像の説明を入力してください http://i.imgur.com/VRtKR.png

しかし、Clover XMLレポートは、19/20のメソッドがカバーされていることを示しており、_getFooについては言及していません。

<class name="CampaignController" namespace="global" (...)>
  <metrics methods="20" coveredmethods="19" conditionals="0" coveredconditionals="0" statements="532" coveredstatements="532" elements="552" coveredelements="551"/>

..。

  <line num="592" type="stmt" count="1"/>
  <line num="593" type="stmt" count="1"/>
  <line num="615" type="method" name="createAction" crap="2" count="2"/>
  <line num="617" type="stmt" count="2"/>

(上部の_getFoo行は596〜608行です。)

PHPUnit構成のロギングセクションは次のようになります。

<logging>
    <log type="coverage-html" target="../public/build/coverage" charset="UTF-8"
        yui="true" highlight="true" lowUpperBound="90" highLowerBound="100"/>
    <log type="coverage-clover" target="../public/build/test-coverage.xml"/>
</logging>

Cloverカバレッジログエントリを構成する方法、またはカバレッジ無視コメントを変更して、CloverレポートがHTMLレポートと一致する100%カバレッジを示すようにする方法はありますか?

4

1 に答える 1

2

問題は にありますPHP_CodeCoverage_Report_Clover::process()PHP_Token_Streamメソッド内の行数を合計する際にマークされた行を正しく無視しますが、それらのコード カバレッジ コメントを認識していないメソッドのリストを取得します。私は github で問題 #54を作成しましたが、これは比較的簡単に修正できるはずです。

ところで、PHP_CodeCoverage::getLinesToBeIgnored()which uses を読んで、docblockPHP_CodeCoverage_Report_Cloverに追加することで、クラスまたはメソッド全体を無視できるようです。@codeCoverageIgnore

/**
 * Gets an instance of Foo.  Abstracted for testing.
 *
 * @param array $options The constructor argument
 * @return Foo
 *
 * @codeCoverageIgnore
 */

これで問題が解決するわけではありませんが、対応する//コメントを使用するよりは簡単です。

更新:修正を試してみたい場合は、foreach内部のメソッドのループPHP_CodeCoverage_Report_Clover::process()をこの変更されたバージョンに置き換えてください。

foreach ($_class['methods'] as $methodName => $method) {
    $methodCount        = 0;
    $methodLines        = 0;
    $methodLinesCovered = 0;

    for ($i  = $method['startLine'];
         $i <= $method['endLine'];
         $i++) {
        if (isset($ignoredLines[$i])) {
            continue;
        }

        $add   = TRUE;
        $count = 0;

        if (isset($files[$filename][$i])) {
            if ($files[$filename][$i] != -2) {
                $classStatistics['statements']++;
                $methodLines++;
            }

            if (is_array($files[$filename][$i])) {
                $classStatistics['coveredStatements']++;
                $methodLinesCovered++;
                $count = count($files[$filename][$i]);
            }

            else if ($files[$filename][$i] == -2) {
                $add = FALSE;
            }
        } else {
            $add = FALSE;
        }

        $methodCount = max($methodCount, $count);

        if ($add) {
            $lines[$i] = array(
              'count' => $count,
              'type'  => 'stmt'
            );
        }
    }

    if ($methodLines > 0) {
        $classStatistics['methods']++;

        if ($methodCount > 0) {
            $classStatistics['coveredMethods']++;
        }

        $lines[$method['startLine']] = array(
          'count' => $methodCount,
          'crap'  => PHP_CodeCoverage_Util::crap(
                       $method['ccn'],
                       PHP_CodeCoverage_Util::percent(
                         $methodLinesCovered,
                         $methodLines
                       )
                     ),
          'type'  => 'method',
          'name'  => $methodName
        );
    }
}
于 2011-08-05T00:02:49.997 に答える