アプリケーションのテスト
自動実行できるテストスイートを作成するのは、アプリケーションを堅牢にする良い方法です。自動テストスイートを作成することで、アジャイルなやり方で作業することができます。
Play のテストは、何をテストするかによって Junit 4 または Selenium を使って作成されます。
テストの記述
テストは test/ ディレクトリに作成されなければなりません。アプリケーションが test モードで実行するときにだけ、このフォルダはソースパスに加えられます。テストは、異なる 3 種類の方法で書くことができます。
単体テスト
単体テストは JUnit を使用して書かれます。このテストでは、(いくつかのユーティリティを含む) アプリケーションのモデルをテストすることができます。
単体テストの例を以下に示します:
import play.test.*;
import org.junit.*;
public class MyTest extends UnitTest {
@Test
public void aTest() {
assertEquals(2, 1 + 1); // A really important thing to test
}
@Test
public void testUsers() {
assertEquals(3, Users.count());
}
}
機能テスト
機能テストは JUnit を使用して書かれます。このテストでは、直接コントローラオブジェクトにアクセスすることでアプリケーションをテストします。
機能テストの例を以下に示します:
import play.test.*;
import play.mvc.*;
import play.mvc.Http.*;
import org.junit.*;
public class ApplicationTest extends FunctionalTest {
@Test
public void testTheHomePage() {
Response response = GET("/");
assertStatus(200, response);
}
}
Selenium テスト
受入テストは Selenium を使用して書かれます。このテストでは、自動化されたブラウザでこれを実行することでアプリケーションをテストします。
Selenium テストは HTML テーブルを使用して書かれます。従来のこの構文を使用するか、または #{selenium /} タグを使用することができます。
Selenium テストの例を以下に示します:
#{selenium 'Test security'}
// Try to log in the administration area
clearSession()
open('/admin')
assertTextPresent('Login')
type('login', 'admin')
type('password', 'secret')
clickAndWait('signin')
// Verify that the user in correctly logged in
assertText('success', 'Welcom admin!')
#{/selenium}
フィクスチャ
テストを実行するとき、アプリケーションのための安定したデータを必要とします。最も簡単な方法は、各テストの前にデータベースをリセットすることです。
play.test.Fixtures クラスは、データベースを操作して、テストデータを注入する手助けをします。通常、これは JUnit テストの @Before メソッドで使用します。
@Before
public void setUp() {
Fixtures.deleteAll();
}
データをインポートするには、Fixtures が自動的にインポートすることができる YAML ファイルに定義するのが簡単です。
# Test data
Company(google):
name: Google
Company(zen):
name: Zenexity
User(guillaume):
name: guillaume
company: zen
その後、以下のようにします:
@Before
public void setUp() {
Fixtures.deleteAll();
Fixtures.load("data.yml");
}
Selenium テストのために #{fixture /} タグを使用することができます:
#{fixture delete:'all', load:'data.yml' /}
#{selenium}
// Write your test here
#{/selenium}
テストの実行
テストを実行するには、 'play test' コマンドを使ってアプリケーションを test モードで実行しなければなりません。
# play test myApp
このモードでは、Play は自動的に test-runner モジュールをロードします。このモジュールは http://localhost:9000/@tests という URL で利用可能な Web ベースのテストランナーを提供します。
テストを実行すると、その結果はアプリケーションの /test-result ディレクトリに保存されます。
テストランナーページでは、各テストはリンクになっています。‘右クリック’ して ‘新しいタブで開き’ 、テストランナーの外で直接実行することができます。
この方法でテストを実行する場合、Play は特別な test フレームワーク ID で始動します。このため、 application.conf ファイルで特別な設定を定義することができます。
例えば、以下のようにします:
%test.db=mem
%test.jpa.ddl=create-drop
継続的統合と自動的なテストの実行
auto-test コマンドは test コマンドと同じことをしますが、こちらは自動的にブラウザを起動し、すべてのテストを実行し、そして停止します。
継続的統合システムを構築する場合、これは便利なコマンドです;
実行後、すべての結果は /test-result ディレクトリに保存されます。さらに、このディレクトリにはテストスイートの最終的な結果を示すマーカーファイル ( result.failed または result.passed のどちらか) を含んでいます。最終的に、このディレクトリは application.log ファイルにすべてのログを含みます。
このためアプリケーションをテストするための継続的統合システムシステムの構築手順は、以下のようになるかもしれません:
- 最新版のアプリケーションをチェックアウトする
- play auto-test を実行する
- プロセスの完了を待つ
- /test-result ディレクトリ内のマーカファイル result.passed または result.failed を確認する
これらの手順が CRON タブで実行されれば完了です!