36

Web サービスを提供する webapp があります。このサービスが正常に動作しているかどうかを確認するために、SoapUI で JUnit テストを実行したいと考えています。
しかし、Web サービス アプリケーションをテストするには、Tomcat 7 サーバーにデプロイする必要があります。

war をビルドするように maven を構成し、それを tomcat にデプロイして (理想的には、このために別の tomcat インスタンスを実行する)、JUnit テストを実行する方法がわかりません。
どんな助けにも感謝します。

私はMaven 2.2.1を使用しています

4

3 に答える 3

119

この種のMavenとの統合テストの処理方法については、さまざまな考え方があります。

アプリケーションをアプリケーション サーバーにデプロイするときは、もはや単体テストの領域にはいないことを指摘しておく必要があります。アプリケーション全体がコンテナー内にデプロイされるため、これら 2 つのコンポーネントの統合をテストしています。

現在、統合テストの実行に JUnit を使用することに問題はありません(ただし、ヒットする可能性のあるいくつかの制限があります。たとえば、単体テストは、個々のテストの順序付けを気にする必要はありません。正しく記述していると仮定すると、JUnitはこれを強制します。実行順序を保証する... Java 1.7より前は、クラス内のテストメソッドの順序によって実行順序が誤って暗示されていましたが、JUnitコントラクトの一部ではありませんでした...統合のために他のテストフレームワークに切り替える人もいますJUnit の単体テストの焦点がテスト開発の邪魔になっている場合は、TestNG などのテスト)

覚えておくべき重要なポイントは、Maven ライフサイクルが単体テストの実行にフェーズを使用することtestです。

統合テストに関しては、Maven でテストを処理する正しい方法について 2 つ (半) の考え方があります。

学校 1 - フェイルセーフとintegration-test/verify

packageこの考え方では、コンテナを起動し、統合テストを実行し、コンテナを破棄し、最後にテスト結果を確認し、テストが失敗した場合はビルドを失敗させるまでのフェーズを使用します。

入力したいと思うときはいつでも、実際にmvn integration-test入力したいと思うときはいつでも、コンテナーを正しく破棄しないため、絶対に実行しないでください(ああ、見て、入力するのが短くて簡単です...ボーナス)mvn integration-testmvn verify

したがって、これを使用して次のことを行います。

  • tomcat7:runpre-integration-testフェーズにバインドしますfork=true
  • failsafe :integration-testintegration-testフェーズにバインドします
  • tomcat7:shutdownpost-integration-testフェーズにバインドします
  • failsafe:verify をverifyフェーズにバインドします。

追加のブラウニー ポイントについては、フェーズにバインドされたbuild-helper-maven-plugin:reserve-network-portvalidateを使用して、テスト サーバーが未使用のネットワーク ポートで起動されるようにし、テスト リソースに対してリソース フィルタリングを使用して、テストにポートするか、 systemPropertyVariablesを介して渡されるシステム プロパティを使用してポート番号をテストで使用できるようにします。

利点

  • きれいな Maven ビルド
  • テストが失敗した場合、プロジェクトをリリースできません
  • run-itsテストが遅すぎてすべてのビルドを実行できない場合は、統合テストを別のプロファイルに移動できます (慣例により と呼ばれます)。

短所

  • IDE からテストを実行するのは難しい。すべての統合テストは開始/終了しIT、MavenTestは Surefire で開始/終了するテストを実行し、Failsafe で開始/終了するテストを実行することを認識してITいますが、IDE はおそらくそうではありません。さらに、IDE はコンテナーを開始しないため、実際に手動でテストを実行するには、手作業で多くの作業を行う必要があります。
  • テストをデバッグするには、2 つのデバッガーを接続する必要がある可能性があります。たとえば、1 つはコンテナーで実行されているアプリケーションをデバッグし、もう 1 つはテスト ケースをデバッグします。

    mvnDebug -Dmaven.failsafe.debug=true verify
    
  • テストを Maven ビルド プロセスに結合します。

学校 2 - 別のモジュール

