この種のMavenとの統合テストの処理方法については、さまざまな考え方があります。
アプリケーションをアプリケーション サーバーにデプロイするときは、もはや単体テストの領域にはいないことを指摘しておく必要があります。アプリケーション全体がコンテナー内にデプロイされるため、これら 2 つのコンポーネントの統合をテストしています。
現在、統合テストの実行に JUnit を使用することに問題はありません(ただし、ヒットする可能性のあるいくつかの制限があります。たとえば、単体テストは、個々のテストの順序付けを気にする必要はありません。正しく記述していると仮定すると、JUnitはこれを強制します。実行順序を保証する... Java 1.7より前は、クラス内のテストメソッドの順序によって実行順序が誤って暗示されていましたが、JUnitコントラクトの一部ではありませんでした...統合のために他のテストフレームワークに切り替える人もいますJUnit の単体テストの焦点がテスト開発の邪魔になっている場合は、TestNG などのテスト)
覚えておくべき重要なポイントは、Maven ライフサイクルが単体テストの実行にフェーズを使用することtest
です。
統合テストに関しては、Maven でテストを処理する正しい方法について 2 つ (半) の考え方があります。
学校 1 - フェイルセーフとintegration-test/verify
package
この考え方では、コンテナを起動し、統合テストを実行し、コンテナを破棄し、最後にテスト結果を確認し、テストが失敗した場合はビルドを失敗させるまでのフェーズを使用します。
入力したいと思うときはいつでも、実際にmvn integration-test
入力したいと思うときはいつでも、コンテナーを正しく破棄しないため、絶対に実行しないでください(ああ、見て、入力するのが短くて簡単です...ボーナス)mvn integration-test
mvn 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
コピーします。war
dependency:copy-dependencies
generate-test-resources
テスト ケース自体は、組み込みモードを使用して Tomcat7 コンテナーを起動します。
利点
- テストは IDE で実行できます
- 統合テストは単体テストから分離されているため、IDE にすべてのテストを実行するように要求しても、遅いテストが開始されることはありません。
短所
- アーティファクトは、フェーズ
war
を過ぎた場合にのみ再構築されるため、IDE を使用する場合は、テスト対象のコードを更新するためpackage
に少なくとも定期的に実行する必要があります。mvn clean package
- 統合テストが失敗してもモジュールのビルドが壊れることはないため、
war
最終的に壊れたwar
アーティファクトをリリースしてから、統合テスト モジュールのリアクター ビルドを失敗させることができます。統合テスト モジュールを組み込み、src/it
Maven Invoker Plugin を使用してテストを実行することで、この問題に対処する人もいますが、IDE 統合が不十分になるため、この行はお勧めしません。
- Maven から統合されたテスト カバレッジ レポートを取得するのは困難です。
- テストケース内からコンテナーの開始/停止を自分でコーディングする必要があります。
School 2.5 - 独自の Tomcat7 サーバーを起動するテスト ケースによるフェールセーフ
これは、2 つのアプローチの一種のハイブリッドです。
Failsafe を使用してテストを実行しますが、テスト対象の Tomcat7 コンテナーの開始と停止はテスト自体が担当します。
利点
- Maven pom でサーバーの起動/停止を構成する必要はありません
- IDE はすべてのテストを安全に実行できます (ただし、統合テストは遅くなる可能性があり、実行したくない場合もありますが、テストの失敗がない限り、すべてが失敗するわけではありません)
- IDE からテストを簡単にデバッグできます (アタッチするプロセスは 1 つだけです。IDE は通常、特別なテスト ランナーを提供することでテストを簡単にデバッグできます)。
短所
- テストケース内から自分でコンテナの開始/停止をコーディングする必要があります
上記が、あなたが持っているオプションを理解するのに役立つことを願っています. 他にも微調整があるかもしれませんが、一般的に、上記は現在 Maven との統合テストのベスト プラクティスと見なされています。