如何让maven跳过某些指定的Test用例?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让maven跳过某些指定的Test用例?相关的知识,希望对你有一定的参考价值。
maven打包的时候,会默认取执行Test用例,当然也可以忽略错误的,也可以直接跳过。
现在需求是这样的,能不能指定忽略某些测试用例?
比如我有一类测试用例,是用来测试Http接口的,这些接口如果测我本地的就是url就是localhost:8080,/..../ 而这种我肯定是不想让maven来执行这些用例的,因为你要是本机没起服务,那这个测试用例就得等到timeOut才会执行完。一般都是运维得打包。那肯定这个url的服务是访问不到的
但又不是全部测试用例不执行,比如某些工具类的方法,我们也是有些测试用例的,这些测试用例肯定是需要保证能执行通过的。
所以,有没有什么办法,告诉maven,哪些Test用例不用执行,哪些需要执行。而不是全部忽略,或者全部执行
<maven.test.skip>true</maven.test.skip>
<maven.test.failure.ignore>true</maven.test.failure.ignore>
</properties>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>$maven.test.skip</skip>
<testFailureIgnore>$maven.test.failure.ignore</testFailureIgnore>
</configuration>
</plugin>追问
这个好像没指定忽略哪个啊
参考技术A 测试插件详细说明http://maven.apache.org/surefire/maven-surefire-plugin/和http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html(实例):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.17</version>
<configuration>
<includes>
<include>**/TestMe.java</include>
<include>**/TestYou.java</include>
</includes>
<excludes>
<exclude>**/TestOne.java</exclude>
<exclude>**/TestTwo.java</exclude>
</excludes>
</configuration>
</plugin>追问
这个是什么意思 能大概说一下吗?
他这个好像是忽略整个类啊
是包含要测试的类, 是排除测试类,这个是执行或忽略整个指定类的测试用例,你是想忽略测试类里面的某一个测试方法?
本回答被提问者和网友采纳maven:如何通过命令行选项跳过某些项目中的测试?
【中文标题】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跳过某些指定的Test用例?的主要内容,如果未能解决你的问题,请参考以下文章
maven跳过单元测试-maven.test.skip和skipTests的区别以及部分常用命令