maven-surefire-plugin简介:
Maven在构件时执行到测试的生命周期时,会使用maven-surefire-plugin运行测试用例,背后执行的Junit或者TestNG的测试框架。
在默认情况下,maven-surefire-plugin的test目标会自动执行测试源码路径(默认为src/java/test/)下所有符合一组命名模式的测试类。这组模式为:
- **/Test*.java:任何子目录下的所有命名以Test开头的Java类
- **/*Test.java:任何子目录下所有命名以Test结尾的Java类
- **/*TestCase.java:任何子目录下所有命名以TestCase结尾的Java类
只要将测试类按上述模式命名,Maven就能自动运行它们,用户也就不需要定义测试集合(TestSuite)来聚合测试用例(TestCase)。此外,maven-surefire-plugin还支持更高级的TestNG测试集合xml文件。
跳过测试:
有时,我们需要跳过测试用例。理由比如:“测试太耗时了”,"测试用例已经过时了,但是我保证我的代码是正确的"... 虽然运行测试用例是个好习惯,但是有时我们确实需要跳过测试。
要跳过测试,在命令行加入参数skipTests就可以了。
$mvn package -DskipTest
有时我们还想要顺便跳过测试代码的编译:
$mvn package -Dmaven.test.skip=true
在POM中配置跳过测试的方法,是极少用到的,因为既然写出了测试用例,那么就要有运行的时候,所以这里就不介绍怎么在POM中设置跳过测试用例了。
动态指定要运行的测试用例:
有时我们会希望只运行一个或多个指定的测试用例。使用场景比如:某个测试用例上次运行失败后,我们修改了测试用例,如果修改后使用Maven默认行为将运行所有的测试用例,这就太浪费时间了。
maven-surefire-plugin提供了一个test参数让Maven用户能够在命令行指定要运行的测试用例。例如,如果只想运行RandomGeneratorTest,就可以使用以下命令:
$mvn test -Dtest = RandomGeneratorTest
用户还可以使用星号,逗号来进行更加灵活的匹配。星号可以匹配零个或多个字符,而逗号可以指定多个测试用例。
$mvn test -Dtest = Random*Test
上述命令会运行项目中所有类名以Random开头、Test结尾的测试类。
$mvn test -Dtest=Random*Test,AccountCaptchaServiceTest
test参数的值必须匹配一个或者多个测试类,如果maven-surefire-plugin找不到任何匹配的测试类,就会报错并导致构建失败。例如下面的命令没有匹配任何测试类:
$mvn test -Dtest
这样的命令会导致构建失败。
我们可以使用
-DfailIfNotTests=false,告诉maven-surefire-plugin即使没有任何测试也不要报错:
$mvn test -Dtest
-DfailIfNotTests=false
在maven-surefire-plugin并没有提供任何参数支持用户从命令行跳过指定的测试类,但是可以在POM中配置要跳过的指定测试类,范例如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<excludes>
<exclude>**/*ServiceTest.java</exclude>
<exclude>**/TempDaoTest.java</exclude>
</excludes>
</configuration>
</plugin>
两个星号**用来匹配任意路径,一个星号*匹配除路径分隔符外的0个或者多个字符。所以上诉代码中排除了所有以ServiceTest结尾的测试类,以及一个名为TempDaoTest的测试类。
运行TestNG测试:
这里介绍一下TestNG与Maven的集成使用。TestNG在Junit上增加了很多特性。
首先我们再pom中添加TestNG的依赖:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.1.1</version>
<scope>test</scope>
</dependency>
TestNG在类库上提供了大部分Junit所能提供的类库功能,所以在类库的使用上差异不大,大家可以在网上找到相关对应关系。
TestNG允许用户使用一个名为testing.xml的文件来配置想要运行的测试集合。我们可以在项目中创建一个testing.xml指定要运行的测试用例:
<?xml version="1.0" encoding="UTF - 8"?>
<suite name="Suite1" verbose="1">
<test name="Regression1">
<classes>
<class name = "com.juvenxu.mvnbook.account.captcha.RandomGeneratorTest"/>
</classes>
</test>
</suite>
然后再在POM中指定该文件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>testing.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
TestNG较JUnit的一大优势在于它支持测试组的概念,如下的注解会将测试方法加入到两个测试组util和medium中:
@Test(groups = {"util","medium"})
由于用户可以自由的标注方法所属的测试组,因此用户能在方法级别对测试进行归类。而Junit只能实现类级别的测试归类。
Maven可以在POM使用以下代码配置运行一个或者多个TestNG测试组。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<groups>util,medium</groups>
</configuration>
</plugin>
重用测试代码:
默认Maven的打包行为不会把测试代码打在包里,但是在项目内部重用某个模块的测试代码是很常见的需求,比如在某个底层模块的测试代码中包含了一些常用的测试工具类,或者一些高质量的测试基类供继承。这时我们需要修改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的test-jar目标,而该目标默认绑定在package阶段。
通过以下的依赖声明可以使用上面的测试包构件。
<dependency>
<groupId>org.juven.mvnbook.account</groupId>
<artifactId>account-captcha</artifactId>
<version>1.0.0 - SNAPSHOT</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
上述声明中有一个特殊元素type,所有测试包构件都使用特殊的test-jar打包类型。需要注意的是,这一类型的依赖同样都使用test依赖范围。