maven本身并不是一个单元测试框架,java世界中主流的测试框架为junit和testng。maven所做的只是在构建执行到特定生命周期阶段的时候,通过插件来执行junit或者testng的测试用例。这一插件就是maven-surefire=plugin,可以称之为测试运行器,它能很好的兼容junit3、junit4和testng。
maven的default生命周期test阶段内置绑定上述插件的test目标,插件会执行特定目标下的符合命名格式的测试类,命名格式如下:
**/Test*.java:任何子目录下所有命名以Test开头的java类。
**/*Test.java:任何子目录下所有命名以Test结尾的java类。
**/*TestCase.java:任何子目录下所有命名以TestCase结尾的java类。
只有符合这些标准的测试类才会得以执行。
当然,如果有需要,可以自己定义要运行测试类的模式,另外上述插件还支持更高级的testng测试集合xml文件。
跳过测试运行
mvn package -DskipTests
长期跳过测试运行在pom中全局设置插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
跳过测试编译和运行
mvn package -Dmaven.test.skip=true,这个参数控制了两个插件,跳过了测试的编译和运行。
永久跳过,在pom中全局配置插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<sikp>true</sikp>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
动态指定要运行的测试用例:
mvn test -Dtest=abcTest 只运行这个abcTest测试类
mvn test -Dtest=abc*Test 星号可以匹配零个或者多个字符,表示运行以abc开头Test结尾的所有测试类。
mvn test -Dtest=abcTest,defTest 只运行这两个测试类。
mvn test -Dtest 如果只执行这个命令,插件找不到测试类的情况下会导致构建失败。
mvn test -Dtest -DfailIfNoTests=false 告诉插件,即使没有任何测试类也不要报错。
遗憾的是,在命令行不能指定某个测试类做排除测试。
包含与排除测试用例:
**是指匹配任何路径,*匹配除路径分隔符外的0个或多个字符。
include元素指定要执行的测试用例,exclude指定要排除的测试用例。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<includes>
<include>**/*Test.java</include>
</includes>
<excludes>
<exclude>**/*Test.java</exclude>
</excludes>
</configuration>
</plugin>
测试报告的生成:maven-surefire-plugin生成测试报告
默认情况下,会在项目的target/surefite-reports目录下生成两种格式的错误报告:
1.简单文本格式
2.与junit兼容的xml格式,这个格式的报告可以用于三方工具的解析。
测试覆盖率报告:cobertura-maven-plugin,生成在target/site/cobertura目录下。
在pom.xml目录下运行 mvn cobertura:cobertura
运行TestNG测试
testNG测试的普通用法和junit测试是一样的,另外TestNG支持用户使用一个testng.xml的文件来配置想要运行的测试集合,testng.xml文件放在根目录下,文件内容如:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1" verbose="1" >
<groups>
<run>
<include name="..." />
<exclude name="..." />
</run>
</groups>
<test name="Regression1">
...
</test>
</suite>
另外,配置插件cobertura-maven-plugin使用该testng.xml文件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
TestNG较junit的一大优势是支持测试组的概念:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<groups>util1,util2</groups>
</configuration>
</plugin>
测试代码可以重用,我们可以把测试代码打包并部署到仓库供其他项目使用:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
当需要引用测试jar包的时候,坐标的类型用:<type>test-jar</type>