連載
» 2013年07月29日 18時00分 公開

Scala+Play 2.0でWebアプリ開発入門(8):Playのグローバルな設定&spec2でBDDなテスト (4/4)

[中村修太,クラスメソッド]
前のページへ 1|2|3|4       

コントローラテスト作成

 FakeApplicationとFakeRequestを利用して、コントローラに対するテストを作成できます。testディレクトリにUserControllerSpec.scalaファイルを作成し、次のような内容でコントローラのテストを記述してみましょう。

import org.specs2.mutable._
import play.api.test._
import play.api.test.Helpers._
class UserControllerSpec extends Specification {
  "respond to the entryInit Action" in {
    running(FakeApplication()) {
      //ルーティング情報を使う
      val Some(result) = route(FakeRequest(GET, "/user/entry"))
      //コントローラを直接使う
      //val result = controllers.UserController.entryInit()(FakeRequest())
      status(result) must equalTo(OK)
      contentType(result) must beSome("text/html")
      charset(result) must beSome("utf-8")
      contentAsString(result) must contain("Entry user")
    }
  }
}

 このテストでは、FakeApplicationで起動したアプリに対して、疑似的なリクエストを送ってコントローラの結果を取得しています。コントローラを直接呼んでもいいですし、route関数にルーティング情報を渡しても構いません。

 contentAsStringにコントローラ呼び出し結果のresultを渡すと、レスポンスのhtml文字列を取得できます。ビューの内容を検証したい場合、この文字列をチェックしましょう。

テスト時にHTTPサーバの起動もできる

 必要があれば、テスト時にHTTPサーバを起動させることもできます。次のように記述することで、HTTPサーバが起動し、指定したURLにアクセスを行います。

・
・
  "run in a server" in new WithServer {
    await(WS.url("http://localhost:" + port).get).status must equalTo(OK)
  }

Selenium WebDriverを使ったブラウザのテスト

 また、SeleniumのWebDriverを使用してブラウザのテストを行うこともできます。次のようにすれば、アプリ起動後に/user/entryへアクセスしてレスポンスのhtmlにある、<title>要素を検証しています。

・
・
  "run in a browser" in new WithBrowser {
    browser.goTo("/user/entry")
    browser.$("title").getText() must equalTo("entry user")
  }
}

specs2テストの実行

 さて、ここまでテストクラスの記述ができたら、playコンソールからtestを実行してみましょう。DBのテスト、コントローラのテスト、サーバ起動テスト、ブラウザのテストが実行されます。

[gyro] $ test
・
・
[info] Passed: : Total 5, Failed 0, Errors 0, Passed 5, Skipped 0
[success] Total time: 25 s, completed 20xx/01/01 00:00:00

 単体レベルのテストから機能テスト、ブラウザを使用したテストまで、簡単に記述して実行できました。今回はシンプルな検証しか行いませんでしたが、specs2自体は非常に高機能で、いろいろと便利な使い方ができるので、ドキュメントを確認してみてください。

Playはテスト作成も簡単

 今回はPlayアプリにおけるいろいろなテスト手法を紹介しました。DBのテストからWeb層のテストまで、いろいろなレイヤのテストをplayのテストの仕組みとspecs2で検証できることが分かったと思います。

 最近の開発では、機能の実装とテストの作成がセットになっているので、テストの作成/実行が簡単なのは、非常にうれしいですね。

著者プロフィール

中村修太

中村修太(なかむら しゅうた)

クラスメソッド勤務の新しもの好きプログラマです。昨年、東京から山口県に引っ越し、現在はノマドワーカーとして働いています。好きなJazzを聴きながらプログラミングするのが大好きです。


前のページへ 1|2|3|4       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。