この考え方では、統合テストをモジュールに依存する別のモジュールに移動し、たとえば、Tomcat7 の依存関係と結合されたフェーズにバインドしてテストすることを使用して、統合テストをテスト リソースにwarコピーします。wardependency:copy-dependenciesgenerate-test-resources

テスト ケース自体は、組み込みモードを使用して Tomcat7 コンテナーを起動します。

利点

  • テストは IDE で実行できます
  • 統合テストは単体テストから分離されているため、IDE にすべてのテストを実行するように要求しても、遅いテストが開始されることはありません。

短所

  • アーティファクトは、フェーズwarを過ぎた場合にのみ再構築されるため、IDE を使用する場合は、テスト対象のコードを更新するためpackageに少なくとも定期的に実行する必要があります。mvn clean package
  • 統合テストが失敗してもモジュールのビルドが壊れることはないため、war最終的に壊れたwarアーティファクトをリリースしてから、統合テスト モジュールのリアクター ビルドを失敗させることができます。統合テスト モジュールを組み込み、src/itMaven Invoker Plugin を使用してテストを実行することで、この問題に対処する人もいますが、IDE 統合が不十分になるため、この行はお勧めしません。
  • Maven から統合されたテスト カバレッジ レポートを取得するのは困難です。
  • テストケース内からコンテナーの開始/停止を自分でコーディングする必要があります。

School 2.5 - 独自の Tomcat7 サーバーを起動するテスト ケースによるフェールセーフ

これは、2 つのアプローチの一種のハイブリッドです。

Failsafe を使用してテストを実行しますが、テスト対象の Tomcat7 コンテナーの開始と停止はテスト自体が担当します。

利点

  • Maven pom でサーバーの起動/停止を構成する必要はありません
  • IDE はすべてのテストを安全に実行できます (ただし、統合テストは遅くなる可能性があり、実行したくない場合もありますが、テストの失敗がない限り、すべてが失敗するわけではありません)
  • IDE からテストを簡単にデバッグできます (アタッチするプロセスは 1 つだけです。IDE は通常、特別なテスト ランナーを提供することでテストを簡単にデバッグできます)。

短所

  • テストケース内から自分でコンテナの開始/停止をコーディングする必要があります

上記が、あなたが持っているオプションを理解するのに役立つことを願っています. 他にも微調整があるかもしれませんが、一般的に、上記は現在 Maven との統合テストのベスト プラクティスと見なされています。

于 2013-06-05T09:43:16.663 に答える
0

Stephen Connolly が説明しているように、これを直接構成する方法はありません。フェイルセーフプラグインを使用してこれを解決する方法を説明します。Maven ライフサイクルでは、テストのタイプをテストできます。それらの1つを単体テストし、もう1つは統合テストです。単体テストは、Maven ライフサイクルのテスト段階で実行できます。統合テストを実行する場合は、検証段階で実行できます。単体テストと統合テストの違いを知りたい場合は、これが良いでしょう。デフォルトでは、単体テスト クラスは である必要があり***/*Test.java**/*TestCase.java この形式です。**/IT*.javaフェイルセーフ プラグインは、**/*IT.java、およびを探します**/*ITCase.java

ここに例があります。 ここに画像の説明を入力

ここには、1 つの単体テスト クラスと 1 つの統合テスト クラスがあります。ここで、maven pom.xml のように見える方法を説明します。Maven 構成のビルド セクションは次のようになります。

<build>
    <plugins>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <webXml>src/main/webapp/WEB-INF/web.xml</webXml>
                <warName>${name}</warName>
                <outputDirectory>/home/jobs/wso2/wso2as-5.3.0/repository/deployment/server/webapps</outputDirectory>
                <goal>
                </goal>
            </configuration>
        </plugin>

        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>

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

単体テストは、Web アプリ (war ファイル) をデプロイする前に実行されます。ただし、統合テストは検証段階で実行されます。この段階でお客様の要件が満たされることを願っています。

于 2015-11-09T16:19:24.010 に答える