1. 概要

プロジェクトのライフサイクルで非常に一般的なニーズは、統合テストの設定です。 このチュートリアルでは、MavenCargoプラグインを使用してこのシナリオを設定する方法を説明します。

2. Maven統合テストのビルドフェーズ

幸い、Mavenには、この正確なシナリオのサポートが組み込まれており、デフォルトのビルドライフサイクルの次のフェーズがあります(Maven ドキュメントから)。

  • 統合前テスト 統合テストを実行する前に必要なアクションを実行します。 これには、必要な環境の設定などが含まれる場合があります。
  • 統合テスト必要に応じてパッケージを処理し、統合テストを実行できる環境にデプロイします。
  • 統合後テスト 統合テストの実行後に必要なアクションを実行します。 これには、環境のクリーンアップが含まれる場合があります。

3. 貨物プラグインを設定する

必要なセットアップを段階的に見ていきましょう。

3.1. Surefireプラグインから統合テストを除外する

まず、 maven-surefire-plugin は、統合テストが標準のビルドライフサイクルから除外されるように構成されています

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <version>2.22.2</version>
   <configuration>
      <excludes>
         <exclude>**/*IntegrationTest.java</exclude>
      </excludes>
   </configuration>
</plugin>

除外はantスタイルのパス式を介して実行されるため、すべての統合テストはこのパターンに従い、「IntegrationTest.java」で終了する必要があります。

3.2. Cargoプラグインを構成する

次に、 cargo-maven3-plugin が使用されます。これは、Cargoが組み込みWebサーバーのすぐに使える一流のサポートを備えているためです。 もちろん、サーバー環境で特定の構成が必要な場合、cargoは、アーカイブされたパッケージからサーバーを構築する方法と、外部サーバーにデプロイする方法も知っています。

<plugin>
   <groupId>org.codehaus.cargo</groupId>
   <artifactId>cargo-maven3-plugin</artifactId>
   <version>1.9.9</version>
   <configuration>
      <configuration>
         <properties>
            <cargo.servlet.port>8080</cargo.servlet.port>
         </properties>
      </configuration>
   </configuration>
</plugin>

デフォルトの組み込みJetty9Webサーバーが定義されており、ポート8080でリッスンしています。

新しいバージョンのカーゴ(1.1.0以降)では、待機フラグのデフォルト値が falseに変更され、 cargo:startの場合はに変更されました。 この目標は、統合テストの実行にのみ使用する必要があり、Mavenライフサイクルにバインドされています。 開発の場合は、代わりに cargo:runゴールを実行する必要があります。これにはwait =trueがあります。

packageMavenフェーズでdeployablewar ファイルを生成するには、プロジェクトのパッケージが warである必要があります。

3.3. 新しいMavenプロファイルを追加する

次に、新しい統合 Mavenプロファイルが作成され、このプロファイルがアクティブな場合に統合テストのみを実行できるようになります。これは、標準のビルドライフサイクルの一部ではありません。

<profiles>
   <profile>
      <id>integration</id>
      <build>

         <plugins>
            ...
         </plugins>

      </build>
   </profile>
</profiles>

残りのすべての構成の詳細が含まれるのはこのプロファイルです。

これで、Jettyサーバーは、統合前テストフェーズで開始し、統合後テスト停止するように構成されます。段階。

<plugin>
   <groupId>org.codehaus.cargo</groupId>
   <artifactId>cargo-maven3-plugin</artifactId>
   <executions>
      <execution>
         <id>start-server</id>
         <phase>pre-integration-test</phase>
         <goals>
            <goal>start</goal>
         </goals>
      </execution>
      <execution>
         <id>stop-server</id>
         <phase>post-integration-test</phase>
         <goals>
            <goal>stop</goal>
         </goals>
      </execution>
   </executions>
</plugin>

これにより、 cargo:start ゴールとcargo:stop ゴールが、統合テストフェーズの前後に実行されます。 2つの個別のexecution定義があるため、Mavenが構成を受け入れることができるように、 id 要素が両方に存在する(そして異なる)必要があることに注意してください。

3.4. 新しいプロファイルで統合テストを構成する

次に、 maven-surefire-plugin 構成を統合プロファイル内でオーバーライドする必要があります。これにより、デフォルトのライフサイクルで除外されていた統合テストがに含まれるようになります。 そして実行:

<plugins>
   <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <executions>
         <execution>
            <phase>integration-test</phase>
            <goals>
               <goal>test</goal>
            </goals>
            <configuration>
               <excludes>
                  <exclude>none</exclude>
               </excludes>
               <includes>
                  <include>**/*IntegrationTest.java</include>
               </includes>
            </configuration>
         </execution>
      </executions>
   </plugin>
</plugins>

注目に値することがいくつかあります。

1. maven-surefire-plugintestゴールは、統合テストフェーズで実行されます。 この時点で、Jettyはプロジェクトがデプロイされた状態ですでに開始されているため、統合テストは問題なく実行されるはずです。

2. 統合テストが実行に含まれるようになりました。 これを実現するために、除外もオーバーライドされます。これは、Mavenがプロファイル内のプラグイン構成のオーバーライドを処理する方法が原因です。

基本構成は完全にオーバーライドされるのではなく、プロファイル内の新しい構成要素で拡張されます。

このため、オリジナルそもそも統合テストを除外した構成は、プロファイルにまだ存在しているため、オーバーライドする必要があります。そうしないと、 構成とテストはまだ実行されません。

3. たった1つしかないので注意してください要素、あります IDは必要ありません定義します。

これで、プロセス全体を実行できます。

mvn clean install -Pintegration

4. 結論

Mavenの段階的な構成は、プロジェクトのライフサイクルの一部として統合プロセスをセットアップするプロセス全体をカバーします。

通常、これは継続的インテグレーション環境で、できれば各コミット後に実行するように設定されます。 CIサーバーにすでにサーバーが実行され、ポートを消費している場合、カーゴ構成はそのシナリオに対処する必要があります。これについては、今後の投稿で説明します。

このメカニズムの完全に実行されている構成については、RESTGitHubプロジェクトを確認してください。

また、この記事をチェックして、プロジェクトを構築し、ユニットと統合テストを編成するためのベストプラクティスを確認してください。