Maven-surefire-plugin включает/исключает приоритет

При использовании плагина maven-surefire, и оба включают и исключают, в каком порядке они обрабатываются? Кроме того, если у вас есть 3 набора тестов, первый из которых является базовым, второй и третий - особыми случаями, можете ли вы использовать профили для дальнейшего включения/исключения? Как объединить профили include/exclude? Например, я хотел бы сделать что-то вроде этого:

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.12.2</version>
        <configuration>
          <excludes>
            <exclude>/org/mycompany/dataset/test/ExtractProd*.java</exclude> <!-- requires special network connectivity -->
            <exclude>/org/mycompany/dataset/test/LargeDataset*.java</exclude> <!-- requires lengthy processing -->
          </excludes>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <profiles>
    <profile>
      <id>connectedToProdNetwork</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
              <includes>
                <include>/org/mycompany/dataset/test/ExtractProd*.java</include>
              </includes>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>runForAsLongAsYouNeed</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
              <includes>
                <include>/org/mycompany/dataset/test/LargeDataset*.java</include>
              </includes>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>

И затем будьте в состоянии работать следующим образом:

mvn package -P connectedToProdNetwork

или

mvn package -P runForAsLongAsYouNeed

или

mvn package -P connectedToProdNetwork,runForAsLongAsYouNeed

---- UPDATE -----

Используя mvn help:effective-pom -P [profileA], я смог определить, что если я укажу один профиль, результирующий эффективный pom будет:

        <configuration>
          <includes>
            <include>[includeFromProfileA]</include>
          </includes>
          <excludes>
            <exclude>/org/mycompany/dataset/test/ExtractProd*.java</exclude> <!-- requires special network connectivity -->
            <exclude>/org/mycompany/dataset/test/LargeDataset*.java</exclude> <!-- requires lengthy processing -->
          </excludes>
        </configuration>

И если я поставлю несколько профилей, mvn help:effective-pom -P [profileA],[profileB]:

        <configuration>
          <includes>
            <include>[includeFromProfileAOrBSeeminglyArbitraryChoice]</include>
          </includes>
          <excludes>
            <exclude>/org/mycompany/dataset/test/ExtractProd*.java</exclude> <!-- requires special network connectivity -->
            <exclude>/org/mycompany/dataset/test/LargeDataset*.java</exclude> <!-- requires lengthy processing -->
          </excludes>
        </configuration>

И, наконец, если я добавлю атрибут combine.children="append" в элемент <includes> конфигураций профиля и поставлю оба профиля, mvn help:effective-pom -P [profileA],[profileB]:

        <configuration>
          <includes combine.children="append">
            <include>[includeFromProfileA]</include>
            <include>[includeFromProfileB]</include>
          </includes>
          <excludes>
            <exclude>/org/mycompany/dataset/test/ExtractProd*.java</exclude> <!-- requires special network connectivity -->
            <exclude>/org/mycompany/dataset/test/LargeDataset*.java</exclude> <!-- requires lengthy processing -->
          </excludes>
        </configuration>

Однако теперь, когда каждый файл указан как <include> и <exclude>, что происходит?

---- UPDATE 2 ----

На самом деле выполняется сборка с этой конфигурацией:

<configuration>
  <includes>
    <include>**/TestA.java</include>
  </includes>
  <excludes>
    <exclude>**/TestA.java</exclude>
  </excludes>
</configuration>

Выполняет ли NOT тестовый тест, поэтому он выглядит как <exclude> будет превышать <include>. Обратите внимание, что для полноты я отклонил порядок и положил <excludes> до <includes>, но поведение не изменилось. Если кто-то может найти что-то рядом с исходным кодом, где это поведение указано, я был бы рад дать им ответ...

Ответы

Ответ 1

Я не смог найти официальную документацию о плагине surefire, но действительно исключение-override-include является общим подходом и также применяется Maven в других подобных контекстах, например, для ресурсов.

Единственная официальная информация, связанная со мной (я нашел), получена из официальной справочной документации Maven POM, здесь:

включает: набор шаблонов файлов, которые определяют файлы для включения в качестве ресурсов в указанном каталоге, используя * в качестве подстановочного знака.

исключает: та же структура, что и include, но указывает, какие файлы игнорировать. В конфликтах между include и exclude исключить выигрыши.

ПРИМЕЧАНИЕ. Я добавил последнее полужирное форматирование в интересном заявлении.

Таким образом, более чем один и тот же подход используется в официальных плагинах maven (в общем, все плагины, имеющие org.apache.maven.plugins groupId и maven-префикс как artifactId).

Ответ 2

Вы пытались использовать категории JUnit?

http://www.agile-engineering.net/2012/04/unit-and-integration-tests-with-maven.html

Используя этот подход, вы можете дать тесты нескольким различным категориям и исключить/включить их, используя это, а не имя класса. Это будет более расширяемый подход.