2012-07-31 32 views
10

GAE/j uygulamam için bazı etkili entegrasyon testleri geliştirmeye çalışıyorum. Ben https://developers.google.com/appengine/docs/java/tools/localunittesting aşina - Bu araçlar küçük birim testleri için harika. Şimdi, gerçek web isteklerini test eden entegrasyon testleri geliştirmeye ilgi duyuyorum. Örneğin, web.xml uygulamasının sunucu ve filtreleri beklenen URL'lerle eşleştirdiğini test etmeyi ve JSP'lerin beklediklerimi oluşturduğunu test etmeyi denemek isterim.Google App Engine (java) için tümleştirme testleri

Amacım, istekleri karşılayabildiğim JVM içinde yerel bir geliştirme sunucusu oluşturmaktı. Yine de diğer entegrasyon stratejilerine açığım; Yukarıda söylediğim gibi, JSP neslini ve diğer istek düzeyindeki özellikleri etkin bir şekilde test etmek istiyorum.

Aynı JVM'de bir geliştirme sunucusunu başlatmak için DevAppServerFactory kullanmayı başardım. Ancak, bu üretilen DevAppServer ana JVM ayrı bir sınıf yükleyici kullanır. Bu, testi çok daha zorlaştırıyor - Bu sunucunun davranışını denetlemek için yerel yerel test etmeyen yerel * TestConfig sınıflarını kullanamıyorum. Benzer şekilde, davranışları değiştirmek için ör. Statik, test kablo demetinde değişebileceğim statikler, DevAppServer'ın baktığı aynı statistikler değil. Bu, mevcut sınama (örneğin, oturum açma gerektiren) merkezi olmayan özelliklerin atlanmasının, hataların enjekte edilmesinin, sahtekarların enjekte edilmesinin vb. Atlatılmasını zorlaştırır. Bu, kodumu ne kadar tamamen ve verimli bir şekilde test edebildiğimi gerçekten sınırlar.

Web'de App Engine ile tümleştirme testleri için gerçek bir belge buldum. Eminim ki birileri bunu daha önce yapmış ... Orada paylaşabileceğiniz herhangi bir ipucu veya kaynak var mı?

cevap

2

Temelde, iki şey yapmanız gerekir:

  1. sadece uzaktan yardımcı üzerinde kurulum ve ayırma çağırmak için izin, test sırasında etkin olmalıdır (her ne ya) iki servlets, ekleyin.
  2. Servlet motorunuzun hizmet isteklerini numaralı tek iş parçacığı biçiminde tamamlayın. Bunun nedeni, bazı nedenlerden ötürü, Google’ın Helper sınıfının yalnızca geçerli ileti dizisinde etkili olması nedeniyle gereklidir.
0

Bu sorunun belgelenmiş olduğunu kabul ediyorum.
Bir sunucuyu kara kutu olarak başlatan ve HTTP istekleri gönderen uçtan uca bir sınama yazmayı başardım.

Bu gibi çalışır:

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")); 
    } 
} 

Şimdi var sorun, her biri ayrı ayrı geçen ile, bu testlerin iki varsa, aynı ikili onları koşamam olmasıdır. on line istisna this file 37 atılmış olsun:

IllegalStateException ("Dev AppServer zaten çalışıyor.")

Bunu düzeltmek için nasıl emin olun.