9

複数のプロファイルに基づいて単体テストの一部のカテゴリを除外するように 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

ここでの問題は、skipSlowTestsskipWindowsTestsプロファイルの両方がアクティブ化されている場合、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 番目のプロファイル (例: )を設定する方法はありません。skipSlowTestsskipWindowsTests

ここに何か提案はありますか?個別のフェーズ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 テストの両方がスキップされます。

ここでの問題は、カテゴリSlowTestWindowsTestカテゴリの両方でマークされたテストがある場合です。

@Test @Category({SlowTest.class,WindowsTest.class})
public void slowWindowsTestCase() { ... }

skipSlowTestsプロファイルのみが有効になっている場合、実行windows-testは引き続き実行されます。slowWindowsTestCaseメソッドは Windows テストとしてマークされているため、遅いテストをスキップしたい場合でも実行されます。skipWindowsTests同様に、このテスト ケースは、プロファイルのみが有効な場合にも実行されます。このテスト ケースをスキップする唯一の方法は、skipSlowTestsskipWindowsTestsプロファイルの両方を指定することです。

次のように実行を変更してみました。

    <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のセクションを挿入しましたが、このプラグインに対して定義された依存関係はスコープを持つことができません。その結果、およびインターフェイスを定義するモジュールの外部でテストを実行しても機能しません。プロファイルにプラグインのスコープ依存関係を追加できますが、アクティブなプロファイルがない場合はカバーされません。SlowTestWindowsTestmaven-surefire-pluginpluginManagementtestSlowTestWindowsTesttest

4

2 に答える 2

1

デフォルトのプロファイルですべてのグループを除外することができ、プロファイルごとに、1 つのグループのみを含む failsafe/surefire プラグインの実行を 1 つ追加します。

于 2015-08-10T18:34:03.773 に答える