複数のプロファイルに基づいて単体テストの一部のカテゴリを除外するように Maven を構成しようとすると問題が発生します。
単体テスト用に 2 つのカテゴリを定義しました。SlowTest
実行に非常に時間がかかる単体テストとWindowsTest
、Windows 環境内でのみ実行できる単体テストです。
pom.xml
プロジェクトのファイルで次のように定義された 2 つのプロファイルがあります。
<profiles>
<!-- Exclude any tests in `SlowTest` category when profile 'skipSlowTests' is specified. -->
<profile>
<id>skipSlowTests</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludedGroups>SlowTest.class</excludedGroups>
</configuration>
</plugin>
</plugins>
</build>
</profile>
<!-- Skip any tests in 'WindowsTest' category when not running on Windows. -->
<profile>
<id>skipWindowsTests</id>
<activation>
<os><family>!windows</family></os>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludedGroups>WindowsTest.class</excludedGroups>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
たとえば、テストを実行して遅いテストを除外したい場合は、 を実行できmvn -PskipSlowTests test
ます。また、Windows テストをスキップしたい場合は、Windows 以外の OS で実行できます (またはコマンド ラインでmvn test
明示的に指定します)。-PskipWindowsTests
ここでの問題は、skipSlowTests
とskipWindowsTests
プロファイルの両方がアクティブ化されている場合、Windows テストのみがスキップされることです。遅いテストは引き続き実行されます。maven が有効なpom.xml
ファイルを作成するときに、skipSlowTests
プロファイルを適用しmaven-surefire-plugin
、グループを除外するように構成しますSlowTest.class
。次に、skipWindowsTests
プロファイルが適用され、除外されたグループが上書きされますWindowsTest.class
。
私が本当に望んでいるのは、SlowTest.class,WindowsTest.class
両方のプロファイルがアクティブになったときに除外されたグループになることですが、これを行う方法がわかりません。
プロパティに値を追加することをmavenで確認できる方法はありません。
<properties>
<excludedGroups>IgnoreTest.class</excludedGroups>
</properties>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludedGroups>${excludedGroups}</excludedGroups>
</configuration>
</plugin>
<profile>
<id>skipSlowTests</id>
<property>
<excludedGroups>${excludedGroups},SlowTest.class</excludedGroups>
</property>
...
</profile>
<profile>
<i>skipWindowsTests</id>
<property>
<excludedGroups>${excludedGroups},WindowsTest.class</excludedGroups>
</property>
...
</profile>
pom.xml
プロパティに値を割り当てる際に再帰があるため、これは壊れていexcludedGroups
ます。
また、とのskipSlowTestsAndWindowsTests
両方がアクティブになっているときにアクティブになる 3 番目のプロファイル (例: )を設定する方法はありません。skipSlowTests
skipWindowsTests
ここに何か提案はありますか?個別のフェーズmaven-surefire-plugin
(低速テスト用、Windows テスト用、その他すべてのテスト用) を追加し、プロファイルを使用して実行するフェーズを決定する可能性がありますか?
編集#1
maven-surefire-plugin
次のように、個別の実行フェーズを作成してみました。
<!-- By default, do not skip slow tests or windows tests -->
<properties>
<skipSlowTests>false</skipSlowTests>
<skipWindowsTests>false</skipWindowsTests>
</properties>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<!-- Default execution will skip SlowTest and WindowsTest categories -->
<execution>
<id>default-test</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<excludedGroups>SlowTest,WindowsTest</excludedGroups>
</configuration>
</execution>
<!-- Slow Test execution will run the slow tests only (if not skipped) -->
<execution>
<id>slow-test</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<skip>${skipSlowTests}</skip>
<groups>SlowTest</groups>
</configuration>
</execution>
<!-- Windows Test execution will run the windows tests only (if not skipped) -->
<execution>
<id>windows-test</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<skip>${skipWindowsTests}</skip>
<groups>WindowsTest</groups>
</configuration>
</execution>
</executions>
</plugin>
<profiles>
<!-- Skip slow tests when skipSlowTests profile enabled -->
<profile>
<id>skipSlowTests</id>
<properties>
<skipSlowTests>true</skipSlowTests>
</properties>
</profile>
<!-- Skip windows tests when skipWindowsTests profile enabled -->
<profile>
<id>skipWindowsTests</id>
<properties>
<skipWindowsTests>true</skipWindowsTests>
</properties>
...
</profile>
</profiles>
この構成では、3 つの個別の実行でテストが実行されます。default-test
実行では、低速テストと Windows テストを除くすべてのテストが実行されます。slow-test
実行では遅いテストのみが実行されます。windows-test
実行すると、Windows テストのみが実行されます。skipSlowTests
プロファイルとプロファイルの両方skipWindowsTests
が有効になっている場合、スロー テストと Windows テストの両方がスキップされます。
ここでの問題は、カテゴリSlowTest
とWindowsTest
カテゴリの両方でマークされたテストがある場合です。
@Test @Category({SlowTest.class,WindowsTest.class})
public void slowWindowsTestCase() { ... }
skipSlowTests
プロファイルのみが有効になっている場合、実行windows-test
は引き続き実行されます。slowWindowsTestCase
メソッドは Windows テストとしてマークされているため、遅いテストをスキップしたい場合でも実行されます。skipWindowsTests
同様に、このテスト ケースは、プロファイルのみが有効な場合にも実行されます。このテスト ケースをスキップする唯一の方法は、skipSlowTests
とskipWindowsTests
プロファイルの両方を指定することです。
次のように実行を変更してみました。
<execution>
<id>slow-test</id>
...
<groups>SlowTest</groups>
<excludedGroups>WindowsTest</excludedGroups>
...
</execution>
<execution>
<id>windows-test</id>
...
<groups>WindowsTest</groups>
<excludedGroups>SlowTest</excludedGroups>
...
</execution>
しかし今、slowWindowsTestCase
メソッドは決して実行されません。
編集#2
また、テストを正しく実行できたとしても、依存関係を追加して、テスト中におよびインターフェイスをロードできるようmaven-surefire-plugin
にする必要があります。親 POMのセクションを挿入しましたが、このプラグインに対して定義された依存関係はスコープを持つことができません。その結果、およびインターフェイスを定義するモジュールの外部でテストを実行しても機能しません。プロファイルにプラグインのスコープ依存関係を追加できますが、アクティブなプロファイルがない場合はカバーされません。SlowTest
WindowsTest
maven-surefire-plugin
pluginManagement
test
SlowTest
WindowsTest
test