2012-11-16 14 views
8

Tomcat'te çalıştırılacak bir WAR oluşturan bir Maven tabanlı web uygulaması projem var. Tartışma uğruna, bu projenin birim testleri için ağı ağı üzerinden istek göndermenin/almanın hayati derecede önemli olduğunu varsayalım (yalnızca sahte bir istekle sunucu yöntemlerini çağırmak yerine).Test amaçlı "süreç içi" bir Tomcat örneğinin olması mümkün mü?

Test takımımın aynı JVM'de bir Tomcat örneğini çalıştırması, mevcut projeyi yüklemesi ve test durumlarının localhost numaralı telefona bildirmesine izin vermenin bir yolu var mı? Başarısız olan şey şu ki, mevcut projeyi (bağımlılıklar ile birlikte) bir WAR'ye nasıl programlı olarak paketlerim? Böylece, başka bir Tomcat örneğine programlı olarak yüklemek için Kargo'yı kullanabilirim? mvn'a bombardımandan daha iyi bir alternatif var mı?

benim isteği olağandışı olduğunu biliyorum ve birim testleri olmalıdır fazla kendi kendine yeten, vs, ama :)

+2

Neden gömülü tomcat bakamıyor http://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/startup/Embedded.html –

+0

[Howto embed Tomcat 6?] 'nın olası bir kopyası (http://stackoverflow.com/questions/640022/howto-embed-tomcat-6) –

+0

@ArunPJohny: Bu, tam olarak aradığım şey oldu - harika çalıştı! Eğer (ya da isteyen herkes) bir cevap olarak koyduysanız, bunu kabul edeceğim :) –

cevap

5

bir savaşla bir erkek kedi örneğini başlatmak ve selenyum Testlerin

