如何在 Maven 安装目标中跳过测试,同时在 Maven 测试目标中运行测试?

2024-03-28

我有一个多模块 Maven 项目,集成和单元测试位于同一文件夹(src/test/java)中。集成测试标记为@Category(IntegrationTest.class)。我想最终得到以下设置:

  1. 如果我跑mvn install,我希望编译所有测试,但不想执行任何测试。
  2. 如果我跑mvn test,我希望编译所有测试,但仅执行单元测试。
  3. 如果我跑mvn integration-test,我想编译并执行所有测试。

重要的一点是,我想在pom.xml没有任何额外的命令行参数。

目前,我在父 pom.xml 中提出了以下设置,其中唯一的问题是#1,所有测试都在其中执行:

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${project.java.version}</source>
                    <target>${project.java.version}</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.14.1</version>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.maven.surefire</groupId>
                        <artifactId>surefire-junit47</artifactId>
                        <version>2.14.1</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <includes>
                        <include>**/*.class</include>
                    </includes>
                    <excludedGroups>cz.cuni.xrg.intlib.commons.IntegrationTest</excludedGroups>
                </configuration>
            </plugin>

            <plugin>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.14.1</version>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.maven.surefire</groupId>
                        <artifactId>surefire-junit47</artifactId>
                        <version>2.14.1</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <groups>cz.cuni.xrg.intlib.commons.IntegrationTest</groups>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                        <configuration>
                            <includes>
                                <include>**/*.class</include>
                            </includes>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

所有子模块的 pom.xml 中都有以下插件配置,我相信它应该从父 pom 继承:

<build> 
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
        </plugin>

        <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
        </plugin>
    </plugins>
</build>

我尝试使用<skipTests>true</skipTests>,但它禁用了所有目标的测试执行,这不是我想要的(违反#2和#3)。这也很奇怪,那就是mvn test荣誉skipTests=true选项...我为什么要首先运行它?

经过几个小时的谷歌搜索并尝试不同的组合后,我犹豫是否有可能不运行测试mvn install,同时运行它们mvn test。我希望有人能证明这是错误的。 ;)

我也愿意接受一个解决方案,其中mvn install只会执行单元测试,但我认为这没有多大区别。


看来你没理解这个概念构建生命周期 http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html在马文中。如果你跑mvn install所有生命周期阶段(包括install阶段本身)在安装阶段之前运行。这意味着运行以下阶段:

  1. validate
  2. 初始化
  3. 生成源
  4. 过程源
  5. 生成资源
  6. 流程资源
  7. compile
  8. 过程类
  9. 生成测试源
  10. 过程测试源
  11. 生成测试资源
  12. 流程测试资源
  13. 测试编译
  14. 过程测试类
  15. test
  16. 准备包
  17. package
  18. 预集成测试
  19. 集成测试
  20. 集成后测试
  21. verify
  22. install

换句话说,这意味着testintegration-test包括生命周期阶段。因此,如果没有任何补充信息,就不可能按照您的意愿改变行为。

可以通过使用 Maven 中的配置文件来实现:

 <project>
  [...]
  <profiles>
    <profile>
      <id>no-unit-tests</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
              <skipTests>true</skipTests>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
  [...]
</project>

所以你的第一个要求:

  1. 如果我跑mvn install,我希望编译所有测试,但不想执行任何测试。

可以通过使用以下方法来实现:

mvn -Pno-unit-test test
  1. 如果我跑mvn test,我希望编译所有测试,但仅执行单元测试。

这可以通过使用简单的调用来简单地实现:

mvn test

导致集成测试阶段未运行(请参阅构建生命周期)。

  1. 如果我跑mvn integration-test,我想编译并执行所有测试。

这意味着运行默认值,其中包括运行test阶段将运行单元测试(maven-surefire-plugin),并进一步运行由 maven-failsafe-plugin 处理的集成测试。但您应该注意,如果您想调用集成测试,您应该使用以下命令:

mvn verify

相反,因为你错过了post-integration-test您上次通话的阶段。

除了上述内容之外,您还应该遵循单元和集成测试的命名约定,其中单元测试 http://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html应命名如下:

<includes>
 <include>**/*Test*.java</include>
 <include>**/*Test.java</include>
 <include>**/*TestCase.java</include>
</includes>

and 集成测试 http://maven.apache.org/surefire/maven-failsafe-plugin/integration-test-mojo.html#includes应命名如下:

<includes>
 <include>**/IT*.java</include>
 <include>**/*IT.java</include>
 <include>**/*ITCase.java</include>
</includes>

我希望您已经配置了如下所示的 maven-failsafe-plugin,这是将 maven-failsafe-plugin 绑定到正确的生命周期阶段所需的:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>2.15</version>
        <executions>
          <execution>
            <goals>
              <goal>integration-test</goal>
              <goal>verify</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

正如您所做的那样,但您应该意识到include标签适用于源代码(.java)而不是编译名称(。班级)。我不会使用 Category 注释,只是简单地使用命名约定使 pom 更简单、更短。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Maven 安装目标中跳过测试,同时在 Maven 测试目标中运行测试? 的相关文章

随机推荐