2012-11-16 9 views
8

Tomcatで実行されるWARを生成するMavenベースのWebアプリケーションプロジェクトがあります。議論のために、ネットワーク(単純にモックリクエストでサーブレットメソッドを呼び出すのではなく)でリクエストを実際に送受信するためには、プロジェクトの単体テストでは非常に重要だとします。テストのために、 "インプロセス"のTomcatインスタンスを持つことは可能ですか?

Tomcatのインスタンスを同じJVMで実行し、現在のプロジェクトをロードし、テストケースをlocalhostに当てる方法はありますか?これを失敗すると、実際には現在のプロジェクト(依存関係とともに)をWARにパッケージ化して、他のTomcatインスタンスにプログラムでアップロードすることができますか? mvnに砲撃する以外の方法はありませんか?

私は私の要求は珍しいとユニットテストはより多くの自己完結型、などであるべきですけど、ちょうど桟橋は、この目的のために本当によく働く:)

+2

は、なぜあなたは組み込みのTomcatで見ることができないhttp://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/startup/Embedded.html –

+0

可能な複製[Tomcat 6を埋め込む方法](http://stackoverflow.com/questions/640022/howto-embed-tomcat-6) –

+0

@ArunPJohny:これは私が探していたものでした。あなた(または誰かが)答えとしてそれを置くなら、私はそれを受け入れるでしょう:) –

答えて

5

あなたはembedded Tomcatを使用することができますが正確にこの目的。テスト・ハーネスに静的インスタンスを設定し、最後に停止してください。ここではいくつかのサンプルコードです:

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

に沿って遊ばせてください。 Tomcatを持っていなければ、統合テスト段階でこれを非常に簡単に使うことができます。事前統合がjettyを開始し、統合後に停止すると、実際のコンテナで実行されているため、warファイルで要求をスローすることができます。

+0

質問はTomcatに関するものです。あなたが記述するアプローチはTomcatで可能ですので、コンテナを切り替える必要はありません。 –

+0

代わりの方法を提供するだけで、私は特に "Tomcatを持っていなくてはならない"と言いました。はい、Tomcatも組み込むことができますが、私はこの使用法でJettyをもっと軽くすることができました。 – Michael

2

適切な統合テストを作成し、次の設定を使用してMavenビルド中に統合テストを行うことをお勧めします。

tomcatをダウンロードする場合、またはリポジトリのアーティファクトを使用する必要がある場合は、次の部分を使用できます。

<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> 

次の部分は、指定されたtomcat(jettyと連携して動作するアプリケーション)を起動して展開するために使用されます。経由して最終的に開始したサーバーを停止する

<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> 

そしてもちろん:

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

最善のことは、アプリ-それ(と呼ばれるかもしれない別のMavenのモジュールにコンフィギュレーションなどのこの種を置くことですそれは統合テスト用です)。統合テストフェーズを実行し、上記のような構成を開始するライフサイクルを確認する一方、試験の 完全なサイクルは、単に

mvn verify 

によって呼び出すことができます。しかし、統合テスト自体を実行するには、maven-failsafe-pluginを設定することが重要です。これについての詳細な説明は、あなたが何ができるか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

で見つけることができhttp://tomcat.apache.org/maven-plugin-2.0/archetype.htmlを参照のApacheからTomcatのMavenプラグインで原型を生成することです。

あなたは様々なサンプルがあります:

  • 埋め込まJUnitテスト
  • 戦争でTomcatインスタンスを起動して実行
  • セレンが

をテストHTH

関連する問題