如何跳过所有集成测试(-DskipIT)和一个单元测试mvn命令行

时间:2019-02-15 17:05:59

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

我对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构建生命周期,但是我可能会误解某些东西或缺少细节。

3 个答案:

答案 0 :(得分:1)

与maven的集成测试通常是通过maven-failsafe-plugin运行的

要告诉该插件跳过集成测试(请确保您的集成测试类名称遵循* IT.java约定,否则您需要在<inclusions>中包括它们),可以在插件的配置中执行此操作,或通过命令行(official doc):

mvn test -DskipITs

可以通过以下方法跳过单个测试:

mvn test -Dtest=!MyTestClass

所以这应该起作用:

mvn clean install -DskipITs -Dtest=!MyTestClass

答案 1 :(得分:0)

对我有用的是以下命令:

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时,它很有帮助。

答案 2 :(得分:0)

此配置对我有用:

<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>