web-dev-qa-db-ja.com

Mavenテスト目標でテストを実行しながら、Mavenインストール目標でテストをスキップするにはどうすればよいですか?

同じフォルダー(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>を使用してみましたが、すべての目標でテストの実行が無効になります。 mvn testオプションがskipTests=trueオプションを尊重することも非常に奇妙です...そもそもなぜ実行したいのですか??

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

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

55
thegeko

Mavenの build life-cycle の概念を理解していないようです。 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を実行する場合、すべてのテストをコンパイルして実行します。

これは、単体テスト(maven-surefire-plugin)を実行するtestフェーズの実行と、さらに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>

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

91
khmarbaise

Failsafe Plugin documentation によると

mvn install -DskipITs

あなたが望むものです。

49
gli00001

OPが彼の質問で述べたこと:

mvn installを実行すると、すべてのテストをコンパイルしたいのですが、実行したくありません。
mvn testを実行する場合、すべてのテストをコンパイルし、ユニットテストのみを実行します。
mvn integration-testを実行すると、すべてのテストをコンパイルして実行したいです。

完全に有効であり、非常に簡単に達成できます。
EDIT:最初の条件を除き、mavenの性質に再び作用します。ここでの最良の方法は、単にmvn install -DskipTests

必要なのは、pom.xml

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.17</version>
    <executions>
        <execution>
            <id>integration-tests</id>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
</plugin>

そして、ユニットテストと統合テストのためにmavenの命名規則に固執します(@khmarbaiseがすでに述べたように)。したがって、一般的には、統合テストにIT接尾辞を付けます(たとえば、MyIntegrationTestIT.Java)そしてmaven-failsafeその仕事をする。
この方法では、JUnitカテゴリさえ必要ありません(時には非常に役立つ場合もあります)。

それでおしまい :)

  • mvn test実行のみ単体テスト
  • mvn integration-testすべてのテストを実行します
  • mvn failsafe:integration-test実行のみ統合テスト
  • mvn clean verify確認したいときは、プロジェクト全体が機能するだけです


いくつかの個人的なアドバイス

統合テストを単体テストとは別にしておくと、IDEパッケージ内のすべてのテスト内で簡単に実行できます。通常、test-integration(またはintegrationtest)がこの目的に使用されます。
これもmavenで簡単に実現できます。

<plugin>
    <!-- adding second test source directory (just for integration tests) -->
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.9.1</version>
    <executions>
        <execution>
            <id>add-integration-test-source</id>
            <phase>generate-test-sources</phase>
            <goals>
                <goal>add-test-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>src/test-integration/Java</source>
                </sources>
            </configuration>
        </execution>
    </executions>
</plugin>

そして、統合テストをそのディレクトリに移動します。次のようになります。

src
   main
   test
   test-integration

通常、統合テストにはより多くのメモリが必要です。

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    ...
    <configuration>
        <argLine>-Xmx512m -XX:MaxPermSize=256m</argLine>
    </configuration>
</plugin>
16
G. Demecki

この投稿 は、これらのテストに使用するプラグインに関係なく、統合テストをスキップする方法を説明しています。

基本的に、あなたがすることは、プロファイルを定義し、すべての統合テスト関連のxmlコードをそのプロファイル内に配置することです。プロパティ-DskipIntegrationTests 不足している。

単体テストでも同じことができます。プロファイルを作成し、-DskipUnitTests 不足している。

その後、次のことができます。

mvn install -DskipIntegrationTests -DskipUnitTests # (runs install without any tests)
mvn test # (runs unit tests)
mvn post-integration-test # (runs all tests)
12
Emil Salageanu

Maven-failsafe-plugin docs には、「Skipping by Default」というタイトルのセクションがあります。

悲しいことに、そのページに記載されている手順は、書かれたとおりには機能しません。ただし、これらの手順にわずかな変更を加えると機能します。

pom.xmlpropertiesセクションで、これを追加します。

<skipITs>true</skipITs>

次に、skipTestsプロパティをmaven-failsafe-pluginの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が長い間嫌われていた理由について、悪いドキュメントが大きな役割を果たしました。

4
rdguam

mvn test-compileは、まさにあなたが探していることをします。 mvn installmvn test-compileに置き換えるだけで完了です。 POMファイルなどをカスタマイズする必要はありません。以下のリンクされた質問は、#1についても同様です。

Maven-テストを実行せずにコンパイルする方法?

mvn test-compileは最良の回答として受け入れられるべきです。Mavenは、あなたがネイティブで、魔法なしでやりたいことを正確にサポートしているからです。あなたはこれで終わるでしょう:

If I run mvn test-compile, I want all tests to compile, but I do not want to execute any.
If I run mvn test, I want all tests to compile, but execute only unit tests.
If I run mvn integration-test, I want to compile and execute all tests.
2
Ferg

フェイルセーフプラグインの構成で実行ステップを指定しないでください。例えば。

    <plugins>
        <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>3.0.0-M3</version>
        </plugin>
    </plugins>

次に、mvn failsafe:integration-testを呼び出して統合テストを実行する必要があります。他のmvnターゲットではスキップされます。

0
guymac