2011年5月2日月曜日

Google App Engineのユニットテストのドキュメント(その5)

前回に続き、Google App Engine for Javaのテストについて
翻訳します。

ちなみに、翻訳にはKaede翻訳ツールを使っています。
もともと、こういう用途に使うために作ったものですからね。

翻訳元のドキュメントは
http://code.google.com/intl/en/appengine/docs/java/tools/localunittesting.html
です。



Writing Task Queue Tests (タスクキューのテストの記述)
ローカル環境でのタスクキューを使用するテストはもう少し複雑で、その理由はデータストアやmemcacheと違い、タスクキューAPIはサービスの状態を調べる方法が公開されていないからです。
タスクが予期されたパラメータと共にスケジュールされているかどうか検証するためには、ローカルタスクキュー自身にアクセスする必要があります。これを行うために、com.google.appengine.api.taskqueue.dev.LocalTaskQueueが必要となります。
import com.google.appengine.api.taskqueue.dev.LocalTaskQueue;
import com.google.appengine.api.taskqueue.dev.QueueStateInfo;
import com.google.appengine.api.taskqueue.QueueFactory;
import com.google.appengine.api.taskqueue.TaskOptions;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
import com.google.appengine.tools.development.testing.LocalTaskQueueTestConfig;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;

public class TaskQueueTest {

    private final LocalServiceTestHelper helper =
        new LocalServiceTestHelper(new LocalTaskQueueTestConfig());

    @Before
    public void setUp() {
        helper.setUp();
    }

    @After
    public void tearDown() {
        helper.tearDown();
    }


    // Run this test twice to demonstrate we're not leaking state across tests.
    // If we _are_ leaking state across tests we'll get an exception on the
    // second test because there will already be a task with the given name.
    private void doTest() throws InterruptedException {
        QueueFactory.getDefaultQueue().add(TaskOptions.Builder.taskName("task29"));
        // give the task time to execute if tasks are actually enabled (which they
        // aren't, but that's part of the test)
        Thread.sleep(1000);
        LocalTaskQueue ltq = LocalTaskQueueTestConfig.getLocalTaskQueue();
        QueueStateInfo qsi = ltq.getQueueStateInfo().get(QueueFactory.getDefaultQueue().getQueueName());
        assertEquals(1, qsi.getTaskInfo().size());
        assertEquals("task29", qsi.getTaskInfo().get(0).getTaskName());
    }

    @Test
    public void testTaskGetsScheduled1() throws InterruptedException {
        doTest();
    }

    @Test
    public void testTaskGetsScheduled2() throws InterruptedException {
        doTest();
    }
}
注意する点として、LocalTaskqueueTestConfigにローカルサービスのインスタンスを操作させる方法と、ローカルサービスがタスクが予定されたとおりにスケジュールされていることを確実に行っていることを調べる、という点が挙げられます。全てのLocalServiceTestConfigの実装は、類似したメソッドを持っています。それらは常に必要とされるわけではありませんが、その存在が役に立つときがいつか来るでしょう。



続く。

インストール不要・無料のKaede翻訳ツール
http://kaedetrans.appspot.com/

0 件のコメント:

コメントを投稿