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