java - 用于将测试分离为单元和集成测试失败的 Maven Surefire 配置

标签 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“单元测试”比“默认测试”更好 这是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>

最佳答案

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

  • 首先,只包含**/CoreUnitTests.java
  • 但从中排除 **/Test*.java**/Test.java**/*Test*.java code> - 该排除列表涵盖了 CoreUnitTests.java,因此不会执行任何操作

integration-test执行类似。

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

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

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

关于java - 用于将测试分离为单元和集成测试失败的 Maven Surefire 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32441041/

相关文章:

c# - 如何使用 C# 从 java web 服务显示 mysql 数据库

java - Tomcat服务器远程重新部署

java - 使用Java登录后解析HTML源

java - maven Surefire 插件找不到支持类

java - JUnit 测试 "Times Out"尽管执行速度很快?

java - 如何在 Maven 中按类别运行 JUnit 测试?

maven - 如何使用 mvn site 命令生成集成测试报告

加载jar文件时找不到Java类

c# - 是否可以让非泛型方法返回泛型类型?

Jenkins 发布 TestNG 结果不起作用