UnitTestコードをチェックする
では、実行されたテストのソースコードを順に見ていきましょう。まずUnitTestからです。これは「BasicTest.java」というファイルとして用意されています。
import org.junit.*;
import java.util.*;
import play.test.*;
import models.*;
public class BasicTest extends UnitTest {
@Test
public void aVeryImportantThingToTest() {
assertEquals(2, 1 + 1);
}
}
UnitTestは、文字どおりUnitTestというクラスを継承して作成されます。そこに引数・返り値を持たないpublicメソッドとしてテストメソッドを記述します。メソッドには、「@Test」というアノテーションを用意します。これにより、自動的にテスト用のメソッドであると認識されるようになります。
ここでは、aVeryImportantThingToTestというメソッドで、「assertEquals」というメソッドを1つだけ実行しています。これは、引数に渡した2つの値が等しいことをチェックするためのものです。UnitTestには、さまざまな値の状態をチェックするメソッドが用意されています。このUnitTestクラスは、JUnitのorg.junit.Assertクラスを継承しており、JUnitで一般に用いられているassertメソッドがそのまま利用できます。
FunctionalTestコードをチェックする
続いて、FunctionalTestのソースコードです。これは「ApplicationTest」という名前で作成されています。Play!では、プロジェクトを生成すると、Applicationという名前でコントローラーが作成され、そこにアクションメソッドが実装されるようになっていました。このApplicationクラスをテストするために用意されているのが、ApplicationTestクラスなのです。
import org.junit.*;
import play.test.*;
import play.mvc.*;
import play.mvc.Http.*;
import models.*;
public class ApplicationTest extends FunctionalTest {
@Test
public void testThatIndexPageWorks() {
Response response = GET("/");
assertIsOk(response);
assertContentType("text/html", response);
assertCharset("utf-8", response);
}
}
これが、ApplicationTestの内容です。FunctionalTestも、UnitTestと同様、org.junit.Assertクラスを継承しており、そこに用意されているassertメソッドをそのまま利用できます。しかし、FunctionalTestの特徴はそれだけでなく、独自に定義されたassertメソッドを持っている点です。
ここでは「GET」メソッドによりGETでアクセスするHttp.Responseインスタンスを取得しています。そしてassertIsOkでステータスをチェックし正しくアクセスできているか、assertContentTypeとassertCharsetでコンテンツタイプとキャラクタセットが指定されたものかどうかをチェックしています。
FunctionalTestを定義する
では、このFunctionalTestに、独自の定義を追加してみましょう。ページのアクセスはサンプルでやったので、今度はモデルの利用をチェックするメソッドを定義してみましょう。
@Before
public void setup() {
Fixtures.deleteAll();
}
@Test
public void testModelData() {
PersonData p = new PersonData("つやの", "tuyano@mac.com");
p.save();
MsgData m = new MsgData("テストです。", p);
m.save();
p.messages.add(m);
p.save();
assertNotNull(p);
assertNotNull(m);
assertEquals(p.name, m.person.name);
assertEquals(m.id,p.messages.get(0).id);
List<PersonData> plist = PersonData.find("name", "つやの").fetch();
assertEquals(1, plist.size());
List<MsgData> mlist = MsgData.find("person", plist.get(0)).fetch();
assertEquals(1, mlist.size());
}
ここでは、PersonDataとMsgDataを作成しています。まず、PersonDataインスタンスを作成して保存し、続いてMsgDataインスタンスを、PersonDataを引数に指定して作成しています。そして、pとmの依存関係を確認しています。assertNotNullは引数がnullかどうかを調べるものです。またassertEqualsでPersonDataとMsgDataのお互いに参照するオブジェクトのnameやidをチェックし、正しくオブジェクトが参照されているかを調べています。
このテストの前に、setupというメソッドが用意されています。これには「@Before」というアノテーションが用意されています。これは、テストを開始する前に実行する処理を用意するためのものです。ここでは、Fixtures.deleteAll();というメソッドを実行していますが、これはすべてのテスト用データを削除する処理です。こうしてデータをすべてクリアしてからテストを実行します。テストでは、このようにデータを初期化してからテスト用のデータを作成し、チェックするのが一般的でしょう。
