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

前回は Gradle でテストを並列で実行してみましたが、テストと言えば、カバレッジも測定しないと...
と言うことで、今回は Gradle で テストを実行して、その際のカバレッジを測定してみることに...
Javaカバレッジツールと言えば

が有名ですが、今回は EMMA を使ってみました。
EMMA を選んだ理由は
  • メソッドレベルまで計測できる
  • Eclipse プラグイン (EclEmma) も提供されている (Gradle とはなんの関係もありませんが...)
です。

カバレッジの測定には それなりのコストがかかるので、もちろん、テストは並列で実行した方が良いのですが、 Gradle の場合、テストクラス毎にプロセスを分けて並列実行するため、 デフォルトの設定のままで EMMA を使うとエラーが発生してしまいます。
と言うのも、EMMA はリモートアクセスを許可するために 47653 ポートをオープンするのですが、 デフォルトの設定のままだと複数のプロセスが同じポートを同時にオープンしようとしてエラーになってしまうのです。
そんなときは test タスクの jvmArgs に

"-Demma.rt.control=false"
を追加して、この機能自体を無効にしてしまえば良いのです。
Gradle の場合、リモートから EMMA に接続することはないので、 この機能を無効にしても全く問題ないです。

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

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

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

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