SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Javaで軽快に使える「軽量フレームワーク」特集

Javaで軽快に使える「軽量フレームワーク」特集
~本格的なRoRスタイルフレームワーク「Play!」(3)

第9回

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でステータスをチェックし正しくアクセスできているか、assertContentTypeassertCharsetでコンテンツタイプとキャラクタセットが指定されたものかどうかをチェックしています。

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を引数に指定して作成しています。そして、pmの依存関係を確認しています。assertNotNullは引数がnullかどうかを調べるものです。またassertEqualsでPersonDataとMsgDataのお互いに参照するオブジェクトのnameやidをチェックし、正しくオブジェクトが参照されているかを調べています。

 このテストの前に、setupというメソッドが用意されています。これには「@Before」というアノテーションが用意されています。これは、テストを開始する前に実行する処理を用意するためのものです。ここでは、Fixtures.deleteAll();というメソッドを実行していますが、これはすべてのテスト用データを削除する処理です。こうしてデータをすべてクリアしてからテストを実行します。テストでは、このようにデータを初期化してからテスト用のデータを作成し、チェックするのが一般的でしょう。

次のページ
data.ymlによるテストデータの生成

この記事は参考になりましたか?

Javaで軽快に使える「軽量フレームワーク」特集連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4752 2010/02/04 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー