Maven学习笔记(九):使用Maven进行测试

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依赖范围。


你可能感兴趣的:(maven)