Failures表示要测试的结果与预期值不一致;Errors表示测试代码或产品代码发生了未预期的错误;Skipped表示那些被标记为忽略的测试方法。在Junit中用户可以使用@Ignore注解标记忽略测试方法。
Maven本身不是一个单元测试框架。Maven所做的只是在构建执行到特定生命周期阶段的时候,通过插件来执行JUnit或TestNG的测试用例。Maven-surefire-plugin被称之为测试运行器(Test Runner)。它可以兼容JUnit3,JUnit4以及TestNG。
在默认情况下,maven-surefire-plugin的test目标会自动执行测试源码路径(src/test/java)下所有符合一组命名模式的测试类。这组模式为:
**/Test*.java
**/*Test.java
**/*TestCase.java
只要将测试类按上述模式命名。Maven就能自动运行它们,用户不需要定义测试集合来聚合测试用例。以Tests结尾的测试是不会得以自动执行的。
maven-compiler-plugin的testCompile和maven-surefire-plugin的test目标都提供了一个参数skip用来跳过测试编译和测试运行。这个参数的命令行表达式为maven.test.skip
maven-surefire-plugin提供了一个test参数让Maven用户能够在命令行指定要运行的测试用例。
mvn test -Dtest=**Test //指定运行**Test类
在POM中配置test运行的类
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.5</version> <configuration> <includes> <include>**/*Tests.java</include> </includes> </configuration> </plugin>
在POM中配置不运行那些测试类
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.5</version> <configuration> <exclusions> <exclusion>**/*ServiceTest.java</exclusion> </exclusions> </configuration> </plugin>
默认情况下,maven-surefire-plugin会在项目的target/surefire-reports目录下生成两种格式的错误报告:
简单文本格式
与JUnit兼容的XML格式
测试覆盖率是衡量项目代码质量的一个重要参考指标。Cobertura是一个开源的测试覆盖率统计工具。用户可以使用更简单的命令为Maven项目生成测试覆盖率报告。
mvn cobertura:cobertura
TestNG
<dependency> <groupId>org.testing</groupId> <artifactId>testing</artifactId> <version>5.9</version> <scope>test</scope> <classifier>jdk15</classifier> </dependency>
TestNG允许用户使用一个名为testing.xml的文件来配置想要运行的测试集合。
<?xmlv version="1.0" encoding="UTF-8" ?> <suite name="Suite1" verbose="1"> <test name="Regression1"> <classes> <class name="com.***.***.*Test" /> </classes> </test> </suite>
然后在maven-surefire-plugin中使用该testing
<plugin> <groupId>org.apache,maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifacId> <version>2.5</version> <configuration> <suiteXmlFiles> <suiteXmlFile>testing.xml</suiteXmlFile> </suiteXmlFiles> </configuration> </plugin>
TestNG较JUnit的一大优势在于它支持测试组的概念。由于用户可以自由地标注方法所属的测试组,因此这种机制能让用户在方法级别对测试进行归类。JUnit只能实现类级别的测试归类。
@Test(groups={"util","medium"}) //将注解下的方法加入到两个测试组util和medium中
<plugin> <groupId>org.apache.maven.plugin</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <groups>util,medium</groups> </configuration> </plugin>
Maven配置打包测试类
<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>
maven-jar-plugin有两个目标,分别是jar和test-jar。前横通过maven的内置绑定在default生命周期的package阶段运行,其行为就是对项目主代码进行打包,后者并没有内置绑定。因此需要显式声明该目标来打包测试代码。