同じフォルダー(src/test/Java)に統合テストと単体テストの両方を含むマルチモジュールMavenプロジェクトがあります。統合テストには@Category(IntegrationTest.class)
のマークが付いています。私は次の設定になりたいです:
mvn install
を実行すると、すべてのテストをコンパイルしたいのですが、実行したくありません。mvn test
を実行する場合、すべてのテストをコンパイルし、ユニットテストのみを実行します。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
が単体テストのみを実行するソリューションも受け入れますが、大きな違いはないと思います。
Mavenの build life-cycle の概念を理解していないようです。 mvn install
を実行すると、すべてのライフサイクルフェーズ(install
フェーズ自体を含む)がインストールフェーズの前に実行されます。これは、次のフェーズを実行することを意味します。
つまり、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>
最初の要件:
mvn install
を実行すると、すべてのテストをコンパイルしたいのですが、実行したくありません。以下を使用して実現できます。
mvn -Pno-unit-test test
mvn test
を実行する場合、すべてのテストをコンパイルし、ユニットテストのみを実行します。これは、単純な呼び出しを使用することで簡単に実現できます。
mvn test
統合テストフェーズが実行されないためです(ビルドライフサイクルを参照)。
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がよりシンプルで短くなります。
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>
この投稿 は、これらのテストに使用するプラグインに関係なく、統合テストをスキップする方法を説明しています。
基本的に、あなたがすることは、プロファイルを定義し、すべての統合テスト関連のxmlコードをそのプロファイル内に配置することです。プロパティ-DskipIntegrationTests
不足している。
単体テストでも同じことができます。プロファイルを作成し、-DskipUnitTests
不足している。
その後、次のことができます。
mvn install -DskipIntegrationTests -DskipUnitTests # (runs install without any tests)
mvn test # (runs unit tests)
mvn post-integration-test # (runs all tests)
Maven-failsafe-plugin docs には、「Skipping by Default」というタイトルのセクションがあります。
悲しいことに、そのページに記載されている手順は、書かれたとおりには機能しません。ただし、これらの手順にわずかな変更を加えると機能します。
pom.xml
のproperties
セクションで、これを追加します。
<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が長い間嫌われていた理由について、悪いドキュメントが大きな役割を果たしました。
mvn test-compile
は、まさにあなたが探していることをします。 mvn install
をmvn test-compile
に置き換えるだけで完了です。 POMファイルなどをカスタマイズする必要はありません。以下のリンクされた質問は、#1についても同様です。
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.
フェイルセーフプラグインの構成で実行ステップを指定しないでください。例えば。
<plugins>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>3.0.0-M3</version>
</plugin>
</plugins>
次に、mvn failsafe:integration-testを呼び出して統合テストを実行する必要があります。他のmvnターゲットではスキップされます。