maven surefire plugin介绍
示例
<!-- 测试运行器,生成测试报告 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version><!--$NO-MVN-MAN-VER$ -->
<configuration>
<forkMode>always</forkMode>
<parallel>methods</parallel>
<threadCount>10</threadCount>
<includes>
<include>**/Test.java</include>
</includes>
<excludes>
<exclude>**/TestCase.java</exclude>
</excludes>
</configuration>
</plugin>
run:Maven Test
surefire plugin的作用
surefire 插件用来在maven构建生命周期的test phase执行一个应用的单元测试。它会产生两种不同形式的测试结果报告:
1).纯文本
2).xml文件格式的
默认情况下,这些文件生成在工程的${basedir}/target/surefire-reports,目录下(basedir指的是pom文件所在的目录)。它可以运行任何testNG,Junit,pojo写的单元测试
如何使用?
使用该插件很简单,使用mvn surefire:test或者mvn test都可以运行工程下的单元测试。
如何配置
依赖配置:
1).如果你是使用TestNG,那么可以按照这个配置:
在pom文件中引入testNG依赖:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>5.12.1</version>
<scope>test</scope>
</dependency>
不过如果你使用的版本过低(<= 5.11),就得这么配置了:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>5.8</version>
<scope>test</scope>
<classifier>jdk15</classifier>
</dependency>
很多人对classifier会有点陌生,事实上maven的包名是这样构成的<artifactId>-<version>-<classifier>.<packaging>
(这里仅仅是针对编译后的jar包,如果是sources或者javadoc,则会变成<artifactId>-<version>-<classifier>-<type>.<packaging>
,这里<type>可以替换成sources或者javadoc)。那么按照这个规则,testng在maven仓库里完整的包名就应该是:testng-5.8-jdk15.jarclassifier主要是用来区分不同环境或者不同jdk版本的。
2).如果你使用了Junit,那么引入这个依赖:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
2.插件配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.10</version>
<configuration>
<parallel>methods</parallel>
<threadCount>10</threadCount>
</configuration>
</plugin>
这是一个很简单的配置,事实上这个插件版本已经很老了,另外它只指定了一些基本参数。但是即使如此它已经可以让你在命令行下运行mvn test或者mvn surefire:test,这样它会扫描测试类目录下(src/test/java)的测试类,只要类名符合*Test.java,那么这个测试类就会被运行。
但是这个配置似乎不太令人满意,因为它实在是没什么可以扩展的,例如我想使用jmockit,我想启动多个线程运行单元测试,我想运行某些单元测试,某些单元测试我想排除掉,这些怎么做到呢?我们继续看吧。
3.高级配置首先给出良权限项目的配置。
parent pom.xml文件中添加插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<testNGArtifactName>com.alibaba.external:test.testng</testNGArtifactName>
<argLine>-javaagent:"${settings.localRepository}/com/alibaba/external/test.jmockit/0.999.10/test.jmockit-0.999.10.jar"</argLine>
<useSystemClassLoader>true</useSystemClassLoader>
<testFailureIgnore>true</testFailureIgnore>
<parallel>false</parallel>
<forkMode>once</forkMode>
<suiteXmlFiles>
<suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
(上面这段是本人推荐的配置)
我们观察下,多出的参数都是configuration下的。我们分别作出解释:
- testNGArtifactName这个参数指明了testng jar包所在的artifactId
- argLine 用来配置jvm参数,很明显我们可以推测出这是为启动一个新的jvm做准备的
- useSystemClassLoader 这个故名思意,不解释
- testFailureIgnore 这个决定是否忽略失败的单元测试继续跑其它的
关于forkMode需要特别解释下:
Maven运行测试用例时,是通过调用maven的surefire插件并fork一个子进程来执行用例的。forkmode属性中指明是要为每个测试创建一个进程,还是所有测试在同一个进程中完成。
forkMode 可设置值有 “never”, “once”, “always” 和 “pertest”。
- pretest: 每一个测试创建一个新进程,为每个测试创建新的JVM是单独测试的最彻底方式,但也是最慢的,不适合hudson上持续回归
- once:在一个进程中进行所有测试。once为默认设置,在Hudson上持续回归时建议使用默认设置。
- always:在一个进程中并行的运行脚本,Junit4.7以上版本才可以使用,surefire的版本要在2.6以上提供这个功能,其中 threadCount:执行时,指定可分配的线程数量。只和参数parallel配合使用有效。默认:5。
<forkMode>always</forkMode>
<parallel>methods</parallel>
<threadCount>4</threadCount>
suiteXmlFiles 这个参数的作用是决定单元测试运行的规则,这个规则在文件中指定。
我们使用了相对路径src/test/resources/testng.xml,那么这个文件应该在每个工程的该路径下,我们打开一个工程,例如permission应用的testng.xml,看下它配置了什么。
testng.xml文件的内容:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="plan-project-test">
<test name="plan-project-test">
<packages>
<package name="com.alibaba.lp.permission.dal.cache.test" />
<package name="com.alibaba.lp.permission.dal.impl.test" />
</packages>
</test>
</suite>
这个文件指定了运行哪个package下的单元测试,事实上配置哪些需要运行,哪些不需要运行还可以有很多方式和纬度。例如你可以指定跑哪些class:
<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="My test suite">
<test name="testing">
<classes>
<class name="TestNGTest1" />
<class name="TestNGTest2" />
</classes>
</test>
</suite>
你可以指定跑哪些group:
<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="My test suite">
<test name="testing">
<groups>
<run>
<include name="method1"/>
</run>
</groups>
<classes>
<class name="TestNGTest5_2_0" />
</classes>
</test>
</suite>
关于suite的东西,有兴趣的同学可以google suite查看相应的配置。
到这儿就完美了么?
当然不是,有个很大的问题,我们的插件是配置在parent pom.xml里的,这意味着每个子工程都继承这段配置,因此都需要在相应的目录下配置一个testng.xml文件。那么如果我不想对某些工程运行单元测试,又不想配置这个文件怎么办呢?
方法1,在configuration添加属性:
<configuration>
<skipTests>true</skipTests>
</configuration>
可是很明显,因为这个配置只在parent pom.xml中出现,这么配置会让所有单元测试都不能运行。这跟你运行mvn install -DskipTests或者mvn install -Dmaven.test.skip=true是一样的效果。
方法2,在不需要运行单元测试的pom.xml文件中添加property,例如permission应用的web工程pom:
<parent>
<groupId>com.alibaba.lp.app</groupId>
<artifactId>permission.parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent> <artifactId>permission.web.perm</artifactId>
<name>permission web perm project</name> <properties>
<maven.test.skip>true</maven.test.skip>
</properties>
事实上这段配置可以改成如下配置也可以达到一样的效果:
<properties>
<skipTests>true</skipTests>
</properties>
说到这儿,顺便解释下maven.test.skip和skipTests的区别maven.test.skip在很多插件,例如Surefire, Failsafe 和 Compiler Plugin 中被支持,skipTests作用一样,可是适用范围可能小些(我比较习惯用skipTests,因为比较短)。
使用文件指定include和exclude的方式我比较支持,但是如果你不喜欢这种方式那么可以去掉suiteXmlFiles这段配置改用以下配置来管理:
<configuration>
<includes>
<include>**/Test.java</include>
</includes>
<excludes>
<exclude>**/TestCase.java</exclude>
</excludes>
</configuration>
surefire里还有其它一些有趣的参数,如果有兴趣,你可以访问http://maven.apache.org/plugins/maven-surefire-plugin/examples/inclusion-exclusion.html 来了解更多信息。
4.测验一下:
在未配置surefire插件之前,运行mvn test,你会发现原本在eclipse中用testNG都能跑过的单元测试都挂了。那么先按照以上的介绍配置完再运行一下吧。我们可以运行下mvn test >result.txt, 然后打开result.txt查看下运行结果。testNG会告诉你哪些单元测试挂了,总共多少用例等信息。
http://outofmemory.cn/code-snippet/3857/maven-surefire-plugin-introduction
maven surefire plugin介绍的更多相关文章
- 学习Maven之Maven Surefire Plugin(JUnit篇)
1.maven-surefire-plugin是个什么鬼? 如果你执行过mvn test或者执行其他maven命令时跑了测试用例,你就已经用过maven-surefire-plugin了.maven- ...
- [Apache Maven Shade Plugin] [example] [001] 官方例子:includes-excludes
链接地址:[Selecting Contents for Uber JAR](http://maven.apache.org/plugins/maven-shade-plugin/examples/i ...
- mavne install 报错org.apache.maven.surefire.util.SurefireReflectionException: java.lang.reflect.InvocationTargetException
maven install 报错 org.apache.maven.surefire.util.SurefireReflectionException: java.lang.reflect.Invoc ...
- maven常用命令介绍
mvn 3.0.4 创建maven项目命令 mvn archetype:generate -DgroupId=damocles-autocredit -DartifactId=damocles ...
- 转:maven常用命令介绍
mvn 3.0.4 创建maven项目命令 mvn archetype:generate -DgroupId=damocles-autocredit -DartifactId=damocles ...
- 学习Maven之Maven Enforcer Plugin
1.Maven Enforcer plugin是什么鬼? 在说这个插件是什么前我们先思考这么一个问题:当我们开发人员进入项目组进行开发前,要准备开发环境,而领导总是会强调工具的统一,编译环境的统一.比 ...
- [Maven] - Eclipse "maven compiler plugin" 冲突解决
刚安装最新的Maven 3.2.5,在eclipse中使用maven的Run As->Maven Install,总会提示: Failed to execute goal org.apache. ...
- maven jetty plugin
转载:http://blog.163.com/xueling1231989@126/blog/static/1026408072013101311395492/ 前言: 在 maven 下测试调试时, ...
- 施用 maven shade plugin 解决 jar 或类的多版本冲突
施用 maven shade plugin 解决 jar 或类的多版本冲突 使用 maven shade plugin 解决 jar 或类的多版本冲突java 应用经常会碰到的依赖的三方库出现版本 ...
随机推荐
- appium-java,连接真机启动微信
1.启动appium 2.设置信息 3.设置IP和端口 4.appium连接手机,微信中打开debugx5.qq.com,信息->TBS settings->是否打开TBS内核Insper ...
- Luogu3576 POI2014 MRO-Ant colony 【树形DP】*
Luogu3576 POI2014 MRO-Ant colony The ants are scavenging an abandoned ant hill in search of food. Th ...
- .NET/C# 使用 Span 为字符串处理提升性能
.NET Core 2.1 和 C# 7.2 带来了 Span 的原生支持,原本需要使用不安全代码操作的内存块现在可以使用安全的方式来完成.此前在性能和稳定性上需要有所取舍,而现在可以兼得了. 简单的 ...
- 为iPhone 6设计自适应布局(iOS8)
Apple从iOS 6加入了Auto Layout后开始就比较委婉的开始鼓励.建议开发者使用自适应布局,但是到目前为止,我感觉大多数开发者一直在回避这个问题,不管是不是由于历史原因造成的,至少他们在心 ...
- Linux下Eclipse配置安装 PyDev(Pydev插件一直不能成功,安装这个插件失败的问题)
pydev插件安装方式如果采取从网络上下载,然后解压到eclipse中文件夹到方式,运行到时候可能会导致重启eclipse后根本看不到这个插件! 原因以及解决方式,看下面! 转自:http://ww ...
- 【java基础】java中Object对象中的Hashcode方法的作用
以下是关于HashCode的官方文档定义: hashcode方法返回该对象的哈希码值.支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表. hashCode ...
- BW处理链(Process Chain)
处理链是能自动完成数据的处理和加载等操作的自动化工具. 1.创建处理链 输入T-code:RSPC打开操作界面,或者处理链已经在T-code:RSA1=>Modeling界面下,也可以直接单 ...
- riotjs 简单使用&&browserify 构建
项目地址: http://riotjs.com/ 备注: 为了简单使用了 browserify 进行构建 1. 项目结构 ├── app.css ├── gulpfile.js ├── index.h ...
- awk:NF-NR-OFS-ORS-RS等参数
ARGC 命令行参数个数ARGV 命令行参数排列ENVIRON 支持队列中系统环境变量的使用FILENAME awk浏览的文件名FNR 浏览文件的记录数FS 设置输入域分隔符,等价于命令行 -F选项N ...
- 如何配置Python环境
(1) 下载:请在Python官网下载页面(https://www.python.org/downloads/)选择合适的版本(建议选择3.5.2版)的链接,在该版本的下载页面选择合适的安装文件:64 ...