【问题标题】:How to Skip All Integration Tests (-DskipITs) and One Unit Test mvn Command Line如何跳过所有集成测试 (-DskipITs) 和一个单元测试 mvn 命令行
【发布时间】:2019-07-09 20:54:35
【问题描述】:

我对 Maven 比较陌生。我对这个话题做了很多研究和挖掘,但我似乎找不到答案,所以我想我会在这里问。

目标:我想运行mvn clean install test,同时跳过集成测试以及一个特定的单元测试类。

我尝试了以下方法:

mvn clean install -DskipITs -Dtest=!MyTestClass test

mvn clean install -DskipITs&&test=!MyTestClass test

mvn clean install -DskipITs&test=!MyTestClass test

但是,上述命令似乎都不起作用。以上三个命令中的第一个命令对我来说最有意义,但似乎在使用该命令时正在运行集成测试。这就是我对 Maven 的知识和理解存在差距的地方;我不确定这是否是预期的行为,或者这是否是在命令行上传递多个属性的适当方式?

当我运行这个命令时:mvn clean install -DskipITs test,集成测试被成功跳过。

我熟悉 Maven 构建生命周期,但我可能会误解某些内容或遗漏某个细节。

【问题讨论】:

  • 我相信这个答案可能会对你有所帮助:stackoverflow.com/questions/9123075/…
  • 您已经知道如何跳过 IT。对于单元测试,您是否可以选择使用@Ignore(假设为 JUnit)?
  • 根据您编写的运行内容:mvn clean install test 将运行多个重复的内容...您可以将其深入到mvn clean install,但通常不需要install。所以你可以这样做mvn clean verify...另请参阅有关 maven 生命周期的文档:maven.apache.org/guides/introduction/…

标签: java maven unit-testing command-line integration-testing


【解决方案1】:

与 maven 的集成测试通常使用 maven-failsafe-plugin 运行

要告诉这个插件跳过集成测试(确保你的集成测试类名遵循约定 *IT.java,否则你需要用<inclusions> 包含它们),你可以在插件的配置中这样做,或者从命令行(official doc):

mvn test -DskipITs

可以跳过单个测试:

mvn test -Dtest=!MyTestClass

所以这应该有效:

mvn clean install -DskipITs -Dtest=!MyTestClass

【讨论】:

  • 您已经写道,您在 Maven 中的集成测试是使用 maven-surefire-plugin 运行的,这是完全错误的。 Maven Failsafe Plugin 旨在运行集成测试...与您的链接指向 maven-failsafe-plugin 相矛盾,所以我想您的答案中有一个类型...(第一句话)。
  • 是的,谢谢,你是对的 - 这是一个从思想到文本的错误
  • 这个答案准确地暗示了 OP 列为“不工作”的命令。
【解决方案2】:

对我有用的是以下命令:

mvn clean install -DskipITs "-Dtest=!MyTestClass, !**/*IT.java" test

我仍在学习 Java,但这是我认为在我的案例中发生的事情。

有两个与 Java 测试有关的插件(可能还有更多,但这两个与我的问题有关):一个称为“maven-failsafe-plugin”,另一个是“maven-surefire-plugin” ”。正如@hovanessyan 和其他人所指出的,maven-failsafe-plugin 通常运行集成测试,而 maven-surefire-plugin 通常运行单元测试 (Maven docs reference)。

在我的例子中,当我运行命令 mvn clean install -DskipITs -Dtest=!MyTestClass test 时,在进一步挖掘日志时,集成测试将失败,并且我会收到以下额外的隐藏错误消息:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.21.0:test (default-test)

项目的集成测试位于名为integrationtests 的目录中,并根据约定“MyIntegrationTestIT.java”命名。最终让我走上正轨的是:Surefire docs。这些文档描述了您可以使用 Maven 命令传递的“测试”参数。

在我看来,当我传递参数 -Dtest=!MyTestClass 时,就好像它指示 Surefire 插件“不要运行 MyTestClass,但要运行所有其他测试文件。”同时,-DskipITs 参数指示 Failsafe 插件跳过集成测试(它一直在做)。当我以"-Dtest=!MyTestClass, !**/*IT.java" 的形式明确调用我不想 运行的测试文件时,Surefire 完全明白我想要做什么。 Surefire 插件运行除了 MyTestClass 和集成测试之外的所有测试,而 Failsafe 插件跳过了集成测试。

我不完全理解为什么就我而言,Surefire 插件首先运行集成测试。也许它与我正在使用的代码库中的一些配置设置有关,或者与集成测试文件的命名约定或一些注释有关(我仍在学习很多关于这些东西的知识)。我确信可以编辑此答案以包含我还没有的更多有用信息或上下文。无论如何,希望这些学习对遇到此问题的其他人有所帮助。

最后,在调试时运行命令 mvn help:effective-pom 并将 -X 与我的 mvn clean install test 命令一起传递给了很多帮助。

【讨论】:

    【解决方案3】:

    此配置适用于我:

    <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
          <excludes>
             <exclude>%regex[.*TestIT.*.class]</exclude>
          </excludes>
       </configuration>
    </plugin>
    <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-failsafe-plugin</artifactId>
       <configuration>
          <includes>
             <include>%regex[.*TestIT.*.class]</include>
          </includes>            
       </configuration>
       <executions>
          <execution>
             <phase>test</phase>
             <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
             </goals>
          </execution>            
       </executions>
    </plugin>
    

    【讨论】:

      猜你喜欢
      • 2015-07-19
      • 1970-01-01
      • 2012-08-21
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多