sbt-scoverage、とても便利ですね。 plugin.sbt に記述するだけですぐにカバレッジ率を出してくれます。
addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.6.0")
// カバレッジ計測
sbt clean coverage test
// カバレッジレポート作成
sbt coverageReport
// 繋げてかく場合
sbt clean coverage test coverageReport
自分の環境だとこんな感じになっていました。
controllers.javascript
のカバレッジ率が0%になってますね。そりゃそうです、書いてないですから。
これのせいで合計のカバレッジ率が下がってるとなるとちょっと納得いきませんね。という事で除外してみたいと思います。
除外する
公式githubに、それっぽいものがありました。(https://github.com/scoverage/sbt-scoverage#Exclude%20classes%20and%20packages)
coverageExcludedPackages
正規表現でカバレッジ測定の対象から除外できます。 セミコロンで区切ります
coverageExcludedPackages := "<empty>;Reverse.*;.*AuthService.*;models\\.data\\..*"
これが使えそうですね。私のディレクトリ構成はこうなので
こうでしょうか。
coverageExcludedPackages := ".*controllers.javascript.*"
import Changes してから実行
sbt coverageReport
あれ・・・変わらないぞ
試行錯誤
正規表現を見直してみる
そもそもの公式ドキュメントの例として書かれている正規表現、最初に謎の物体が入っています。
<empty>;
セミコロンは区切り文字なのでわかるのですが、 <empty>
ってなんなんでしょうね。
オバフロでも <empty> をつけて試してみて!
というコメントが付いている質問がありました。(http://danlec.com/st4k#questions/32331183)
とりあえず真似してみましょう。
coverageExcludedPackages := "<empty>;.*controllers.javascript.*"
sbt coverageReport
[info] Statement coverage.: 78.68%
お、カバレッジ率が上がった
という事で、78%に上昇しました。これが本来の値ですね。
なんで <empty>;
がいるのか結構調べたのですが、全くわかりませんでした。
他の人も「よくわかんないけど必要だよ」みたいに言っているので、深く考えない方がいいかもしれません。(https://stackoverflow.com/questions/47940361/scoverage-how-to-exclude-files-and-packages)
中のコードを追っていたのですが、結構しんどくて諦めました・・・
まとめ
- テストカバレッジから除外したいケースがある場合、
coverageExcludedPackages
を使う - 正規表現が通らない場合は、先頭に
<empty>;
をつけてみよう