示例

<!-- 测试运行器,生成测试报告 -->
<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介绍的更多相关文章

  1. 学习Maven之Maven Surefire Plugin(JUnit篇)

    1.maven-surefire-plugin是个什么鬼? 如果你执行过mvn test或者执行其他maven命令时跑了测试用例,你就已经用过maven-surefire-plugin了.maven- ...

  2. [Apache Maven Shade Plugin] [example] [001] 官方例子:includes-excludes

    链接地址:[Selecting Contents for Uber JAR](http://maven.apache.org/plugins/maven-shade-plugin/examples/i ...

  3. mavne install 报错org.apache.maven.surefire.util.SurefireReflectionException: java.lang.reflect.InvocationTargetException

    maven install 报错 org.apache.maven.surefire.util.SurefireReflectionException: java.lang.reflect.Invoc ...

  4. maven常用命令介绍

    mvn 3.0.4 创建maven项目命令  mvn  archetype:generate   -DgroupId=damocles-autocredit -DartifactId=damocles ...

  5. 转:maven常用命令介绍

    mvn 3.0.4 创建maven项目命令  mvn  archetype:generate   -DgroupId=damocles-autocredit -DartifactId=damocles ...

  6. 学习Maven之Maven Enforcer Plugin

    1.Maven Enforcer plugin是什么鬼? 在说这个插件是什么前我们先思考这么一个问题:当我们开发人员进入项目组进行开发前,要准备开发环境,而领导总是会强调工具的统一,编译环境的统一.比 ...

  7. [Maven] - Eclipse "maven compiler plugin" 冲突解决

    刚安装最新的Maven 3.2.5,在eclipse中使用maven的Run As->Maven Install,总会提示: Failed to execute goal org.apache. ...

  8. maven jetty plugin

    转载:http://blog.163.com/xueling1231989@126/blog/static/1026408072013101311395492/ 前言: 在 maven 下测试调试时, ...

  9. 施用 maven shade plugin 解决 jar 或类的多版本冲突

    施用 maven shade plugin 解决 jar 或类的多版本冲突   使用 maven shade plugin 解决 jar 或类的多版本冲突java 应用经常会碰到的依赖的三方库出现版本 ...

随机推荐

  1. 剑指offer第五章

    剑指offer第五章 1.数组中出现次数超过一半的数 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组 ...

  2. Sprint第一个冲刺(第四天)

    一.Sprint介绍 今天我们完成了点餐界面及美化的任务,是通过TabActivity来实现的,界面可以进行滑动来进行点餐. 下面是实验截图: 任务进度: 二.Sprint周期 看板: 燃尽图:

  3. Codeforces Round #249 (Div. 2)-D

    这场的c实在不想做,sad. D: 标记一下每个点8个方向不经过黑点最多能到达多少个黑点. 由题意可知.三角形都是等腰三角形,那么我们就枚举三角形的顶点. 对于每个定点.有8个方向能够放三角形. 然后 ...

  4. 什么是Spark(三)数据的加载和保存

    Spark内置了一些常见的文件格式的处理,包括text/json,csv,sequence等:Spark对于文件处理保持了开放性,还提供了可以通过InputFormat,OutputFormat来进行 ...

  5. 性能优化之mysql索引优化

    sql及索引优化 如何通过慢查询日志发现有问题的sql? 查询次数多且每次查询占用时间长的sql通常为pt-query-digest分析的前几个查询 IO大的sql注意pt-query-digest分 ...

  6. MFC程序如何修改icon图标

    场景: Visual Studio写MFC应用程序,默认的程序左上角图标是自带的(如下图),虽说也不丑,但是对于程序员来说,还是缺乏个性了. 你知道,C.C++.java系程序员最常干的事情就是定义. ...

  7. js中去掉字符串中的某个指定字符

    假设一个data里面的数据是[tian,12],现在去掉[],代码如下 data=data.replace("[",""); data=data.replace ...

  8. 关于Markdown的空行

    如何在Markdown中输入一个空行? 最简单的做法是加一个<br>(html)或者<br />(xhtml),因为Markdown完全兼容html语法,但有的编辑器会支持,譬 ...

  9. Unit03: 容器对路径的处理 、 Servlet特性

    Unit03: 容器对路径的处理 . Servlet特性 案例一:查询,增加员工: 重定向 处理请求资源路径 目录结构: 案例代码: package dao; import java.io.Seria ...

  10. dubbox实现REST服务

    一.dubbox的由来 dubbox是当当网基于dubbo的基础上开发的扩展版,也可以认为是dubbo的升级版,根据当前互联网的应用需求,增加了很多扩展的功能. dubbox并没有发布到maven中央 ...