Gradle でカバレッジを計測してみる その2

Gradle でカバレッジを計測してみる』に引き続き EMMA といきたいところですが、訳あって Gradle でのカバレッジ計測には Cobertura を使うことにしました。
と言うのも Jenkins CI の EMMA プラグインとは あまり相性が良くなさそうだからです。
なんと Jenkins CI の EMMA プラグインだとカバレッジの集計しか表示されないので、 Eclipse や html形式のようにソース上のどのコードが実行されていないのかまでは確認できないのです。

EMMA プラグインの不具合かと思ったのですが、実はそういう仕様らしい。 EMMA のリファレンスをよく読んでみたら Ant の report タスクの sourcepath 属性の説明に

An optional source path to use for report generation (a path-like structure). It is interpreted as a list of directories (separated by the OS-specific classpath separator or comma) containing .java source files. The local path names within each directory should reflect class package names. (Currently, only the HTML report generator uses this data, and only at method report depth.)
と書いてある。どうやら sourcepath は html 形式でしか利用されないらしい。
もちろん、Jenkins CI では xml 形式で出力されたファイルを使うはずなので xml ファイルにソースの物理パスが出力されないのではどうしようもない。

と言うことで、残念ながら、現状だと Jenkins CI を使う場合は EMMA よりも Cobertura を使った方が良いようです。
Jenkins CI の Cobertura プラグインを使えば ソースもちゃんと表示されます。
さらに html 形式では出力されないメソッドレベルの集計もちゃんと出力されるので非常にいい感じです。
もちろん、「Jenkins CI では カバレッジの集計値だけ参照できれば良いよ」 ていう方は EMMA でも良いですが...
CheckstyleFindBugs 等では 問題の箇所が ソース上で参照できるのに、カバレッジだけ参照できないのは なんだか ちょっと寂しい...

と言うことで、Gradle で Cobertura を使うための Gradle スクリプトはこんな感じです。
もちろん、例のごとく Ant タスクを利用しています。
既存の資産がそのまま使えるのが Gradle のいいところ...

このスクリプトでやっていることは とっても簡単です。ほとんど EMMA と同じです。
test タスクの doFirst で class ファイルに直接カバレッジ測定用の処理を追加して、 doLast で 計測したカバレッジのレポートを作成しています。
ちなみに doFirst はテスト前、doLast はテスト後に それぞれ実行されます。

もし、この Gradle スクリプトを利用する場合は、プロジェクトの gradle 配下に cobertura.gradle というファイル名で保存して、build.gradle に

apply from: 'gradle/cobertura.gradle'
を追加すれば良いです。もしくは、
fileTree(dir: 'gradle', includes: ['*.gradle']).each { apply from: it }
のように gradle 配下の Gradle スクリプトを全て読み込むようにしておいた方が便利かもしれません。
後は test タスクを
gradle test
のように実行するだけで、カバレッジを計測して build/reports/cobertura 配下にレポートを作成してくれます。