Develop with pleasure!

福岡でCloudとかBlockchainとか。

Play2 Scala環境でカバレッジを取得してみた。

Play Framework 2.0+Scalaな環境のコードカバレッジを取得する環境構築。Play1系まではCobertura使ったカバレッジ取得するモジュールModules — Playframeworkが提供されてたみたいだけど、どうやら2系には対応していない模様。

なので今回はSBT使ってカバレッジを取得するjmhofer / jacoco4sbt / wiki / Home — Bitbucketを使ってみた。

設定

公式wikiに従って設定。まずプロジェクトのルートフォルダ直下にbuild.sbtファイルを作成し↓の内容を定義。(使用してるsbtのバージョンは0.11.3)

import de.johoop.jacoco4sbt._
import JacocoPlugin._
 
seq(jacoco.settings : _*)

project/plugins.sbtファイルに↓を追記

libraryDependencies ++= Seq(
  "org.jacoco" % "org.jacoco.core" % "0.5.7.201204190339" artifacts(Artifact("org.jacoco.core", "jar", "jar")),
  "org.jacoco" % "org.jacoco.report" % "0.5.7.201204190339" artifacts(Artifact("org.jacoco.report", "jar", "jar")))

addSbtPlugin("de.johoop" % "jacoco4sbt" % "1.2.3")

リポジトリサイトにアップされてるjacoco4sbtのバージョンが1.2.3のものしか無かったので公式サイトでは1.2.4だったけど1.2.3にバージョンを修正してる↑

カバレッジ取得

jacoco:coverを実行する。

$ jacoco:cover
[info] ApplicationSpec
[info] 
[info] Application should
[info] + execute index
[info]  
[info]  
[info] Total for specification ApplicationSpec
[info] Finished in 915 ms
[info] 1 example, 0 failure, 0 error
[info] 
[info] Passed: : Total 1, Failed 0, Errors 0, Passed 1, Skipped 0
[success] Total time: 7 s, completed 2012/11/27 13:37:53

と、target/scala-2.9.1/jacocoフォルダに↓なカバレッジレポートが出力される。

ちなみにカバレッジの結果を見てみるとカバー率がすごく低い
これはController等がPlay Frameworkのtraitを継承しており、その各traitで実装されてる内容も含めた形でカバレッジが計測されているためだ。そのため極端にカバー率が低くなってる。除外する方法無いんかなー。コンパイル時にtraitで定義されてるメソッドが子クラス側にも定義されるから無理か?

Jenkinsとの連携

ビルドはシェルで↓の内容を実行する。

play clean
play jacoco:cover

(play-pluginというJenkinsのプラグインもあったけどPlay Framework 1.x向けなのか?playコマンドの後にワークスペースのパスが指定されてビルドが失敗する。)

jacocoで生成したレポートをJenkinsで見れるようにするためのプラグインJaCoCo Plugin - Jenkins - Jenkins Wikiをインストールし、ジョブの設定画面でJaCoCo Pluginの設定を環境に合わせて↓のように設定する。

あとはビルド実行すれば↓のカバレッジレポートが確認できるようになる。

2012/12/11 追記

jacoco4sbtだと↑のフレームワークとかのtraitのカバレッジが低下するので、scct使った方が良さげ。
Play2 + Scala のカバレッジツールで一番マシなのは scct かな? - ikeike443のブログ