当前位置: 首页 > 知识库问答 >
问题:

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

屠泰平
2023-03-14

我有一个多模块maven项目,在同一个文件夹(src/test/java)中包含集成和单元测试。集成测试标记为@类别(IntegrationTest.class)。我想以以下设置结束:

  1. 如果我运行mvn安装,我希望所有测试都能编译,但我不想执行任何测试

重要的一点是,我希望在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>

我试着使用

在几个小时的谷歌搜索和尝试不同的组合后,我犹豫是否有可能不在mvn安装中运行测试,同时在mvn测试中运行它们。我希望有人能证明这是错的

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


共有3个答案

滕渝
2023-03-14

OP在他的问题中说:

如果我运行mvn安装,我想编译所有测试,但我不想执行任何测试
如果我运行mvn测试,我希望编译所有测试,但只执行单元测试
如果我运行mvn集成测试,我想编译并执行所有测试。

非常有效,而且非常容易实现
编辑:除了第一个条件,它违背了maven的本性。这里最好的方法就是简单地执行mvn安装-DskipTests

您只需要在pom中跟踪代码片段。xml

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.17</version>
    <executions>
        <execution>
            <id>integration-tests</id>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
</plugin>

并坚持单元和集成测试的maven命名约定(如@khmarbaise所述)。因此,通常将集成测试命名为IT后缀(例如MyIntegrationTestIT.java),并让maven failsafe完成它的工作
这样,您甚至不需要JUnit类别(尽管有时它们非常有用)。

就这样:)

  • mvn test只执行单元测试
  • mvn集成测试执行所有测试
  • mvn故障安全:集成测试仅运行集成测试
  • mvn清洁验证当您想确定时,整个项目只是工作

将集成测试与单元测试分开,可以让您轻松地在IDE中运行某个包中的所有测试。通常使用名为test integration(或integrationtest)的附加目录来实现此目的
使用maven也很容易做到这一点:

<plugin>
    <!-- adding second test source directory (just for integration tests) -->
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.9.1</version>
    <executions>
        <execution>
            <id>add-integration-test-source</id>
            <phase>generate-test-sources</phase>
            <goals>
                <goal>add-test-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>src/test-integration/java</source>
                </sources>
            </configuration>
        </execution>
    </executions>
</plugin>

然后将集成测试移动到该目录。它应该是这样的:

src
   main
   test
   test-integration

集成测试通常需要更多内存:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    ...
    <configuration>
        <argLine>-Xmx512m -XX:MaxPermSize=256m</argLine>
    </configuration>
</plugin>
蒯硕
2023-03-14

根据故障安全插件留档

mvn install -DskipITs

这就是你想要的。

连鸿
2023-03-14

听起来你不理解Maven中构建生命周期的概念。如果运行mvn安装所有生命周期阶段(包括安装阶段本身)都在安装阶段之前运行。这意味着运行以下阶段:

  1. 验证

也就是说,包括测试以及集成测试生命周期阶段。因此,如果没有任何补充信息,就不可能随心所欲地改变行为。

可以通过在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安装,我希望所有测试都能编译,但我不想执行任何测试

可通过以下方法实现:

mvn -Pno-unit-test test

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

mvn test

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

这意味着运行默认值,其中包括运行test阶段,该阶段将运行单元测试(maven-surefire-plugin),此外还运行由maven-故障安全插件处理的联调。但是您应该知道,如果您想调用集成测试,您应该使用以下命令:

mvn verify

相反,因为您错过了上一次调用中的后集成测试阶段。

除上述内容外,您还应遵循单元测试和集成测试的命名约定,单元测试的命名应如下所示:

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

集成测试的名称应如下所示:

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

我希望您已经按照以下方式配置了maven failsafe插件,这是将maven failsafe插件绑定到正确生命周期阶段所需的:

<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)有效,而不是对编译名(.class)有效。我不会使用类别注释,只是简单地使用命名约定会使pom更简单、更短。

 类似资料:
  • 我目前正在为Hibernate项目Hibernate Search构建一个新包,我需要使用Arquillian在托管的WildFly容器中运行一些单元测试。当我使用命令时,我得到了以下错误: org.jboss.arquillian.container.spi.配置异常:jbossHome'${project.build.directory}/node1/wilfly-${org.wildfly}

  • 我已经使用selenium创建了测试用例,之前我可以使用maven(从命令行和eclipse)执行我的测试用例。但是现在它不起作用了。请帮助 请在下面找到控制台日志:(运行为- 我没有得到任何错误,它成功地构建了一个项目。但是跳过所有测试用例 请找到我的pom。xml配置如下: 请找到E2E。xml如下:

  • 我正在使用Maven 2.2.1,为了构建我的项目,我使用了以下命令 但是,构建失败了,说它找不到一个工件。然而,当我使用: 一切正常。 到目前为止,我一直认为这两个命令是等效的。然而,这个链接似乎表明,Dmaven。测验skip=true也会跳过编译测试用例。 然而,这仍然不能向我解释为什么一个命令有效,而另一个命令无效。如果有人能向我解释这一点,我将不胜感激。

  • 问题内容: 我正在尝试打包我的项目。但是,它会自动运行以前执行打包的测试。测试将一些内容插入数据库。这不是我想要的,我需要避免在打包应用程序时运行测试。有人知道如何在没有测试的情况下运行软件包吗? 问题答案: 与运行Maven

  • 我有3个maven项目。项目1,项目2 为此,我在项目2 pom.xml文件中添加了这个 我的pom。Project3的xml是- 在项目3中,我添加了testng。xml文件来运行测试。现在如果我运行这个测试。xml文件,那么我所有的测试用例都成功运行了。如果我尝试使用maven测试运行测试用例,那么它会失败。 我已经在下面的pom文件中包含了testng.xml文件,以便使用maven运行te

  • 以下命令不运行我的任何测试: 而普通的旧确实如此。 我在测试中添加了这些注释: 我在这里或这里的插件文档页面上都没有看到任何相关信息