Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

ScalaTestでのテスト処理の前後に特定の処理を実行する方法

ScalaのテストフレームワークであるScalaTestでは、他のテストフレームワーク同様に、各テストの前後に特定の処理を挟むためのbefore / afterの仕組みが用意されている。

環境

  • Scala 3.3.0(2系でも変化はないはず)
  • ScalaTest 3.2.17

各テストの前後に処理を実行させる -- before / after

org.scalatest.BeforeAndAfterが提供するbeforeafterを利用することで、テストスイート(テストクラス)中の各テストが開始するタイミングと終了するタイミングとで特定の処理を実行させることができる。例えば、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") {
      // ...
    }
  }
}
★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?