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 が出力したものになってしまいましたが。