ScalaTestを使用してのテストとsbt-scoverageを使用したカバレッジレポートの出力について。今回やったことはこのプロジェクトでやってみたものをまとめたものです。

まずはじめに書いておくと、ここに書いてあることは公式ドキュメントに書いてあります。従って個人の備忘録です。公式を当たりましょう。公式は原典にして尊いです。

環境


でやってます。

テスト


とりあえずScalaTestを使えるようにします。build.sbtの依存ライブラリに下記を記述します。バージョンは使うものにあわせてください。

1
"org.scalatest" %% "scalatest" % "3.0.5" % "test"

単体テストを書く


まず、テスト対象のコードですが…main/scala/example.scalaに下記のようなobjectがあるとします。

1
2
3
4
5
6
7
8
9
package example

object Example {

def isEnable: Boolean = {
true
}

}

ちょっと雑過ぎて申し訳ないんですが、このコードのisEnableをテストするとします。

ScalaTestはいろんなスタイルでテストを書くことができるようですが公式のドキュメントで推奨されているFlatSpecを使用します。で、こんな感じになる。

1
2
3
4
5
6
7
8
import org.scalatest._
import example.Example

class ExampleSpec extends FlatSpec with DiagrammedAssertions {
"isEnable" should "return true" in {
assert(Example.isEnable)
}
}

なんかこのshouldは以前RubyのRSpecか何かでみたような気がします。私は英語は苦手なので「そうですか~すべきか~ふ~ん」くらいの感想しかでてこないのですが、外人さん的には読み易いんでしょうか。

実行する


後はsbt testで実行するだけです。

1
2
3
4
5
6
7
8
9
10
11
12
$ sbt test

Java HotSpot(TM) 64-Bit Server VM

...(省略)

[info] Run completed in 1 second, 114 milliseconds.
[info] Total number of tests run: 16
[info] Suites: completed 4, aborted 0
[info] Tests: succeeded 16, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[success] Total time: 19 s, completed 2018/08/14 23:12:41

とまあ、こんな感じで表示されます。失敗した場合は理由が表示されます。

カバレッジレポートを出力する


せっかくなのでカバレッジレポートも出してみます。出力にはsbt-scoverageを使用します。まず、plugins.sbtに下記を追加します。バージョンは使うものにあわせてください。

1
addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.5.1")

次に除外するファイルを指定します。build.sbtcoverageExcludedPackagesを追記して除外するファイルを正規表現で指定します。区切り文字は;です。Javaのクラスパスでの指定なのでディレクトリでの指定ではないです。

1
coverageExcludedPackages := ".*Plugin.*;.*applicationlogs.html.*"

下図はビルド後のtargetディレクトリですが、例えば上記の指定だと下図の赤枠内が除外されることになります。これでtwirlテンプレートとかも除外されます。

※ちなみにテスト対象にtwirlテンプレートが含まれていると結果は出力されるものの例外がでます

後は実行するだけです。

1
$ sbt coverageReport

結果はtarget/scala-x.xx/scoverage-reportディレクトリの中に出力されます。