Maven Cargoプラグインとの統合テスト

Maven Cargoプラグインとの統合テスト

プロジェクトのライフサイクルにおける非常に一般的なニーズは、統合テストのセットアップです。 幸い、Mavenには、この正確なシナリオのサポートが組み込まれており、デフォルトのビルドライフサイクルの次のフェーズがあります(Mavendocumentationから):[more-134]

  • pre-integration-testPerform actions required before integration tests are executed. This may involve things such as setting up the required environment.

  • integration-testProcess and deploy the package if necessary into an environment where integration tests can be run.

  • post-integration-testPerform 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 flagfalse,に変更されました。 この目標は、統合テストの実行にのみ使用する必要があり、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-plugintestゴールは、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を参照してください。