サーブレット/JSPを基にする重厚長大なJavaのWeb開発のイメージを変える軽量フレームワーク「Play」について解説し、Webアプリの作り方を紹介する入門連載。今回は、シンプルな単体テストに加え、ビューやコントローラ、routeファイルのテスト、ブラウザテスト、テスト用の環境設定について解説します。
前回「Playで体得するRESTfulアーキテクチャの基礎知識」までの本連載で、Play frameworkのMVCモデルを解説し、簡単なアプリケーションを作ることができるようになりました。
今回は、作成したコードに対してテストを書いていきます。
連載第1回「Java開発で泣かないためのPlay frameworkの基礎知識」で述べたとおり、Play frameworkでは「スピード感」と「変更に対する強さ」を重視しており、ビューやコントローラのテストコードが容易に書けるようになっています。
また、テスト用に環境設定を変更し、接続先データベースを差し替えるといったことも簡単にできるようになっています。Play frameworkの高速で快適なテストを体験してください。
今回の主な内容は以下の通りです。
上記内容について、連載第4回の「Play frameworkのコントローラの使い方を理解する」で作成した占いアプリに対しテストコードを書いていきます。第4回のサンプルアプリを作成していない方は、作成しておいてください。
まずは、ビューやコントローラを使わない、単純なテストを書くことで、Play frameworkのテスト実行方法を見てみます。
testフォルダにSimpleTestクラスを作成してください。
import static org.fest.assertions.Assertions.*; import org.fest.assertions.StringAssert; import org.junit.Test; public class SimpleTest { @Test public void simpleTest() { String str = "hoge"; StringAssert assertion = assertThat(str); assertion.isEqualTo("hoge"); } }
なお、testフォルダにはPlay frameworkプロジェクト作成時に自動生成されたサンプルクラスがありますが、今回の説明には使用しませんので、削除しておくことをお勧めします
このテストを実行するためには、コンソールで以下のコマンドを実行します。
play test
添付画面のように、「Passed」が1、「Failed」「Errors」が0となっていればテスト成功です。
詳細なテスト結果は「target/test-reports」以下に配置されます。
Eclipseからであれば、SimpleTest.xmlを右クリック→[次で開く]→[JUnitビュー]を選択することでテスト結果を確認できます。
では、今書いたテストコードを順に見ていきます。
まず、テストメソッドであることを示すために、メソッドに@Testアノテーションを付けます。Play frameworkのテストでは通常、JUnitが利用されますが、これはJUnitの記述ルールに則っています。
次にテストメソッド内のアサーションについてです。JUnitで用意されているメソッドを利用することもできますが、Play frameworkには「FestAssert」という便利なアサーションライブラリが備わっています。
値比較の場合、JUnitでは通常、次のように記述して検証対象(actual)と値(expected)を比較します。
assertEquals(actual, expected);
一方、Play frameworkが利用するFestAssertライブラリでは、検証対象の値の型に応じたAssertクラスのオブジェクトをいったん取得することでさまざまなメソッドを利用できるようになります。
Assertクラスのオブジェクトを取得するには、org.fest.assertions.AssertionsクラスのassertThatメソッドを用います。
assertThatメソッドはオーバーロードされており、検証する型に応じたAssertクラスを返します。今回のように文字列をassertThatメソッドに渡すと、StringAssertという文字列用のAssertクラスが返されます。
どの型に対しても利用できるAssertクラスのメソッドとしては、以下のようなものがあります。
メソッド | 機能 |
---|---|
isEqualTo(Object expected) | equalsメソッドの呼び出し結果がtrueかどうか |
isNull() | 検証対象のオブジェクトがnullかどうか |
isIn(Collection expected) | 検証対象のオブジェクトが引数のコレクションに含まれるかどうか |
StringAssertでは、以下のようなメソッドをさらに利用できます。
メソッド | 機能 |
---|---|
isEqualToIgnoringCase(String expected) | equalsIgnoreCaseの呼び出し結果がtrueかどうか |
contains(String expected) | 検証対象の文字列に引数の文字列が含まれるかどうか |
containsIgnoringCase(String expected) | 検証対象の文字列に引数の文字列が含まれるかどうか(大文字小文字の違いを無視) |
また、isEqualsToメソッドについても、引数の型がStringに限定されるようになります。
なお、今回はサンプルのためAssertオブジェクトを1度変数に格納しましたが、以下のように一度に記述するほうが一般的です。
assertThat(actual).isEqualTo(expected);
Copyright © ITmedia, Inc. All Rights Reserved.