Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

PHPUnit3+Phing2.3.0β1でカバレッジ解析の結果がおかしい

PHPUnit3.1.7+Phing2.3.0β1でハマってましたが、やっと解決。。。
以下のようなbuild.xml

<?xml version="1.0" encoding="utf-8"?>
<project name="Test" basedir="." default="test">
  <target name="clean-test">
    <delete dir="reports" includeemptydirs="true" verbose="true" failonerror="false" />
    <phingcall target="test"/>
  </target>

  <target name="test">
    <mkdir dir="reports/tests" />
    <mkdir dir="reports/coverage" />

    <coverage-setup database="reports/coverage.db">
      <fileset dir=".">
        <include name="*.php"/>
        <exclude name="*Test.php"/>
      </fileset>
    </coverage-setup>

    <phpunit2 haltonfailure="true" printsummary="true" codecoverage="true">
      <batchtest>
        <fileset dir=".">
          <include name="*Test.php"/>
        </fileset>
      </batchtest>
    </phpunit2>

    <coverage-report>
      <report todir="reports/coverage" styledir="etc"/>
    </coverage-report>
  </target>
</project>

を使って

$ phing clean-test

とすると、テストを実行してカバレッジ解析結果のHTMLを出力してくれるわけですが、どうもカバレッジの結果がおかしい。。。PHPUnit3のテストスイートを使って

$ phpunit AllTest

という具合にテストした場合、カバレッジ100%となる事を確認しているにも関わらず、カバレッジ19%とか40%とか。。。動作的には「何か1つのテスト結果だけがカバレッジとして出ている」感じでした。これってどうよ :-(
ということで、Phingのソース・動作を追っかけてみたところ、PHPUnitTestRunnerクラスのrunメソッドで

  • テスト実行
  • カバレッジ結果をマージ(CoverageMerger::merge)
  • 後処理

をやっていて、このうちマージに渡す引数が間違っていることが判明。最初、CoverageMerger側がおかしいのかと思い、いろいろ調べていたのでかなり時間を食いました。。。orz
Phing2.3.0β1のソースは

<?php$coverageInformation = $res->getCodeCoverageInformation();
            
            if (PHPUnitUtil::$installedVersion == 3)
            {
                CoverageMerger::merge($this->project, array($coverageInformation[0]['files']));
            }
            else

となっていますが、本来、すべての'files'を渡す必要がありました(これだと複数のテスト結果のうち、1つだけを渡している)。そこで

<?php$coverageInformation = $res->getCodeCoverageInformation();
            
            if (PHPUnitUtil::$installedVersion == 3)
            {
                foreach ($coverageInformation as $info)
                {
                    CoverageMerger::merge($this->project, array($info['files']));
                }
            }
            else

とすることで、(全く同じというわけではないですが)期待する動作になりました。
で、Phingのsvnを見てみると、同様の修正がすでにされていました。。。

つか、4ヶ月も前かよ。。。


PHPUnit3とPhingを連携させる場合、現時点ではPhingはsvnから取得した方が良さそうです。早く新しいの出ないかなぁ。。。