Maven Cargoプラグインとの統合テスト
プロジェクトのライフサイクルにおける非常に一般的なニーズは、統合テストのセットアップです。 幸い、Mavenには、この正確なシナリオのサポートが組み込まれており、デフォルトのビルドライフサイクルの次のフェーズがあります(Mavendocumentationから):[more-134]#
-
pre-integration-test:Perform actions required before integration tests are executed. This may involve things such as setting up the required environment.
-
integration-test:Process and deploy the package if necessary into an environment where integration tests can be run.
-
post-integration-test:Perform actions required after integration tests have been executed. This may including cleaning up the environment.
まず、maven-surefire-pluginは、標準のビルドライフサイクルからのintegration tests are excludedになるように構成されます。
org.apache.maven.plugins
maven-surefire-plugin
2.17
**/*IntegrationTest.java
Exclusionsはantスタイルのパス式を介して実行されるため、すべての統合テストはこのパターンに従い、“IntegrationTest.java "で終了する必要があります。
次に、cargo-maven2-pluginが使用されます。これは、Cargoには、組み込みWebサーバーのすぐに使用できる一流のサポートが付属しているためです。 もちろん、サーバー環境に特定の構成が必要な場合、cargoはアーカイブされたパッケージからサーバーを構築する方法と、外部サーバーに展開する方法も知っています。
org.codehaus.cargo
cargo-maven2-plugin
1.4.8
jetty8x
embedded
8080
ポート8080をリッスンする組み込みJetty 8 Webサーバーが定義されています。
新しいバージョンの貨物(1.1.0以降)では、cargo:startのデフォルト値であるthe wait flagがfalse,に変更されました。 この目標は、統合テストの実行にのみ使用する必要があり、Mavenライフサイクルにバインドされています。開発の場合、代わりにcargo:runゴールを実行する必要があります–これにはwait=trueがあります。
package Mavenフェーズでdeployable warファイルを生成するには、プロジェクトのパッケージ化が<packaging>war</packaging>である必要があります。
次に、新しいintegrationMaven profileが作成され、このプロファイルがアクティブなときに統合テストonlyを実行できるようになります。これは、標準のビルドライフサイクルの一部ではありません。
integration
...
残りのすべての構成が含まれるのは、このプロファイルです。
これで、Jettyサーバーはpre-integration-testフェーズでstartに、post-integration-testフェーズでstopに構成されました。
org.codehaus.cargo
cargo-maven2-plugin
false
start-server
pre-integration-test
start
stop-server
post-integration-test
stop
これにより、cargo:startゴールとcargo:stopゴールがintegration-testフェーズの前後に実行されることが保証されます。 2つの個別のexecution定義があるため、Mavenが構成を受け入れることができるように、id要素が両方に存在する(そして異なる)必要があることに注意してください。
次に、maven-surefire-plugin構成をintegrationプロファイル内でオーバーライドする必要があります。これにより、デフォルトのライフサイクルで除外されていた統合テストがincludedになり、実行されます。
org.apache.maven.plugins
maven-surefire-plugin
integration-test
test
none
**/*IntegrationTest.java
注目に値するものがいくつかあります。
1. maven-surefire-pluginのtestゴールは、integration-testフェーズで実行されます。この時点で、Jettyはプロジェクトがデプロイされた状態ですでに開始されているため、統合テストは問題なく実行されるはずです。
2. 統合テストは、実行時にincludedになりました。 これを実現するために、除外もオーバーライドされます。これは、Mavenがプロファイル内のオーバーライドプラグイン構成を処理する方法のためです。 基本構成は完全にオーバーライドされるのではなく、プロファイル内の新しい構成要素で拡張されます。 このため、最初に統合テストを除外した元の<excludes>構成はプロファイルに引き続き存在し、オーバーライドする必要があります。そうしないと、<includes>構成およびテストはまだ実行されません。
3. <execution>要素は1つしかないため、定義するno need for an idがあることに注意してください。
これで、プロセス全体を実行できます:
mvn clean install -Pintegration
結論
Mavenの段階的な設定は、プロジェクトライフサイクルの一部として統合プロセスを設定するプロセス全体をカバーしています。
通常、これは継続的な統合環境で実行されるように設定され、できれば各コミット後に実行されます。 CIサーバーに既にポートを実行および使用しているサーバーがある場合、貨物の構成はそのシナリオに対処する必要があります。これについては、今後の記事で説明します。
このメカニズムの完全に実行されている構成については、REST GitHub projectをチェックアウトしてください。
また、プロジェクトを構築し、ユニットと統合テストを編成するためのベストプラクティスについては、check out this articleを参照してください。