çalıştırmak

    • gömülmüş junit testleri
    • Bir embedded Tomcat için kullanabilirsiniz tam olarak bu amaç.Test kablo demetinizde statik bir örnek oluşturun ve sonunda kapatın. İşte bazı örnek kod:

      import org.apache.catalina.LifecycleException; 
      import org.apache.catalina.startup.Tomcat; 
      import org.junit.AfterClass; 
      import org.junit.BeforeClass; 
      
      public class TomcatIntegrationTest { 
          private static Tomcat t; 
          private static final int TOMCAT_PORT = 9999; 
      
          @BeforeClass 
          public static void setUp() throws LifecycleException { 
          t = new Tomcat(); 
          t.setBaseDir("."); 
          t.setPort(TOMCAT_PORT); 
          /* There needs to be a symlink to the current dir named 'webapps' */ 
          t.addWebapp("/service", "src/main/webapp"); 
          t.init(); 
          t.start(); 
          } 
      
          @AfterClass 
          public static void shutDownTomcat() throws LifecycleException { 
          t.stop(); 
          } 
      } 
      
  • 6

    İskelesi bu amaç için gerçekten iyi çalışıyor boyunca Sadece oynamak bildirin. Tomcat'a sahip olmak zorunda kalmazsanız, entegrasyon testi aşamasında bunu kolayca kullanabilirsiniz. Ön entegrasyon başlangıç ​​iskelesi var ve entegrasyon sonrası durdurun ve gerçek bir konteynırda çalıştığı için savaş dosyanıza istekte bulunabilirsiniz.

    +0

    Downvote, çünkü soru Tomcat hakkında. Tanımladığınız yaklaşım Tomcat ile mümkündür, bu yüzden konteyneri değiştirmeye gerek yoktur. –

    +0

    Sadece alternatif bir yaklaşım sağladığımı ve özellikle "Tomcat'a sahip olmak zorunda kalmamaktan" bahsetmiş olduğumu farkedeceksiniz. Evet, Tomcat'i de gömebilirsiniz, ancak bu kullanımda daha hafif olmak için Jetty'i buldum. – Michael

    2

    Uygun entegrasyon testleri oluşturmanızı ve maven oluşturma sırasında entegrasyon testleri yapmak için aşağıdaki kurulumu kullanmamızı öneririm.

    Tomcat'i indirmek veya deponuzdan bir artifakt kullanmanız gerekiyorsa aşağıdaki bölümü kullanabilirsiniz.

    <groupId>org.codehaus.cargo</groupId> 
    <artifactId>cargo-maven2-plugin</artifactId> 
    <configuration> 
        <wait>false</wait> 
        <container> 
         <containerId>tomcat${tomcat.major}x</containerId> 
         <zipUrlInstaller> 
          <url>http://archive.apache.org/dist/tomcat/tomcat-${tomcat.major}/v${tomcat.version}/bin/apache-tomcat-${tomcat.version}.tar.gz</url> 
          <extractDir>${project.build.directory}/extract/</extractDir> 
          <downloadDir>${project.build.directory}/download/</downloadDir> 
         </zipUrlInstaller> 
         <output>${project.build.directory}/tomcat${tomcat.major}x.log</output> 
         <log>${project.build.directory}/cargo.log</log> 
        </container> 
        <configuration> 
         <home>${project.build.directory}/tomcat-${tomcat.version}/container</home> 
         <properties> 
          <cargo.logging>high</cargo.logging> 
          <cargo.servlet.port>9080</cargo.servlet.port> 
          <cargo.tomcat.ajp.port>9008</cargo.tomcat.ajp.port> 
         </properties> 
        </configuration> 
    </configuration> 
    

    sonraki kısmı başlangıç ​​kullanılır ve (aynı zamanda iskelesi ile çalışan) verilen tomcat içine uygulamayı dağıtmak.

    <execution> 
        <id>stop-container</id> 
        <phase>post-integration-test</phase> 
        <goals> 
         <goal>stop</goal> 
        </goals> 
    </execution> 
    

    iyi şey app-it olarak adlandırabileceğimiz ayrı maven modüle yapılandırma vb bu tür koymaktır (:

    <executions> 
        <execution> 
         <id>start-container</id> 
         <phase>pre-integration-test</phase> 
         <goals> 
          <goal>start</goal> 
          <goal>deploy</goal> 
         </goals> 
         <configuration> 
          <deployer> 
           <deployables> 
            <deployable> 
             <groupId>${project.groupId}</groupId> 
             <artifactId>mod-war</artifactId> 
             <type>war</type> 
             <pingURL>http://localhost:9080/mod-war</pingURL> 
             <pingTimeout>30000</pingTimeout> 
             <properties> 
              <context>mod-war</context> 
             </properties> 
            </deployable> 
           </deployables> 
          </deployer> 
         </configuration> 
        </execution> 
    

    ve tabii

    nihayet aracılığıyla başlatılan sunucuyu durdurmak için entegrasyon testi için). entegrasyon test aşamasında çalışan ve yukarıdaki yapılandırma başlar edilecek yaşam döngüsü kontrol ise test tam devri sadece

    mvn verify 
    

    tarafından çağrılabilir. Ancak, tümleştirme sınamalarının çalışmasını sağlamak için maven-failsafe-plugin'u yapılandırmanız önemlidir. Bu konuda ayrıntılı açıklaması Ne yapabilirsiniz http://tomcat.apache.org/maven-plugin-2.0/archetype.html bkz Apache'den erkek kedi maven eklenti ile bir arketip oluşturmaktır Maven Unit- and Integration Test Guide

    <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-failsafe-plugin</artifactId> 
        <version>2.12</version> 
        <executions> 
        <execution> 
         <id>integration-test</id> 
         <goals> 
         <goal>integration-test</goal> 
         </goals> 
        </execution> 
        <execution> 
         <id>verify</id> 
         <goals> 
         <goal>verify</goal> 
         </goals> 
        </execution> 
        </executions> 
    </plugin> 
    
    0

    bulunabilir.

    çeşitli örnekleri var olacaktır: hth

    İlgili konular