示例

<!-- 测试运行器,生成测试报告 -->
<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. 利用gcc 4.4 优化的方法

    Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable ...

  2. selenium-java,启动谷歌浏览器和火狐浏览器

    selenium3.4.0-java,启动谷歌浏览器和火狐浏览器-------------------------------------------------------------------- ...

  3. SGU495Kids and Prizes(数学期望||概率DP||公式)

    495. Kids and Prizes Time limit per test: 0.25 second(s) Memory limit: 262144 kilobytes input: stand ...

  4. 阿里云简单的HTTPS配置

    1, 在CA证书服务中购买证书,填写信息,之后[域名授权配置]. 域名授权配置有两种,一种是文件配置,一种是DNS配置,这里我选择DNS配置. 记录类型:TXT 主机记录:按照上图填写 记录值:按照上 ...

  5. 《DSP using MATLAB》示例Example 8.24

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  6. [转]50个很棒的Python模块

    转自:http://www.cnblogs.com/foxhengxing/archive/2011/07/29/2120897.html Python具有强大的扩展能力,以下列出了50个很棒的Pyt ...

  7. np.random 的使用

    random 有很多地方会用到. 参考这篇: http://www.cnblogs.com/CheeseZH/p/4593349.html

  8. 每30秒运行一下shell脚本

    cd /usr/local/sbin/     //存放shell脚本 目录. vim guoguosql.sh      //每30秒运行一个php文件.   文件路径为 vim /home/www ...

  9. 初识php,开发环境的配置

    PHP开发环境配置和第一个PHP程序(phpStudy+PhpStorm) 第一步 下载phpStudy 首先,到phpStudy官网上下载最新的phpStudy版本. 第二步 安装phpStudy ...

  10. Codeforces Round #204 (Div. 2) C. Jeff and Rounding——数学规律

    给予N*2个数字,改变其中的N个向上进位,N个向下进位,使最后得到得数与原来数的差的绝对值最小 考虑小数点后面的数字,如果这些数都非零,则就是  abs(原数小数部分相加-1*n), 多一个0 则 m ...