Advent Calendar 20日目 Jenkins の PHP コードカバレッジ推移グラフ
以前(11月の末頃)書いてて中途半端になってた記事を手直しして放出。
Jenkins での PHP コードカバレッジ推移グラフの表示について。
Jenkins by Kanon
jenkins でテストの自動化をしています。
[twitter:@yamashiro] さんの記事 (PHPでTDD&CIワークショップ、Jenkins + PHP の各種プラグインパート資料 - Yamashiro0217の日記) を参考にしましたが、インストールは Kanon (http://kanon.ultimania.org/trac/kanon) を利用しました。(本当は trac も効果的に使いたいと思っているのですが。。。)
pmd 警告や、コード重複警告はたくさんでているのですが、当初はテストがほとんどない状態でしたので、まずはカバレッジ6割程度を目標にテストを増やしています。
もちろん、カバレッジが全てではありませんが、定量的でわかりやすい指標ですし、何より(カバレッジが低い状態では)テストを書く度増えていくのですから、モチベーションが維持しやすいと思っています。
Advent Calendar 2日目 社内勉強会開催 - do_akiの徒然想記 でも書いたとおり、テストコードを書くのが自分だけだったので、モチベーション維持は結構重要だったりします。
カバレッジ推移グラフ
最初、カバレッジ推移グラフは無いのだと思っていました。あるとき存在を知り、「Clover PHP」によって表示されるハズということに気付きました。
でも何故か表示されていない。
原因を探ってみると、「Clover PHP カバレッジレポートを集計」 の Clover XMLパス が誤っていました。
何という初歩的な……。
なので、さっくりと適切なパスに変更して再ビルドしてみると・・・・・・
ERROR: Publisher org.jenkinsci.plugins.cloverphp.CloverPublisher aborted due to exception java.lang.NullPointerException at org.jenkinsci.plugins.cloverphp.CloverCoverageParser.trimPaths(CloverCoverageParser.java:29) at org.jenkinsci.plugins.cloverphp.CloverCoverageParser.parse(CloverCoverageParser.java:50) at org.jenkinsci.plugins.cloverphp.CloverPublisher.processCloverXml(CloverPublisher.java:216) at org.jenkinsci.plugins.cloverphp.CloverPublisher.perform(CloverPublisher.java:189) at hudson.tasks.BuildStepMonitor$3.perform(BuildStepMonitor.java:36) at hudson.model.AbstractBuild$AbstractRunner.perform(AbstractBuild.java:692) at hudson.model.AbstractBuild$AbstractRunner.performAllBuildSteps(AbstractBuild.java:667) at hudson.model.AbstractBuild$AbstractRunner.performAllBuildSteps(AbstractBuild.java:645) at hudson.model.Build$RunnerImpl.post2(Build.java:162) at hudson.model.AbstractBuild$AbstractRunner.post(AbstractBuild.java:614) at hudson.model.Run.run(Run.java:1429) at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46) at hudson.model.ResourceController.execute(ResourceController.java:88) at hudson.model.Executor.run(Executor.java:230)
Jenkins さんがお怒りに。(当然ビルドは失敗という扱い)
正しいパスを設定すると失敗。誤ったパスを指定するとカバレッジ推移がでない。
原因は Phing?
cloverphp の不具合かと思って google 先生に頼るも芳しい結果を得られず、半分諦めていました
そんなとき、phpunit コマンドによって吐き出される カバレッジレポートと Phing によって吐き出されるカバレッジレポートが異なることに気付きました。
そこで、元々 phing で coverage-setup task -> phpunit task -> coverage-report task とやっていたところを消し、
以下のように exec task を利用して phpunit を直接実行するようにしてみました。
build.xml
<target name="phpunit"> <mkdir dir="coverage" /> <exec command="phpunit -c phpunit_config.xml" logoutput="true" /> </target>
phpunit_config.xml
<phpunit> <testsuites> <testsuite name="Test"> <directory>ユニットテストの格納されたディレクトリ</directory> </testsuite> </testsuites> <filter> <whitelist> <directory suffix=".php">カバレッジ対象ソースコードのディレクトリ</directory> </whitelist> </filter> <logging> <log type="junit" target="phpunit.xml" /> # テスト結果XML <log type="coverage-html" target="coverage" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70" /> # (Clover) HTMLレポート <log type="coverage-clover" target="clover.xml" /> # Clover XML </logging> </phpunit>
結果はOK。問題なく取り込まれ、カバレッジ推移グラフが表示されるようになりました。
Clover HTMLレポート が Phing によって整形されたレポートではなく、 PHPUnit が出力したものになってしまいましたが。