ScalaのテストフレームワークであるScalaTestでは、他のテストフレームワーク同様に、各テストの前後に特定の処理を挟むためのbefore
/ after
の仕組みが用意されている。
環境
- Scala 3.3.0(2系でも変化はないはず)
- ScalaTest 3.2.17
各テストの前後に処理を実行させる -- before
/ after
org.scalatest.BeforeAndAfter
が提供するbefore
と after
を利用することで、テストスイート(テストクラス)中の各テストが開始するタイミングと終了するタイミングとで特定の処理を実行させることができる。例えば、DBに特定のデータを作成したり、テーブルをtruncateして初期状態に戻したりといったことが可能。
before
/ after
を利用するには、org.scalatest.BeforeAndAfter
をミックスインする:
import org.scalatest.BeforeAndAfter import org.scalatest.funspec.AnyFunSpec import org.scalatest.matchers.should.Matchers class FooSpec extends AnyFunSpec with Matchers with BeforeAndAfter { before { // afterも同様 println("cleaning system") } describe("Foo") { it("test1") { // ... } it("test2") { // ... } it("test2") { // ... } } }
このように書くとit
の実行前の各タイミングでbefore
に指定したコードが実行される(describe
単位ではない)。
テストスイートの前後で処理を実行させる -- beforeAll
/ afterAll
似たような機構としてbeforeAll
/ afterAll
が用意されている。こちらはテストごとではなくテストスイート、つまりこの場合はFooSpec
が開始されるタイミングと終了するタイミングで動作する処理を定義できる。
beforeAll
/ afterAll
を利用するには、org.scalatest.BeforeAndAfterAll
をミックスインし、beforeAll
/ afterAll
をオーバーライドする(before
/ after
とはやや書き方が違うので注意):
import org.scalatest.BeforeAndAfterAll import org.scalatest.funspec.AnyFunSpec import org.scalatest.matchers.should.Matchers class FooSpec extends AnyFunSpec with Matchers with BeforeAndAfterAll { override def beforeAll(): Unit = { // afterAllも同様 println("cleaning system") super.beforeAll() } describe("Foo") { it("test1") { // ... } it("test2") { // ... } it("test2") { // ... } } }