Java Maven surefire将测试分离为单元测试和集成测试的配置失败

Java Maven surefire将测试分离为单元测试和集成测试的配置失败,java,maven-surefire-plugin,Java,Maven Surefire Plugin,我有一个包含单元和集成测试的项目。 这些测试已经分为单元测试和集成测试,同时使用不同的类作为套件 如何配置surefire在“测试”阶段执行单元测试,在“集成测试”阶段执行集成测试 以下是我当前的配置: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</a

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

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

org.apache.maven.plugins
maven surefire插件
2.18.1
**/Test*.java
**/*Test.java
**/*Test*.java
单元测试
测试
测试
**/CoreUnitTests.java
集成测试
集成测试
测试
**/coreigrationtests.java
在这种配置下,不会执行任何测试,但如果我删除“排除”,所有测试都将在“测试”阶段执行,而不仅仅是单元测试


更新-解决方案

在亚当·米哈利克的解释下,我解决了这个问题。 我没有覆盖默认测试,而是跳过这些测试,因为对于我的单元测试,id“unittest”比“defaulttest”更好 以下是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>

org.apache.maven.plugins
maven surefire插件
2.18.1
默认测试
真的
单元测试
测试
测试
**/CoreUnitTests.java
集成测试
集成测试
测试
**/coreigrationtests.java

经验法则:
排除
覆盖
包括
。因此,以单元测试执行为例,您的配置告诉Surefire:

  • 首先,只包括
    **/CoreUnitTests.java
  • 但是从那以后,排除
    ***/Test*.java
    ***/Test.java
    ***Test*.java
    ——排除列表包括
    CoreUnitTests.java
    ,因此不执行任何操作
与集成测试类似执行

因此,要在
test
阶段仅运行
CoreUnitTests
,在
integration test
阶段仅运行
CoreIntegrationTests
,is应该足以像您那样配置
包含
,而不在任何地方定义任何
排除
。但是,这还不够好,因为正如您所观察到的,所有测试都是由名为
defaulttest
的默认Surefire执行运行的,在默认配置下,它会拾取所有后缀为
test
的类。要解决这个问题,您可以通过重新配置来关闭默认执行

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

默认测试
真的
或者将您的
单元测试
执行重命名为
默认测试
(这将节省几毫秒的构建时间,因为最终您将只调用两次Surefire,而不是三次跳过默认执行)