用于将测试分成单元和集成测试的Maven surefire配置失败

时间:2015-09-07 14:30:05

标签: java maven-surefire-plugin

我有一个包含单元和集成测试的项目。 这些测试已经分为单元和集成测试,同时使用不同的类作为套件。

如何在阶段“集成测试”期间配置surefire以在阶段“测试”和集成测试期间执行单元测试。

这是我目前的配置:

<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>

使用此配置不会执行任何测试但如果我删除“排除”,则所有测试都将在阶段“测试”中执行,而不仅仅是单元测试。

更新 - 解决方案

通过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>

1 个答案:

答案 0 :(得分:3)

经验法则:excludes覆盖includes。因此,以unit-test执行为例,您的配置告诉Surefire:

  • 首先,仅包含**/CoreUnitTests.java
  • 但是,从中排除**/Test*.java**/Test.java**/*Test*.java - 排除列表涵盖CoreUnitTests.java,因此不执行任何操作

同样适用于integration-test执行。

因此,在CoreUnitTests阶段运行test而在CoreIntegrationTests阶段integration-test运行,应该足以配置includes正如您所做,并且未在任何地方定义任何excludes。然而,这是不够好的,因为正如您所观察到的,所有测试都由名为default-test的默认Surefire执行运行,默认配置下,它会选取所有以Test为后缀的类。要解决此问题,您可以通过重新配置来关闭该默认执行

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

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