2012-07-31 16 views
10

私はGAE/jアプリケーションの有効な統合テストを開発しようとしています。私はhttps://developers.google.com/appengine/docs/java/tools/localunittestingに精通しています。これらのツールは、小さなユニットテストに最適です。私は現在、実際のWebリクエストをテストする統合テストの開発に興味があります。たとえば、web.xmlがサーブレットとフィルタを予想されたURLにマッピングしていることをテストして、JSPが私の期待するものを生成することをテストしたいと思います。Google App Engineの統合テスト

私の目的は、JVM内でローカル開発サーバーを立ち上げることでした私は他の統合戦略にもオープンしています。上記のように、JSP生成やその他のリクエストレベルの機能を効果的にテストしたいだけです。

DevAppServerFactoryを使用して、同じJVMで開発サーバーを起動することができました。しかし、これが生成するDevAppServerは、メインJVMとは別のクラスローダーを使用しているようです。これにより、テストはもっと難しくなります。ローカルのUnitTesting Local * TestConfigクラスを使用して、このサーバーの動作を制御することはできません。同様に、私は自分のフックをロールバックして行動を修正することはできません。私がテストハーネスで変更することのできる統計情報は、DevAppServerが見ているのと同じ統計ではないので、これは、現在のテストの中心ではない機能(例えば、ログインが必要)をスキップしたり、失敗を注入したり、モックを挿入したりすることに挑戦します。これは本当に完全に効率的に自分のコードをテストすることができます。

私はApp Engineとの統合テストのためのWeb上でのドキュメンテーションが実際に不足していることを発見しました。私は誰かが前にこれをやったと確信しています...あなたが共有できるヒントやリソースはありますか?

答えて

2

基本的には、次の2つのことを実行する必要があります。

  1. が唯一のリモートヘルパーにセットアップとティアダウンを呼び出すことができるようにのテスト中に有効にする必要があります(何か)2つのサーブレット、を追加します。
  2. で完全にシングルスレッドの方法でサーブレットエンジンにリクエストを送信させます。これは何らかの理由でGoogleが提供するHelperクラスが現在のスレッドでのみ有効になるために必要です。
0

この問題については、文書化されていないことに同意します。
サーバーをブラックボックスとして起動し、HTTP要求を送信するエンドツーエンドのテストを作成しました。

それは次のように機能します。今、私が持っている問題は、あなたがこれらのテストのうちの2つを持っている場合は、それぞれが個別に渡すと、あなたは同じバイナリでそれらを実行することができないということです

package com.project.org; 

import static org.junit.Assert.assertEquals; 
import java.io.File; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.List; 
import org.junit.After; 
import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import com.google.appengine.api.urlfetch.HTTPResponse; 
import com.google.appengine.api.urlfetch.URLFetchServiceFactory; 
import com.google.appengine.tools.development.testing.BaseDevAppServerTestConfig; 
import com.google.appengine.tools.development.testing.DevAppServerTest; 
import com.google.appengine.tools.development.testing.DevAppServerTestRunner; 
import com.google.appengine.tools.development.testing.LocalServiceTestHelper; 

@RunWith(DevAppServerTestRunner.class) 
@DevAppServerTest(HelloWorldTest.TestConfig.class) 
public class HelloWorldTest { 

    public class TestConfig extends BaseDevAppServerTestConfig { 

    @Override public File getSdkRoot() { 
     // You may need to tweak this. 
     return new File("../../appengine-java-sdk-1.9.15"); 
    } 

    @Override public File getAppDir() { 
     return new File("war"); 
    } 

    @Override 
    public List<URL> getClasspath() { 
     // There may be an easier way to do this. 
     List<URL> classPath = new ArrayList<>(); 
     try { 
     String separator = System.getProperty("path.separator"); 
     String[] pathElements = System.getProperty("java.class.path").split(separator); 
     for (String pathElement : pathElements) { 
      classPath.add(new File(pathElement).toURI().toURL()); 
     } 
     } 
     catch (MalformedURLException e) { 
     throw new RuntimeException(e); 
     } 
     return classPath; 
    } 
    } 

    private final LocalServiceTestHelper testHelper; 
    private final String port; 

    public HelloWorldTest() { 
    testHelper = new LocalServiceTestHelper(); 
    port = System.getProperty("appengine.devappserver.test.port"); 
    } 

    @Before public void setUpServer() { 
    testHelper.setUp(); 
    } 

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

    @Test public void testHelloWorld() throws Exception { 
    URL url = new URL("http://localhost:" + port + "/hello"); 
    HTTPResponse response = URLFetchServiceFactory.getURLFetchService().fetch(url); 
    assertEquals(200, response.getResponseCode()); 
    assertEquals("Hello world!", new String(response.getContent(), "UTF-8")); 
    } 
} 

this fileのライン37上の 例外がスローされます:

IllegalStateExceptionが( "DevのAppServerのは、すでに実行されている")

ないこの問題を解決する方法がわから。