用于将测试分离为单元和集成测试的 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 执行类似。

所以,只有 运行 CoreUnitTeststest 阶段和 CoreIntegrationTestsintegration-test阶段,应该足以像您所做的那样配置 includes,并且不要在任何地方定义任何 excludes。然而,这还不够好,因为正如您所观察到的,所有测试都是 运行 默认的 Surefire 执行称为 default-test,默认情况下,它会选择所有 类 后缀 Test。要解决此问题,您可以通过重新配置来关闭该默认执行

<execution>
    <id>default-test</id>
    <configuration>
        <skip>true</skip>
    </configuration>
</execution>

或将您的 unit-test 执行重命名为 default-test(这将节省几毫秒的构建时间,因为最后您只会调用 Surefire 两次,而不是三次只是为了跳过默认执行)。