用于将测试分离为单元和集成测试的 Maven surefire 配置失败
Maven surefire configuration for separating test into unit and integration tests fail
我有一个包含单元和集成测试的项目。
这些测试已经分为单元测试和集成测试,同时使用不同的 class 作为套件。
如何配置 surefire 在 "test" 阶段执行单元测试并在 "integration-Test" 阶段执行集成测试。
这是我当前的配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<excludes>
<exclude>**/Test*.java</exclude>
<exclude>**/*Test.java</exclude>
<exclude>**/*Test*.java</exclude>
</excludes>
</configuration>
<executions>
<execution>
<id>unit-test</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<includes>
<include>**/CoreUnitTests.java</include>
</includes>
</configuration>
</execution>
<execution>
<id>integration-test</id>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<includes>
<include>**/CoreIntegrationTests.java</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
使用此配置不会执行任何测试,但如果我删除 "excludes",所有测试都会在 "test" 阶段执行,而不仅仅是单元测试。
更新-解决方案
在 Adam Michalik 的解释下,我解决了这个问题。
我没有覆盖默认测试,而是跳过了这些测试,因为 id "unit-test" 对于我的单元测试比 "default-test" 更好
这是 pom 的最终配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<executions>
<execution>
<id>default-test</id>
<configuration>
<skip>true</skip>
</configuration>
</execution>
<execution>
<id>unit-test</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<includes>
<include>**/CoreUnitTests.java</include>
</includes>
</configuration>
</execution>
<execution>
<id>integration-test</id>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<includes>
<include>**/CoreIntegrationTests.java</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
经验法则:excludes
覆盖 includes
。因此,以 unit-test
执行为例,您的配置告诉 Surefire:
- 首先,只包括
**/CoreUnitTests.java
- 但从中排除
**/Test*.java
、**/Test.java
和 **/*Test*.java
- 排除列表涵盖 CoreUnitTests.java
,因此不会执行任何操作
与 integration-test
执行类似。
所以,只有 运行 CoreUnitTests
在 test
阶段和 CoreIntegrationTests
在 integration-test
阶段,应该足以像您所做的那样配置 includes
,并且不要在任何地方定义任何 excludes
。然而,这还不够好,因为正如您所观察到的,所有测试都是 运行 默认的 Surefire 执行称为 default-test
,默认情况下,它会选择所有 类 后缀 Test
。要解决此问题,您可以通过重新配置来关闭该默认执行
<execution>
<id>default-test</id>
<configuration>
<skip>true</skip>
</configuration>
</execution>
或将您的 unit-test
执行重命名为 default-test
(这将节省几毫秒的构建时间,因为最后您只会调用 Surefire 两次,而不是三次只是为了跳过默认执行)。
我有一个包含单元和集成测试的项目。 这些测试已经分为单元测试和集成测试,同时使用不同的 class 作为套件。
如何配置 surefire 在 "test" 阶段执行单元测试并在 "integration-Test" 阶段执行集成测试。
这是我当前的配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<excludes>
<exclude>**/Test*.java</exclude>
<exclude>**/*Test.java</exclude>
<exclude>**/*Test*.java</exclude>
</excludes>
</configuration>
<executions>
<execution>
<id>unit-test</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<includes>
<include>**/CoreUnitTests.java</include>
</includes>
</configuration>
</execution>
<execution>
<id>integration-test</id>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<includes>
<include>**/CoreIntegrationTests.java</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
使用此配置不会执行任何测试,但如果我删除 "excludes",所有测试都会在 "test" 阶段执行,而不仅仅是单元测试。
更新-解决方案
在 Adam Michalik 的解释下,我解决了这个问题。 我没有覆盖默认测试,而是跳过了这些测试,因为 id "unit-test" 对于我的单元测试比 "default-test" 更好 这是 pom 的最终配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<executions>
<execution>
<id>default-test</id>
<configuration>
<skip>true</skip>
</configuration>
</execution>
<execution>
<id>unit-test</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<includes>
<include>**/CoreUnitTests.java</include>
</includes>
</configuration>
</execution>
<execution>
<id>integration-test</id>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<includes>
<include>**/CoreIntegrationTests.java</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
经验法则:excludes
覆盖 includes
。因此,以 unit-test
执行为例,您的配置告诉 Surefire:
- 首先,只包括
**/CoreUnitTests.java
- 但从中排除
**/Test*.java
、**/Test.java
和**/*Test*.java
- 排除列表涵盖CoreUnitTests.java
,因此不会执行任何操作
与 integration-test
执行类似。
所以,只有 运行 CoreUnitTests
在 test
阶段和 CoreIntegrationTests
在 integration-test
阶段,应该足以像您所做的那样配置 includes
,并且不要在任何地方定义任何 excludes
。然而,这还不够好,因为正如您所观察到的,所有测试都是 运行 默认的 Surefire 执行称为 default-test
,默认情况下,它会选择所有 类 后缀 Test
。要解决此问题,您可以通过重新配置来关闭该默认执行
<execution>
<id>default-test</id>
<configuration>
<skip>true</skip>
</configuration>
</execution>
或将您的 unit-test
执行重命名为 default-test
(这将节省几毫秒的构建时间,因为最后您只会调用 Surefire 两次,而不是三次只是为了跳过默认执行)。