Playのグローバルな設定&spec2でBDDなテスト:Scala+Play 2.0でWebアプリ開発入門(8)(4/4 ページ)
2.0からScalaに対応したWebアプリ開発の人気軽量フレームワーク「Play」について解説し、Webアプリの作り方を紹介する入門連載。今回は、アプリ起動/停止前後やエラー発生時などで使えるGlobalオブジェクトや、さまざまなテストについて解説。Selenium WebDriverを使ったブラウザテストも。
コントローラテスト作成
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で検証できることが分かったと思います。
最近の開発では、機能の実装とテストの作成がセットになっているので、テストの作成/実行が簡単なのは、非常にうれしいですね。
- Play2プラグインのインストールと使用と新規開発
 - Play2+nginx/Akka/WebSocketで高速双方向通信
 - Play2(+JavaScript)アプリを高速化、最適化する4つのテクニック
 - Play2におけるJSONおよびCoffeeScriptの使い方
 - Playのグローバルな設定&spec2でBDDなテスト
 - Play 2.xからMySQLに接続してAnormでCRUD操作するには
 - Play 2.xのScala Templatesでビュー&フォーム操作
 - Play 2.1にアップグレードしてコントローラを使いこなす
 - Playコントローラ/Action/HTTP Routerの基本的な使い方
 - 便利なPlayコンソールとEclipseでのデバッグ方法
 - Play 2.0のアーキテクチャとディレクトリ構成の基礎知識
 - Play framework 2.0の概要/5つの特徴とScalaで作るための環境構築
 
著者プロフィール
中村修太(なかむら しゅうた)
クラスメソッド勤務の新しもの好きプログラマです。昨年、東京から山口県に引っ越し、現在はノマドワーカーとして働いています。好きなJazzを聴きながらプログラミングするのが大好きです。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- スケーラブルで関数型でオブジェクト指向なScala入門
Scalaの特徴を紹介し、基本構文や関数、クラスなど、Scalaの基本的な機能について解説する入門連載 - Javaの常識を変えるPlay framework入門
サーブレット/JSPを基にする重厚長大なJavaのWeb開発のイメージを変える軽量フレームワーク「Play」について解説し、Webアプリの作り方を紹介する入門連載