示例

  1. <!-- 测试运行器,生成测试报告 -->
  2. <plugin>
  3. <groupId>org.apache.maven.plugins</groupId>
  4. <artifactId>maven-surefire-plugin</artifactId>
  5. <version>2.22.0</version><!--$NO-MVN-MAN-VER$ -->
  6. <configuration>
  7. <forkMode>always</forkMode>
  8. <parallel>methods</parallel>
  9. <threadCount>10</threadCount>
  10. <includes>
  11. <include>**/Test.java</include>
  12. </includes>
  13. <excludes>
  14. <exclude>**/TestCase.java</exclude>
  15. </excludes>
  16. </configuration>
  17. </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依赖:

  1. <dependency>
  2. <groupId>org.testng</groupId>
  3. <artifactId>testng</artifactId>
  4. <version>5.12.1</version>
  5. <scope>test</scope>
  6. </dependency>

不过如果你使用的版本过低(<= 5.11),就得这么配置了:

  1. <dependency>
  2. <groupId>org.testng</groupId>
  3. <artifactId>testng</artifactId>
  4. <version>5.8</version>
  5. <scope>test</scope>
  6. <classifier>jdk15</classifier>
  7. </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,那么引入这个依赖:

  1. <dependency>
  2. <groupId>junit</groupId>
  3. <artifactId>junit</artifactId>
  4. <version>4.8.1</version>
  5. <scope>test</scope>
  6. </dependency>

2.插件配置

  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-surefire-plugin</artifactId>
  4. <version>2.10</version>
  5. <configuration>
  6. <parallel>methods</parallel>
  7. <threadCount>10</threadCount>
  8. </configuration>
  9. </plugin>

这是一个很简单的配置,事实上这个插件版本已经很老了,另外它只指定了一些基本参数。但是即使如此它已经可以让你在命令行下运行mvn test或者mvn surefire:test,这样它会扫描测试类目录下(src/test/java)的测试类,只要类名符合*Test.java,那么这个测试类就会被运行。

但是这个配置似乎不太令人满意,因为它实在是没什么可以扩展的,例如我想使用jmockit,我想启动多个线程运行单元测试,我想运行某些单元测试,某些单元测试我想排除掉,这些怎么做到呢?我们继续看吧。

3.高级配置首先给出良权限项目的配置。

parent pom.xml文件中添加插件:

  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-surefire-plugin</artifactId>
  4. <version>2.5</version>
  5. <configuration>
  6. <testNGArtifactName>com.alibaba.external:test.testng</testNGArtifactName>
  7. <argLine>-javaagent:"${settings.localRepository}/com/alibaba/external/test.jmockit/0.999.10/test.jmockit-0.999.10.jar"</argLine>
  8. <useSystemClassLoader>true</useSystemClassLoader>
  9. <testFailureIgnore>true</testFailureIgnore>
  10. <parallel>false</parallel>
  11. <forkMode>once</forkMode>
  12. <suiteXmlFiles>
  13. <suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile>
  14. </suiteXmlFiles>
  15. </configuration>
  16. </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。
  1. <forkMode>always</forkMode>
  2. <parallel>methods</parallel>
  3. <threadCount>4</threadCount>

suiteXmlFiles 这个参数的作用是决定单元测试运行的规则,这个规则在文件中指定。

我们使用了相对路径src/test/resources/testng.xml,那么这个文件应该在每个工程的该路径下,我们打开一个工程,例如permission应用的testng.xml,看下它配置了什么。

testng.xml文件的内容:

  1. <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
  2.  
  3. <suite name="plan-project-test">
  4. <test name="plan-project-test">
  5. <packages>
  6. <package name="com.alibaba.lp.permission.dal.cache.test" />
  7. <package name="com.alibaba.lp.permission.dal.impl.test" />
  8. </packages>
  9. </test>
  10. </suite>

这个文件指定了运行哪个package下的单元测试,事实上配置哪些需要运行,哪些不需要运行还可以有很多方式和纬度。例如你可以指定跑哪些class:

  1. <!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
  2. <suite name="My test suite">
  3. <test name="testing">
  4. <classes>
  5. <class name="TestNGTest1" />
  6. <class name="TestNGTest2" />
  7. </classes>
  8. </test>
  9. </suite>

