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アプリの作り方を紹介する入門連載