9

Tomcatで実行するWARを生成するMavenベースのWebアプリプロジェクトがあります。議論のために、そのプロジェクトの単体テストが実際にネットワークを介してリクエストを送受信することが非常に重要であると仮定しましょう(単にモックリクエストでサーブレットメソッドを呼び出すのではありません)。

テストハーネスが同じJVMでTomcatのインスタンスを実行し、現在のプロジェクトをロードして、テストケースにヒットさせる方法はありlocalhostますか?それができない場合、Cargoを使用して他のTomcatインスタンスにプログラムでアップロードできるように、現在のプロジェクトを(依存関係とともに)実際にプログラムでWARにパッケージ化するにはどうすればよいですか?ただ砲撃するよりも良い選択肢はありますmvnか?

私のリクエストは珍しいものであり、ユニットテストはもっと自己完結型である必要があることを知っていますが、一緒に遊んでみましょう:)

4

4 に答える 4

7

まさにこの目的のために組み込み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();
  }
}
于 2012-11-17T01:02:20.400 に答える
6

Jettyは、この目的に非常に適しています。Tomcatが必要になることに縛られていない場合は、統合テスト段階でこれを非常に簡単に使用できます。統合前に突堤を開始し、統合後に停止すると、実際のコンテナーで実行されているため、warファイルに要求をスローできます。

于 2012-11-16T04:49:53.553 に答える
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>

最良の方法は、この種の構成などを、app-it(統合テスト用)と呼ばれる可能性のある別のMavenモジュールに配置することです。テストの完全なサイクルは、次のように簡単に呼び出すことができます。

mvn verify

一方、ライフサイクルの検証では、統合テストフェーズが実行され、上記の構成が開始されます。ただし、統合テスト自体を実行するには、 maven-failsafe-pluginを構成することが重要です。これに関する詳細な説明は、Mavenユニットおよび統合テストガイドに記載されています。

<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>
于 2012-11-16T08:33:06.030 に答える
0

あなたができることは、Apacheからtomcatmavenプラグインを使用してアーキタイプを生成することです。http://tomcat.apache.org/maven-plugin-2.0/archetype.htmlを参照してください。

さまざまなサンプルがあります。

  • 埋め込みjunitテスト
  • 戦争でTomcatインスタンスを開始し、Seleniumテストを実行します

HTH

于 2012-11-16T08:59:16.520 に答える