简介
在pom.xml中配置JUnit,TestNG测试框架的依赖,即可自动识别和运行src/test目录下利用该框架编写的测试用例。surefire也能识别和执行符合一定命名约定的普通类中的测试方法(POJO测试)。
生命周期中test阶段默认绑定的插件目标就是surefire中的test目标,无需额外配置,直接运行mvn test就可以。
Maven Surefire Plugin
要求:
Maven 2.2.1 or 3.x
JDK 1.6 +
推荐 Maven 3.1.0 +
surefire插件是在程序运行的测试阶段被使用以执行单元测试用例.它生成两种格式化的测试报告:
text文本(.txt)
XML 文件(.xml)
默认情况下,生成的测试报告文件会在${basedir}/target/surefire-reports/TEST-*.xml目录下
目标和概要
surefire插件只有一个目标:
surefire:test : 运行单元测试文件
用法
基本配置如下,下文中的配置项如无特殊说明,都位于pom文件的节点中。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
......
配置内容
......
</configuration>
</plugin>
常用通用配置
1.跳过测试阶段
<skipTests>trueskipTests>
或者
mvn install -DskipTests
mvn install -Dmaven.test.skip=true
2.忽略测试失败
Maven在测试阶段出现失败的用例时,默认的行为是停止当前构建,构建过程也会以失败结束。有时候(如测试驱动开发模式)即使测试出现失败用例,仍然希望能继续构建项目
<testFailureIgnore>truetestFailureIgnore>
或者
mvn test -Dmaven.test.failure.ignore=true
3.包含和排除特定的测试类
surefire默认的查找测试类的模式如:
*/Test.java
**/*Test.java
**/*TestCase.java
自定义包含和排除模式,支持ant-style表达式和 正则表达式(%regex[…], 按.class文件匹配而不是.java)
<includes>
<include>Sample.javainclude>
<include>%regex[.*[Cat|Dog].*Test.*]include>
<includes>
<excludes>
<exclude>**/TestCircle.javaexclude>
<exclude>**/TestSquare.javaexclude>
<excludes>
4.运行指定的用例
指定测试类
mvn -Dtest=TestClassName test
mvn -Dtest=TestCi*le test
mvn -Dtest=TestSquare,TestCi*le test
指定单个测试类中的多个方法(Junit4+, TestNG)
mvn -Dtest=TestCircle#mytest test
mvn -Dtest=TestCircle#test* test
mvn -Dtest=TestCircle#testOne+testTwo test #(Surefire2.12.1+, Junit4.x+)
5.并发执行测试
(mvn命令加-T选项,多模块项目的各个模块可以并行构建。)
两个方式:
方法一是使用parallel 参数,在一个进程中执行多个线程。
Junit4.7+可用值有:methods, classes, both(classesAndMethods), suites, suitesAndClasses, suitesAndMethods, classAndMethods, all。Junit Runner必须继承自orig.junit.runners.ParentRunner或为指定@org.junit.runner.RunWith。
线程数配置:useUnlimitedThreads 为true,不限制线程数。useUnlimitedThreads 为false时可以使用threadCount和perCoreThreadCount参数。还可以通过threadCountSuites,threadCountClasses,threadCountMethods在不同粒度限制线程。parallelTestsTimeoutInSeconds和parallelTestsTimeoutForcedInSeconds参数设置线程的超时时间。Junit中@NotThreadSafe注解的内容会单线程执行,避免并发。
方法二是使用forkCount参数,创建多个测试进程。
如果forkCount参数值后加C,表示乘以CPU核数(如forkCount=2.5C)。reuseForks表示一个测试进程执行完了之后是杀掉还是重用来继续执行后续的测试。 默认配置为forkCount=1/reuseForks=true。进程的测试单元是class,逐个class的传递给测试进程。
可以用systemPropertyVariables 传入系统参数(mvn test -D…或配置元素),也可以使用argLine传入JVM选项。argLine或者systemPropertyVariables配置里中也能用${surefire.forkNumber}占位符,代表每个进程自己的fork编号(1…n),用来向每个进程传入独立的资源配置(forkCount=0时,该占位符值为1)。
用例
Using TestNG
Using JUnit
Using POJO Tests
Skipping Tests
Skip After Failure
Inclusions and Exclusions of Tests
Running a Single Test
Re-run Failing Tests
Class Loading and Forking
Debugging Tests
Using System Properties
Configuring the Classpath
Selecting Providers
Fork Options and Parallel Test Execution
Using Console Logs
Shutdown of Forked JVM