ScalaのシンプルなテスティングライブラリMinitestを使ってみる

Twitterで以下の記事を見てMonixの開発用に作られたというMinitestというテスティングライブラリの存在を知りました。

alexn.org

GitHubリポジトリはこちらです。

github.com

ScalaのテスティングライブラリというとScalaTestとSpecs2が双璧ですが、Minitestはこれらと比べると非常にシンプルなライブラリで、ScalaTestのFunSuiteからの移行がしやすいようデザインされているようです。使い方は上記の記事とGitHubのREADMEを見れば大体わかると思います。

試しに簡単なテストをMinitestで書いてみたのですが、ScalaTestのFunSuiteからであれば概ね以下のような作業で移行できそうです(FunSuiteとの互換性重視ならassertThrowsを敢えて変えなくてもよいのではという気もしますがなんで変えているのかは謎)。

  • テストケースをclassからobjectに変更し、親クラスをFunSuiteからSimpleTestSuiteに変更する
  • ScalaTestが提供する===などの比較演算子を使っている場合、通常の比較演算子に変更する
  • assertThrowsinterceptなど、一部の非互換なAPIを書き換える

assert()の第二引数にはエラー時のメッセージを指定できますが、値の比較であればassert()ではなくassertEquals()を使うと失敗したときに以下のようなメッセージを出力してくれるようなのでこちらを使ったほうがよさそうです。

- CRUD operation *** FAILED ***
  received UsersRow(1,takezoe,None) != expected UsersRow(1,takezoen,None) (SlickBlockingAPISpec.scala:33)
    minitest.api.Asserts.assertEquals(Asserts.scala:68)
    minitest.api.Asserts.assertEquals$(Asserts.scala:62)
    com.github.takezoe.slick.blocking.SlickBlockingAPISpec$.assertEquals(SlickBlockingAPISpec.scala:9)
    com.github.takezoe.slick.blocking.SlickBlockingAPISpec$.$anonfun$new$2(SlickBlockingAPISpec.scala:33)
    ...

APIはシンプルですが、Futureのアサートや、オプションでScalaCheckとの連携など、必要な機能は一通り揃っている感じです。また、Scala.jsでも使用することができます。

実際自分もScalaでテストを書くときはScalaTestでFunSuiteを使ってassert()しかしないので、Minitestのデザインはピッタリな感じがします。Specs2などはScalaの記述能力を駆使して様々な変態的な記述が可能ですが、正直機能が多すぎて覚えきれないのでこのくらいでいいんじゃないかと思いますが、assertEquals()での比較に失敗した場合のエラーメッセージなどについてはもうちょっと頑張って欲しい感があります。