PlayFramework テスト用データベースを使用したControllerユニットテストとE2Eテスト

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

データベースインスタンスを必要とするControllerのユニットテストとE2Eテストを作成する。

Controllerのユニットテスト


Specクラスの前処理

テスト用データベースの定義を記述。

以下はh2のインメモリデータベースをPostgreSQLモードで起動したものをテスト用データベースとして使用した例。

nameは実行したいEvolutionsのディレクトリ名を指定する。多分、自動で初期化されないので、予めcleanupEvolutionsしておけば問題ないはず。

class PeopleControllerSpec extends PlaySpec with GuiceOneAppPerTest with Injecting {

  import play.api.db.Databases
  import play.api.db.evolutions._

  val database = Databases.inMemory(
    name = "default",
    urlOptions = Map(
      "MODE" -> "PostgreSQL"
    ),
    config = Map(
      "logStatements" -> true
    )
  )
  //Evolutionsは /conf/evolutions/"dbname" を実行する
  Evolutions.cleanupEvolutions(database)
  Evolutions.applyEvolutions(database)


ユニットテストの記述

あとは、dbインスタンスを注入してテストを記述すればよい。

"PeopleController GET" should {
  "render the index page from a new instance of controller" in {
    val controller = new PeopleController(database)
    val home = controller.index().apply(FakeRequest(GET, "/").withCSRFToken)
    status(home) mustBe OK
    contentType(home) mustBe Some("text/html")
    contentAsString(home) must include ("Terry")
  }
}


SeleniumのE2Eテスト


Specクラスの前処理

fakeApplication()をオーバーライドして依存関係を変更する。

class PeopleSpec extends PlaySpec with GuiceOneServerPerTest with OneBrowserPerSuite with HtmlUnitFactory{

  override def fakeApplication(): Application = {
    new GuiceApplicationBuilder()
      .configure(
        "db.default.driver" -> "org.h2.Driver",
        "db.default.url" -> "jdbc:h2:mem:test;MODE=PostgreSQL"
      )
      .build()
  }


E2Eテストの記述

あとは従来通りのテストを記述すればよい。

"GET /" should {
  "view表示のテスト" in {
    go to s"http://localhost:$port/"
    assert(pageTitle === "index view")
    assert(findAll(className("db-data")).length != 0)
  }
}