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から取得した方が良さそうです。早く新しいの出ないかなぁ。。。