zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    研究生毕业论文如何选题
    关于虚拟机中开vmnet1(host)后pc不能上网的问题解决
    ubuntu10.04安装x264库
    CentOS 5.5无法识别Atheros AR8151网卡问题解决
    dm365工作笔记20130731
    DAVINCI DM365-DM368开发攻略——U-BOOT-2010.12及UBL的移植
    SQL语法练习
    T-SQL查询语句常用优化技巧总结
    【转】Asp.net控件开发学习笔记整理篇
    【转】Asp.net控件开发学习笔记整理篇
  • 原文地址:https://www.cnblogs.com/xiang--liu/p/9710233.html
Copyright © 2011-2022 走看看