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