maven:如何通过命令行选项跳过某些项目中的测试?
Posted
技术标签:
【中文标题】maven:如何通过命令行选项跳过某些项目中的测试?【英文标题】:maven: How can I skip test in some projects via command line options? 【发布时间】:2012-02-25 17:48:10 【问题描述】:在我的 Maven 项目中,我有许多模块。是否可以通过命令行选项关闭某些模块的运行单元测试?
我的项目运行所有单元测试大约需要 15 分钟。我想通过仅在我正在处理的模块中运行单元测试来加快整体构建速度。我不想进入并编辑每个单独的 pom.xml 来实现这一点。
我已经尝试过这里列出的解决方案:Can I run a specific testng test group via maven? 但是结果是我想跳过的模块中有很多测试失败。我想“组”不是模块的同一个概念?
【问题讨论】:
Skipping tests in some modules in Maven的可能重复 maven 开发人员希望您使用 pom.xml 而不是命令行选项,这很烦人。并且 95% 的 Stack Overflow 答案不断提供 pom.xml 解决方案。 mvn clean install -DskipTests 【参考方案1】:找到了一种在命令行中排除的方法:
# Exclude one test class, by using the explanation mark (!)
mvn test -Dtest=!LegacyTest
# Exclude one test method
mvn verify -Dtest=!LegacyTest#testFoo
# Exclude two test methods
mvn verify -Dtest=!LegacyTest#testFoo+testBar
# Exclude a package with a wildcard (*)
mvn test -Dtest=!com.mycompany.app.Legacy*
来自:https://blog.jdriven.com/2017/10/run-one-or-exclude-one-test-with-maven/
【讨论】:
@Arjun,哪个?我当时使用了其中一些,不确定我是否尝试了所有方法。 # 排除一个测试类,使用解释标记 (!) mvn test -Dtest=!LegacyTest @Arjun,IIRC 我使用了“排除一种测试方法”。但请告诉你什么对你有用,什么没用。对其他用户很有用。 [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ ot_osefalf_automation_test --- [INFO] ------------ -------------------------------------------------- ---------- [INFO] 构建失败 [INFO] - [INFO] ---------------------------- -------------------------------------------- [错误] 执行失败项目 ot_osefalf_automation_test 上的目标 org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test (default-test):未执行任何测试! (设置 -DfailIfNoTests=false 以忽略此错误。)-> [帮助 1] 从命令行使用 \! mvn test -Dtest=\!LegacyTest【参考方案2】:要打开和关闭整个项目的单元测试,请使用Maven Surefire Plugin's capability of skipping tests。从命令行使用 skipTests 有一个缺点。在多模块构建场景中,这将禁用所有模块的所有测试。
如果您需要更精细地控制为模块运行子集测试,请考虑使用Maven Surefire Plugin's test inclusion and exclusion capabilities。
要允许命令行覆盖,请在配置 Surefire 插件时使用 POM 属性。以下面的 POM 段为例:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.9</version>
<configuration>
<excludes>
<exclude>$someModule.test.excludes</exclude>
</excludes>
<includes>
<include>$someModule.test.includes</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<someModule.skip.tests>false</someModule.skip.tests>
<skipTests>$someModule.skip.tests</skipTests>
<someModule.test.includes>**/*Test.java</someModule.test.includes>
<someModule.test.excludes>**/*Test.java.bogus</someModule.test.excludes>
</properties>
使用上述 POM,您可以通过多种方式执行测试。
-
运行所有测试(以上配置包括所有**/*Test.java测试源文件)
mvn test
-
跳过所有模块的所有测试
mvn -DskipTests=true test
-
跳过特定模块的所有测试
mvn -DsomeModule.skip.tests=true test
-
仅为特定模块运行某些测试(此示例包括所有 **/*IncludeTest.java 测试源文件)
mvn -DsomeModule.test.includes="**/*IncludeTest.java" test
-
排除特定模块的某些测试(此示例排除所有 **/*ExcludeTest.java 源文件)
mvn -DsomeModule.test.excludes="**/*ExcludeTest.java" test
【讨论】:
我认为您在ExcludeTest.java
之后缺少双引号
@Sridhar-Sarnobat 谢谢。答案已更新。
<skipTests>$module.skip.tests</skipTests>
应该是 <skipTests>$someModule.skip.tests</skipTests>
吗?【参考方案3】:
...如果您想将参数传递给 Hudson/Jenkins 中的 maven 发布插件,您必须使用
-Darguments=-DskipTests
让它工作。
【讨论】:
【参考方案4】:如果你想使用 Maven 配置文件:
http://maven.apache.org/guides/introduction/introduction-to-profiles.html你可能想让它做这样的事情:
Skipping tests in some modules in Maven我不知道是否有支持的命令行选项可以做到这一点。
您也可以尝试直接使用环境属性,根据此文档页面:
http://maven.apache.org/plugins/maven-surefire-plugin/examples/skipping-test.html即类似:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12</version>
<configuration>
<skipTests>$moduleA.skipTests</skipTests>
</configuration>
</plugin>
然后使用mvn -DmoduleA.skipTests=false test
测试那个模块。
【讨论】:
以上是关于maven:如何通过命令行选项跳过某些项目中的测试?的主要内容,如果未能解决你的问题,请参考以下文章