66

同じフォルダー (src/test/java) に統合テストと単体テストの両方を含むマルチモジュール Maven プロジェクトがあります。統合テストは でマークされてい@Category(IntegrationTest.class)ます。私は次の設定で終わりたいです:

  1. を実行するmvn installと、すべてのテストをコンパイルしたいのですが、何も実行したくありません。
  2. を実行するmvn testと、すべてのテストがコンパイルされますが、単体テストのみが実行されます。
  3. を実行mvn integration-testすると、すべてのテストをコンパイルして実行したいと思います。

重要な点は、pom.xml追加のコマンドライン引数なしでこれを構成することです。

現在、親の pom.xml で次の設定を思いつきました。唯一の問題は、すべてのテストが実行される #1 です。

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${project.java.version}</source>
                    <target>${project.java.version}</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.14.1</version>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.maven.surefire</groupId>
                        <artifactId>surefire-junit47</artifactId>
                        <version>2.14.1</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <includes>
                        <include>**/*.class</include>
                    </includes>
                    <excludedGroups>cz.cuni.xrg.intlib.commons.IntegrationTest</excludedGroups>
                </configuration>
            </plugin>

            <plugin>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.14.1</version>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.maven.surefire</groupId>
                        <artifactId>surefire-junit47</artifactId>
                        <version>2.14.1</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <groups>cz.cuni.xrg.intlib.commons.IntegrationTest</groups>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                        <configuration>
                            <includes>
                                <include>**/*.class</include>
                            </includes>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

すべての子モジュールの pom.xml には、親 pom から継承する必要があると思われる次のプラグイン構成があります。

<build> 
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
        </plugin>

        <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
        </plugin>
    </plugins>
</build>

を使用してみ<skipTests>true</skipTests>ましたが、すべての目標に対してテストの実行が無効になり、これは私が望むものではありません (#2 と #3 に違反しています)。mvn testオプションを尊重するのも非常に奇妙skipTests=trueです...そもそもなぜそれを実行したいのですか??

mvn installグーグルで何時間もかけてさまざまな組み合わせを試してみた結果、 でテストを実行すると同時に、 でテストを実行することさえ可能かどうか迷っていますmvn test。誰かがこれが間違っていることを証明してくれることを願っています。;)

mvn install単体テストのみを実行するソリューションも喜んで受け入れますが、大きな違いはないと思います。

4

7 に答える 7

107

Mavenのビルド ライフサイクルの概念を理解していないようです。mvn installすべてのライフサイクル フェーズ (フェーズ自体を含む) を実行する場合installは、インストール フェーズの前に実行します。これは、次のフェーズを実行することを意味します。

  1. 検証
  2. 初期化
  3. 生成ソース
  4. プロセスソース
  5. 生成リソース
  6. プロセスリソース
  7. コンパイル
  8. プロセスクラス
  9. 生成テストソース
  10. プロセステストソース
  11. 生成テスト リソース
  12. プロセス テスト リソース
  13. テストコンパイル
  14. プロセステストクラス
  15. テスト
  16. 準備パッケージ
  17. パッケージ
  18. 統合前テスト
  19. 統合テスト
  20. 統合後テスト
  21. 確認
  22. インストール

つまり、ライフ サイクル フェーズtestだけでなく、フェーズも含まれます。integration-testしたがって、補足情報がなければ、希望どおりに動作を変更することはできません。

Maven でプロファイルを使用することで実現できます。

 <project>
  [...]
  <profiles>
    <profile>
      <id>no-unit-tests</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
              <skipTests>true</skipTests>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
  [...]
</project>

だからあなたの最初の要件:

  1. を実行するmvn installと、すべてのテストをコンパイルしたいのですが、何も実行したくありません。

以下を使用して実現できます。

mvn -Pno-unit-test test
  1. を実行するmvn testと、すべてのテストがコンパイルされますが、単体テストのみが実行されます。

これは、単純な呼び出しを使用して簡単に実現できます。

mvn test

統合テスト フェーズが実行されないためです (ビルドのライフ サイクルを参照してください)。

  1. を実行mvn integration-testすると、すべてのテストをコンパイルして実行したいと思います。

testこれは、単体テスト (maven-surefire-plugin) を実行するフェーズの実行と、さらに maven-failsafe-plugin によって処理される統合テストの実行を含むデフォルトを実行することを意味します。ただし、統合テストを呼び出したい場合は、次のコマンドを使用する必要があることに注意してください。

mvn verify

post-integration-test代わりに、以前の呼び出しでフェーズを逃したことが原因です。

上記とは別に、単体テストと統合テストの命名規則に従う必要があります。単体テストは次のように命名する必要があります。

<includes>
 <include>**/*Test*.java</include>
 <include>**/*Test.java</include>
 <include>**/*TestCase.java</include>
</includes>

統合テストには次のような名前を付ける必要があります。

<includes>
 <include>**/IT*.java</include>
 <include>**/*IT.java</include>
 <include>**/*ITCase.java</include>
</includes>

maven-failsafe-plugin を正しいライフサイクルフェーズにバインドするために必要な次のように maven-failsafe-plugin を構成したことを願っています。

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>2.15</version>
        <executions>
          <execution>
            <goals>
              <goal>integration-test</goal>
              <goal>verify</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

ただし、タグはコンパイルされた名前 ( .class)ではなくinclude、ソース コード ( .java) で機能することに注意してください。Category アノテーションは使用しません。単純に命名規則を使用するだけで、pom がよりシンプルで短くなります。

于 2013-06-15T13:04:14.743 に答える
58

フェイルセーフプラグインのドキュメントによると

mvn install -DskipITs

あなたが望むものです。

于 2013-10-07T18:09:53.700 に答える
5

maven-failsafe-pluginドキュメントには、「デフォルトでスキップ」というタイトルのセクションがあります。

残念ながら、このページに記載されている手順は、書かれているとおりには機能しません。ただし、これらの手順を少し変更すると、機能するようになります。

propertiesセクションにpom.xml、次を追加します。

<skipITs>true</skipITs>

次に、maven-failsafe-pluginskipTestsのセクションにプロパティを追加します。plugin

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <configuration>
        <skipTests>${skipITs}</skipTests>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
</plugin>

したがって、mvn installデフォルトでは単体テストは実行されますが、統合テストは実行されません。

ただし、mvn install -DskipITs=false単体テストと統合テストの両方を実行します。

脚注: Maven がこれほど長い間嫌われていた理由には、不適切なドキュメンテーションが大きな役割を果たしました。

于 2017-02-22T19:11:19.993 に答える