maven本身不是一个单元测试框架,java中主流的单元测试框架为JUnit和TestNG,maven所做的只是在构建执行到特定生命周期阶段的时候,通过插件来执行junit或者TestNG的测试用例,这一插件就是大名鼎鼎的maven-surefire-plugin。
默认情况下,maven-surefire-plugin的test目标会自动执行测试源码路径下所有符合下列命名规约的测试类:
# **/Test*.java:任何子目录下以Test开头的Java类
# **/*Test.java:任何子目录下以Test结尾的Java类
# **/*TestCase.java:任何子目录下所有命名以TestCase结尾的Java类
想全部测试,在pom.xml目录下运行 mvn test 即可
>> 动态指定要运行的测试用例:
# mvn test -Dtest=com.springzoo.RandomGeneratorTest // 指定测试类
# mvn test -Dtest=com.springzoo.Random*Test // 通配符指定测试类
# mvn test -Dtest=com.springzoo.* // 通配符指定测试包里面的所有测试类
# mvn test -Dtest=com.springzoo.**.* // 通配符指定测试包下所有子包的所有测试类
# mvn test -Dtest=com.springzoo.**.*Random*Test // 最灵活的通配符了
>> 测试报告:
默认情况下,maven-surefire-plugin会在项目的target/surefire-reports目录下生成两种格式的测试报告:简单文本和xml格式
测试覆盖率是衡量项目代码质量的一个重要的参考指标。Cobertura是一个优秀的开源测试覆盖率统计统计(详见http://cobertura.sourceforge.net/)。maven通过cobertura-maven-plugin与之集成,用户可以使用简单命令就可以为maven项目生成测试覆盖率报告:
# mvn cobertura:cobertura
接着,打开项目目录下的target/site/cobertura/下的index.html文件,就可以查看测试覆盖率报告了,单击具体的类还可以看到精确到行的覆盖率报告。
>> 运行TestNG:
NG是Next Generation的缩写,即下一代java测试技术,在JUnit基础上增加了许多特性。先加入TestNG依赖:
<dependency>
<groupId>org.testing</groupId>
<artifactId>testng</artifactId>
<version>6.8</version>
<classifier>jdk15</classifier>
<scope>test</scope>
</dependency>
然后再测试中将JUnit的注解换成TestNG注解即可,除了JUnit的Before对应于TestNG的BeforeMethod,After对应AfterMethod注解以外,其他都一样。
TestNG一个很大的优势是支持测试组的概念,如下注解会将方法加入到util和medium组中:
@Test(groups={"util", "medium"})
然后再在maven-surefire-plugin的配置中配置要运行的测试组:
<plugin>
<grougId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactid>
<version>2.5</version>
<configuration>
<groups>utils,medium</groups>
</configuration>
</plugin>
>> 重用测试代码:
如果在项目内部想要重用某个模块的测试代码的话,可以利用maven-jar-plugin插件将测试类也打包:
<plugin>
<grougId>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>
maven-jar-plugin有两个target:jar和test-jar,前者通过内置绑定在default生命周期的package阶段运行。test-jar默认绑定生命周期阶段也为package,因此当运行mvn clean package的时候,会同时生成xxx-SNAPSHOT.jar和xxx-SNAPSHOT-tests.jar。部署到nexus上去后,下面就可以用了:
<dependency>
<groupId>com.springzoo</groupId>
<artifactId>account-captcha</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
请注意上面的type和scope