Twitterで以下の記事を見てMonixの開発用に作られたというMinitestというテスティングライブラリの存在を知りました。
ScalaのテスティングライブラリというとScalaTestとSpecs2が双璧ですが、Minitestはこれらと比べると非常にシンプルなライブラリで、ScalaTestのFunSuite
からの移行がしやすいようデザインされているようです。使い方は上記の記事とGitHubのREADMEを見れば大体わかると思います。
試しに簡単なテストをMinitestで書いてみたのですが、ScalaTestのFunSuite
からであれば概ね以下のような作業で移行できそうです(FunSuite
との互換性重視ならassertThrows
を敢えて変えなくてもよいのではという気もしますがなんで変えているのかは謎)。
- テストケースをclassからobjectに変更し、親クラスを
FunSuite
からSimpleTestSuite
に変更する - ScalaTestが提供する
===
などの比較演算子を使っている場合、通常の比較演算子に変更する assertThrows
→intercept
など、一部の非互換な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()
での比較に失敗した場合のエラーメッセージなどについてはもうちょっと頑張って欲しい感があります。