你可以指定跑哪些group:

  1. <!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
  2. <suite name="My test suite">
  3. <test name="testing">
  4. <groups>
  5. <run>
  6. <include name="method1"/>
  7. </run>
  8. </groups>
  9. <classes>
  10. <class name="TestNGTest5_2_0" />
  11. </classes>
  12. </test>
  13. </suite>

关于suite的东西,有兴趣的同学可以google suite查看相应的配置。

到这儿就完美了么?

当然不是,有个很大的问题,我们的插件是配置在parent pom.xml里的,这意味着每个子工程都继承这段配置,因此都需要在相应的目录下配置一个testng.xml文件。那么如果我不想对某些工程运行单元测试,又不想配置这个文件怎么办呢?

方法1,在configuration添加属性:

  1. <configuration>
  2. <skipTests>true</skipTests>
  3. </configuration>

可是很明显,因为这个配置只在parent pom.xml中出现,这么配置会让所有单元测试都不能运行。这跟你运行mvn install -DskipTests或者mvn install -Dmaven.test.skip=true是一样的效果。

方法2,在不需要运行单元测试的pom.xml文件中添加property,例如permission应用的web工程pom:

  1. <parent>
  2. <groupId>com.alibaba.lp.app</groupId>
  3. <artifactId>permission.parent</artifactId>
  4. <version>1.0-SNAPSHOT</version>
  5. </parent>
  6.  
  7. <artifactId>permission.web.perm</artifactId>
  8. <name>permission web perm project</name>
  9.  
  10. <properties>
  11. <maven.test.skip>true</maven.test.skip>
  12. </properties>

事实上这段配置可以改成如下配置也可以达到一样的效果:

  1. <properties>
  2. <skipTests>true</skipTests>
  3. </properties>

说到这儿,顺便解释下maven.test.skip和skipTests的区别maven.test.skip在很多插件,例如Surefire, Failsafe 和 Compiler Plugin 中被支持,skipTests作用一样,可是适用范围可能小些(我比较习惯用skipTests,因为比较短)。

使用文件指定include和exclude的方式我比较支持,但是如果你不喜欢这种方式那么可以去掉suiteXmlFiles这段配置改用以下配置来管理:

  1. <configuration>
  2. <includes>
  3. <include>**/Test.java</include>
  4. </includes>
  5. <excludes>
  6. <exclude>**/TestCase.java</exclude>
  7. </excludes>
  8. </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. 对于Dubbo一些面试题自己的答案

    Dubbo 头几天瞧到<Java顶尖口试必问-Dubbo口试题汇总>,对于内里得难点本人试着答复少许,有错误得请民众指正. Dubbo固然大概不革新了,可是背靠阿里得措施能力,中文报告得多 ...

  2. BZOJ1026 SCOI2009 windy数 【数位DP】

    BZOJ1026 SCOI2009 windy数 Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B ...

  3. WCF Restful Post调用

    一.首先建立Http的服务端,此示例的寄宿体为WindowsService,以下代码仅为WCF Restful服务代码,不包括服务启动和安装代码 1.服务契约 /// <summary> ...

  4. sublime python运行插件

    Tools->New plugin 粘贴下面代码,在插件目录新建文件夹,保存 import sublime, sublime_plugin import os class ExampleComm ...

  5. ballerina 学习十六 错误&&异常处理

    ballerina 的error 处理和elxiir 以及rust 比较类似使用模式匹配,但是他的 error lifting 还是比较方便的 同时check 也挺好,异常处理没什么特殊的 throw ...

  6. struts 2整合spring要注意的问题(二)

    在 struts2_spring_plugin.xml配置文件里有一个strus.objectFactory.spring.autoWire 属性 默认值为name   也就是说你不想装载.它都会找个 ...

  7. bzoj 3996 [TJOI2015]线性代数——最小割

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3996 b[ i ][ j ] 要计入贡献,当且仅当 a[ i ] = 1 , a[ j ] ...

  8. Python nltk English Detection

    http://blog.alejandronolla.com/2013/05/15/detecting-text-language-with-python-and-nltk/ >>> ...

  9. native方法

    看到虚拟机栈和本地方法栈的区别的时候有点疑惑,因为本地方法栈为虚拟机的Native方法服务.以下转载一篇关于native方法的介绍: http://blog.csdn.net/wike163/arti ...

  10. C#制作自定义安装程序

    (一),安装程序 以前用vs制作过安装程序,现在把步骤写出来,有帮助的大家一定要顶哦 第一步:建立工程 1.打开vs,新建项目->其他项目类型->安装和部署(這個子项下面有安装项目和Web ...