2.0からScalaに対応したWebアプリ開発の人気軽量フレームワーク「Play」について解説し、Webアプリの作り方を紹介する入門連載。今回は、アプリ起動/停止前後やエラー発生時などで使えるGlobalオブジェクトや、さまざまなテストについて解説。Selenium WebDriverを使ったブラウザテストも。
前回の記事「Play 2.xからMySQLに接続してAnormでCRUD操作するには」では、Playアプリでのデータベースアクセス方法を紹介しました。今回はPlayアプリのグローバルな設定を行う方法と、さまざまなテストを行う手法を紹介します。
なお今回の記事では、第6回の「Play 2.xのScala Templatesでビュー&フォーム操作」で作成したFormサンプルと、第7回で作成したデータベースを使用します。そのため、本記事の通りに進める場合は当該記事を参考に「gyro」プロジェクトを作成しておいてください。
アプリケーションの起動前後や停止前後、エラーが発生したタイミングなどで何らかの処理を行いたいケースは多々あると思います。Playアプリでそのような処理を行うためには、ここで紹介するGlobalオブジェクトを使用することで実現可能です。
Globalオブジェクトは、上のようなケースでアプリケーションのグローバル設定を記述するオブジェクトです。
デフォルトでは、デフォルトパッケージにplay.api.GlobalSettingsを継承した「Global」という名前でobject定義をすることによって実装可能です(※「global」という設定項目(conf/application.confの上部にコメントアウトされた状態で記述)で実装クラスを指定することも可能)。
任意のタイミングで処理を記述するには、そのタイミングに対応したメソッドをオーバーライドすることによって実現できます。
次の例にあるように、アプリ起動時に実行したい処理はonStartに、アプリ停止時に実行したい処理はonStopに記述します。
import play.api._ object Global extends GlobalSettings { override def onStart(app: Application) { //アプリ起動時に実行 } override def onStop(app: Application) { //アプリ停止時に実行 } }
では、gyroアプリにGlobalオブジェクトを追加してみます。「app」ディレクトリに「common.scala」という名前でファイルを作成し、次のようにGlobalオブジェクトを記述してみましょう。
import play.api._ object Global extends GlobalSettings { override def onStart(app: Application) { Logger.info("Application has started for " + app.mode + " mode.") app.mode.toString match { case "Prod" => Logger.info("Prod mode.") case "Dev" => Logger.info("Dev mode.") case "Test" => Logger.info("test mode.") case _ => Logger.info("unknown mode.") } } override def onStop(app: Application) { Logger.info("Application shutdown...") } }
このGlobalオブジェクトでは、アプリ起動時と停止時にそれぞれ処理を行っています。アプリ起動時はなんのモードで起動したかApplication.modeの値をチェックしてメッセージを表示しています。
アプリ停止時は単にメッセージを表示しているだけです。Globalオブジェクトを記述したらplayコンソールから起動して動作を試してみましょう。runコマンドでアプリを起動してください。この場合、devモードでアプリが起動するので、初回アクセス時にonStartが実行されます(productionモードのときはアプリ開始タイミング)。
% play ・ ・ [gyro] $ run ・ ・ --- (Running the application from SBT, auto-reloading is enabled) --- [info] application - Application has started for Dev mode. [info] application - Dev mode. [info] play - Application started (Dev)
[Control]+[d]キーでアプリを停止すると、onStopが実行されます。また、APIドキュメントにあるように、いろいろなタイミングで処理を行えます。エラー発生時(onError)やURLを処理するアクションが見つからない(onHandlerNotFound)ときなど、使う機会がありそうなメソッドも多くあるので確認してみてください。
テストというと、「JUnit」「TestNG」などのテストフレームワークが有名で、皆さんも一度は使ったことがあると思います。Playアプリでも、これら任意のテストフレームワークを使用可能ですが、デフォルトでは「specs2」というテストフレームワークを使用しています。
specs2はBDD(Behavior Driven Development:振る舞い駆動開発)スタイルを使って記述が可能なテストフレームワークで、「ScalaTest」と並んで、よく使われます。
specs2のサンプルは次のようになっています。まるで仕様を記述するような形式でテストを記述していますね。
import org.specs2.mutable._ class SampleSpec extends Specification { "The 'Hello' string" should { "5 characters" in { "Hello" must have size(5) } } }
このように、specs2はテスト本体と仕様説明部分を分離し、シンプルに記述できます。Playアプリでは、「test」ディレクトリの下にテストクラスを置いておけば、testコマンドを実行した際に実行されます。
次ページからは、「gyro」アプリを修正し、それに対応するテストを作成していきましょう。前回、DBやテーブルを準備したので、以前作成した疑似的なユーザー情報の登録機能を修正し、ちゃんとDBへデータ登録できるようにしてから、それに対するテストを作成してみます。
Copyright © ITmedia, Inc. All Rights Reserved.