1、插件简介
maven-surefire-plugin测试运行器,能很好的兼容JUnit3Junit4以及TestNG,Maven在构件执行到特定生命周期阶段的时候,通过该插件来执行JUnit或者TestNG的测试用例,test阶段与该插件的test目标相绑定,是Maven内置的绑定,默认情况test目标会自动执行测试源码路径下所有符合一组命名模式的测试类。这组模式为:
**/Test*.java:任何子目录下所有命名以Test开头的Java类。
**/*Test.java:任何子目录下所有命名以Test结尾的Java类。
**/*TestCase.java:任何子目录下所有命名以TestCase结尾的Java类
只要将测试类按上述模式命名,Maven就能自动运行他们,用户也就不在需要定义测试集合(TestSuite)来聚合测试用例(TestCase)。关于模式需要注意的是,以Tests结尾的测试类是不会得以自动执行的。
2、跳过测试
命令行配置 mvn package -DskipTests 跳过测试执行。
POM文件配置skipTests属性
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifaceId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
<plugin/>
跳过测试代码的编译
mvn package -Dmaven.test.skip=true
参数maven.test.skip同时控制了maven-compile-plugin和maven-surefire-plugin两个插件的行为,测试代码编译跳过了,测试运行也跳过了。
POM中配置maven.test.skip
maven-compile-pluigin的testCompile目标和maven-surefire-plugin的test目标都提供了一个参数skip用来跳过测试编译和测试运行,而这个参数对应的命令行表达式为maven.test.skip
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifaceId>maven-compile-pluigin</artifactId>
<version>2.1</version>
<configuration>
<skip>true</skip>
</configuration>
<plugin/>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifaceId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<skip>true</skip>
</configuration>
<plugin/>
3、命令行动态指定要运行的测试用例
maven-surefire-plugin提供test参数让Maven用户能够在命令行指定要运行的测试用例
mvn test -Dtest=RandomGeneratorTest 指定运行某个测试用例
mvn test -Dtest=Random*Test 星号可以匹配零个或多个字符,运行项目中所有类名以Random开头、Test结尾的测试类。
mvn test -Dtest=RandomGeneratorTest,AccountCaptchaServiceTest 用逗号隔开测试类,只运行逗号隔开的多个测试类
mvn test -Dtest=Random*Test,AccountCaptchaServiceTest 结合使用星号和逗号。
test参数的值必须匹配一个或者多个测试类,如果maven-surefire-plugin找不到任何匹配的测试类,就会报错并导致构建失败。
mvn test -Dtest -DfailIfNoTests=false 即使没有任何测试也不要报错
-Dtest -DfailIfNoTests=false 命令行中使用这种方法也可以跳过测试
maven-surefire-plugin并没有提供任何参数支持用户从命令行跳过指定的测试类,可以在POM中配置maven-surefire-plugin排除特定的测试类。
4、POM中指定、排除指定的测试类
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifaceId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<includes>
...
<!-- 匹配所有以Tests结尾的Java类,两个星号**用来匹配任意路径,一个星号*匹配除路径风格符外的0个或多个字符 -->
<include>**/*Tests.java</include>
</includes>
<excludes>
...
<!-- 排除所有以ServiceTest结尾的测试类,以及一个名为TempDaoTest的测试类,
他们都符合默认的命名模式**/*Test.java,有了excludes配置后,maven-surefire-plugin将不再自动运行他们 -->
<exclude>**/*ServiceTest.java</exclude>
<exclude>**/TempDaoTest.java</exclude>
</excludes>
</configuration>
<plugin/>
5、测试报告
maven-surefire-plugin会在项目的 target/surefire-reports 目录下生成两种格式的错误报告:
简单文本格式
与JUnit兼容的XML格式(XML格式已经成为Java单元测试报告的事实标准,其他工具也能使用它们;eg:hudson),Eclipse JUnit插件可以打开XML格式报告
Cobertura是一个优秀的开源测试覆盖率统计工具,Maven通过cobertura-maven-plugin与之集成,
mvn cobertura:cobertura
target/site/cobertura/ 下的index.html文件就是生成的测试覆盖率报告。
6、打包测试代码
maven-jar-plugin打包测试类,jar内置绑定在default生命周期的package生命周期的package阶段运行,其行为就是对项目主代码进行打包,test-jar没有内置绑定,test-jar默认绑定生命周期阶段为package,所以需要显示声明该目标来打包测试代码。
插件目标没有内置绑定的,默认绑定到生命周期中的阶段,调用需要显示声明目标
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifaceId>maven-jar-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
<plugin/>
依赖测试包构件,type元素声明所有测试包构件都使用特殊的 test-jar 打包类型。需要注意的是,这一类型的依赖同样都使用test依赖范围。
<dependency>
<groupId>com.**.account</groupId>
<artifaceId>account-captcha</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>