2

ローカルの Jetty インスタンスで実行されている Google App Engine プロジェクトに対して統合テストを作成しています。

テストを実行する前に、GAE Web サービスの新しいインスタンスを で生成しますhttp://localhost:8083。起動時に、Web サービスはデータを書き込む memcached インスタンスを作成します。Google Guice を使用しているため、これは次のようなバインディングで行われます。

bind(AsyncMemcacheService.class).toInstance(MemcacheServiceFactory.getAsyncMemcacheService());
bind(MemcacheService.class).toInstance(MemcacheServiceFactory.getMemcacheService());

Web サービスが稼働したら、統合テストを開始します。重要なことに、それらは独自の memcached バインディングを作成する別の Jetty インスタンスで開始されます。

次のような統合テストを作成しました。

@Test(groups = "integration")
private void doSomeTest() {
    //set up some precondition for the test
    String id = "myIntegerObject";
    this.memcached.putSomeObject(id, 0);

    try {
        //call an endpoint that relies on the previously set value
        String url = "http://localhost:8083/api/increment/" + id;
        this.http.post(url);
    } catch (Exception e) {
        e.printStackTrace();
        Assert.fail("Test failed. See inner exception for details.", e);
    }

    //verify that hitting the url had the desired effect
    Assert.assertEquals(this.memcached.getSomeObject(id), 1);
}

Assert.assertEquals(...);Web サービスと統合テストが memcached の異なるインスタンスに書き込みを行っているため、このテストは常に途中で失敗します。

Web サービス、単体テスト、および統合テストがすべて共有するシステム全体の memcached インスタンスをセットアップする方法はありますか?

4

1 に答える 1

3

Remote APIはここで役に立ちますか? 本番appspot.comアプリに接続できるようにすることを目的としていますが、ローカルの dev_appserver に接続するためにも使用できます。

new RemoteApiOptions().server("localhost", 8083).credentials("test@example.com", "");

作成する API 呼び出しは、リモート API を使用して他のインスタンスにアクセスします。ドキュメントが示唆するように、リモート API はデータストア API に限定されないことに注意してください。Memcache も同じように機能します。

ローカルでデプロイまたは実行できる「hello world」App Engine アプリと、リモート API を使用してリモート memcacheと呼び出しを実行する trivial の両方であるEclipse プロジェクトの例を作成しました。TestClient.javaget()put()

$ java client.TestClient localhost 8083 test@example.com pass foo bar

new RemoteApiOptions()
.server("localhost", 8083)
.credentials("test@example.com", "pass")
mc.get("foo") -> null
mc.put("foo", "bar")
mc.get("foo") -> bar
于 2013-02-06T23:35:30.913 に答える