【问题标题】:Maven surefire configuration for separating test into unit and integration tests fail用于将测试分成单元和集成测试的 Maven 肯定配置失败
【发布时间】:2015-09-07 14:30:04
【问题描述】:

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

如何配置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>

【问题讨论】:

    标签: java maven-surefire-plugin


    【解决方案1】:

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

    • 首先,只包含**/CoreUnitTests.java
    • 但除此之外,排除 **/Test*.java**/Test.java**/*Test*.java - 排除列表涵盖 CoreUnitTests.java,因此不会执行任何操作

    integration-test 执行也是如此。

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-01-23
      • 2013-03-18
      • 2012-01-01
      • 1970-01-01
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      • 2011-03-16
      相关资源
      最近更新 更多