【问题标题】:What does the "default-test" stand for in the maven-surefire pluginmaven-surefire 插件中的“default-test”代表什么
【发布时间】:2026-02-07 06:30:01
【问题描述】:

我已经在我的 pom 中定义了以下配置,以确保使用 TestNg:

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12</version>
            <configuration>
                <skipTests>${skip-all-tests}</skipTests>
            </configuration>
            <executions>
                <execution>
                    <id>unit-tests</id>
                    <phase>test</phase>
                    <goals>
                        <goal>test</goal>
                    </goals>
                    <configuration>
                        <skip>${skip-unit-tests}</skip>
                        <groups>unit</groups>

                        <excludedGroups>integration</excludedGroups>
                    </configuration>
                </execution>
                <execution>
                    <id>integration-tests</id>
                    <phase>integration-test</phase>
                    <goals>
                        <goal>test</goal>
                    </goals>
                    <configuration>
                        <skip>${skip-integration-tests}</skip>
                        <groups>integration</groups>
                        <excludedGroups>unit</excludedGroups>
                    </configuration>
                </execution>
            </executions>
        </plugin>

但似乎这两次执行之前总是有一个“默认测试”运行,它似乎运行每个 @test 注释方法(至少我是这么认为的)。

--- maven-surefire-plugin:2.12:test (default-test) @ my-project

例如在项目上运行“mvn test”,会执行两次测试。 “默认测试”和“单元测试”。

有人可以向我解释一下吗? 可以禁用或控制它(配置测试的内容和不测试的内容)吗?

【问题讨论】:

  • 通过 mvn help:effective-pom 查看生成的 pom。此外,最好将其定义为 pluginManagement,您应该通过 maven-failsafe-plugin 而不是通过 maven-surefire-plugin 运行集成测试。
  • 谢谢,这对我来说已经很清楚了!如果您将您的评论放在答案表格中,我将奖励您学分。

标签: maven-3 testng maven-surefire-plugin


【解决方案1】:

人们希望有一种方法来覆盖 Maven 中插件的默认内置执行。

Maven 3(或者它可能早在 2.1.0 或 2.2.0 中就已经引入)通过为包装生命周期添加到有效 pom 的每个插件执行定义一个默认执行 ID 来解决这个问题。

这个隐式 id 的名称始终是 default-_____ 我不记得它生成的确切规则。

因此,您可以通过定义匹配的执行来覆盖打包的注入执行。

为了解决您的问题,我会将&lt;id&gt;unit-tests&lt;/id&gt; 更改为&lt;id&gt;default-test&lt;/id&gt; 或 添加

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

两者都具有相同的效果,尽管&lt;id&gt;unit-tests&lt;/id&gt;&lt;id&gt;default-test&lt;/id&gt; 解决方案的性能会稍高一些,因为您只需要调用两次surefire 执行。

我要指出的另一件事是,使用 maven-failsafe-plugin 执行集成测试可能会更好,因为在某个时间点,您可能想要在集成测试前后做一些事情,而故障安全是专为该用例设计(尽管进一步向下切换应该是微不足道的)

【讨论】:

    【解决方案2】:

    作为斯蒂芬解决方案的替代方案,如果您不希望在日志中显示以下消息(实际上这有点误导,因为您没有跳过测试):

    [INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ service-template ---
    [INFO] Tests are skipped.
    

    ...那就往这边走吧:

                    <execution>
                        <id>default-test</id>
                        <phase>none</phase>
                    </execution>
    

    【讨论】:

      最近更新 更多