Maven测试篇

 Maven的生命周期:

  讲解Maven测试篇以前将首先介绍一下Maven生命周期的相关概念,若是你熟知这部分概念能够略过此小节内容。
  一般,咱们在构建一个项目的时候,不外乎是对其进行清理、编译、测试和部署等操做。对于大多数项目,咱们每次都要重复这些必要的过程,而Maven正是对这些必要的构建过程进行了抽象,它以项目的清理、初始化、编译、测试、打包、部署等构建步骤做为项目生命周期的各个阶段。
   每一个Maven项目,都有三个相互独立的生命周期,其中包括:
  • clean生命周期:负责项目的清理工做;
  • default生命周期:负责项目的部署;
  • site生命周期:负责建立项目的文档站点;
   其中各个生命周期又包含不一样的阶段(以下图所示),例如clean生命周期下有pre-clean、clean和post-clean三个阶段,分别负责项目清理前的工做、清理上次构建的项目和项目清理后的工做,这些阶段是顺序执行的,也就是说,当你执行pre-clean阶段的时候,clean和post-clean阶段不会被执行,当你执行clean阶段的时候,pre-clean阶段和clean阶段会被执行,post-clean阶段不会被执行,当你执行post-clean阶段时候,pre-clean、clean和post-clean这三个阶段都会依次被执行。同理,default生命周期和site生命周期下也分为各个不一样的阶段,这些阶段和clean生命周期下的各个阶段同样,后面阶段的执行依赖于前面的阶段执行。
 
Maven 生命周期及生命周期下的阶段
                                  Maven生命周期及生命周期下的阶段示意图
  此时你可能认为,当执行default生命周期下的某个阶段时,clean生命周期下的全部阶段也会被执行,其实并不是这样。正如以前所说,Maven项目的每一个生命周期是相互独立的,执行某个生命周期下的某个阶段,不会对另外两个生命周期下的任何阶段产生影响。
若是要对Maven生命周期下的某个阶段进行调用,运行相应的Maven命令便可。例如,调用clean生命周期下的clean阶段,运行以下命令:
mvn clean
此时clean 生命周期下的pre-clean和clean阶段将被执行。
若是要调用default 生命周期下的package阶段,运行以下命令: 
mvn package
此时在default生命周期内,package阶段以前全部的阶段将被执行,package阶段也将被执行。
若是要对项目进行打包,在项目打包以前可能须要对项目上一次的构建进行删除清理,运行以下命令:
mvn clean package
 此时在clean生命周期内,clean阶段以前全部的阶段将被执行,clean阶段也将被执行。default生命周期内package阶段以前全部的阶段和package阶段也将被执行。
若是要执行项目测试,运行以下命令:
mvn test
此时在default生命周期内,test阶段以前全部的阶段将被执行,test阶段也将被执行。
  Maven的每一个阶段都绑定了一个或多个插件,调用某个阶段时,具体任务将交由这个阶段所绑定的插件来完成。好比进行项目测试时,须要调用default生命周期下的test阶段,但具体任务将是交由“maven-surefire-plugin”插件完成的,由于test阶段与“maven-surefire-plngin”插件进行了绑定。这个“maven-surefire-plngin” 插件就是一个测试运行器,它与主流的测试框架(Junit三、Junit4和TestNG)进行了集成。

引用“maven-surefire-plngin”插件依赖

   由于“maven-surefire-plngin”插件是Maven内置绑定的,即便你不在“pom.xml”文件中对”maven-surefire-plngin”插件作相关配置,调用default生命周期的test阶段时,Maven也会使用“maven-surefire-plngin”插件执行相关任务。固然你还能够在“pom.xml”文件中自定义配置这个插件:
<project>
  [...]
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.20</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
  [...]
</project>

整合TestNG

   使用TestNG做为测试框架时,须要在Maven项目的“pom.xml”文件中配置TestNG依赖,这里须要在<scope/>元素中将TestNG的依赖范围配置为test。
<dependencies>
  [...]
    <dependency>
      <groupId>org.testng</groupId>
      <artifactId>testng</artifactId>
      <version>6.9.8</version>
      <scope>test</scope>
    </dependency>
  [...]
</dependencies>
  你还能够在项目路径下建立一个“testng.xml”文件,这个文件主要用来描述测试套件和测试执行相关参数的配置,但它不是TesgNG必须的配置文件,若是你没有建立“testng.xml”文件,也就不须要对“maven-surefire-plngin”插件作“testng.xml”文件的相关配置。
<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="testSuite">
<test name="test">
   <classes>
      <class name=“ATest" />
   </classes>
</test>
</suite>
上面是以一份简要的“testng.xml”配置文件,它首先定义了一个名称为“testSuite”的测试套件,这个测试套件内包含一个测试名称为“test”的测试,这个测试指定了一个“ATest”测试类,“ATest”类是一个简单的TestNG测试类,清单以下:
import org.testng.Assert;
import org.testng.annotations.Test;
public class ATest {
    @Test
    public void  testIsTrue(){
        A a=new A();
        Assert.assertTrue(a.returnTrue());
    }
}
在“maven-surefire-plngin”插件中引入“testng.xml”文件,只须要在“pom.xml”文件中添加以下配置:
<project>
[...]
<build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.20</version>
                    <configuration>
                        <suiteXmlFiles>
                            <suiteXmlFile>testng.xml</suiteXmlFile>
                        </suiteXmlFiles>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
[…]
</project>
这里主要介绍了Maven与TestNG的整合相关配置,有关TestNG更详细的教程请参阅官方文档。

约定优于配置:

  在默认状况下,“maven-surefire-plugin”插件将自动执行项目“src/test/java”路径下的测试类,但测试类须要听从如下命名模式,Maven才能自动执行它们:  
  • Test*.java :以Test开头的Java类;
  • *Test.java :以Test结尾的Java类;
  • *TestCase.java:以TestCase结尾的Java类;
 跳过测试:
  若是要求Maven跳过测试,在Maven命令行中加入skipTests参数便可:
mvn package -DskipTests
 执行以上命令以后,Maven会在构建日志中打印跳过测试执行的信息:

除了执行Maven 命令时指定参数来跳过测试,还可经过在“pom.xml”文件中经过配置“maven-surefire-plugin”插件来跳过测试: 
<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.20</version>
        <configuration>
            <skipTests>true</skipTests>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>
再次经过“mvn package”命令对项目进行构建,打印日志以下:
若是不只要跳过测试类的执行,还要临时性的跳过测试代码编译,能够执行如下命令:
mvn package -Dmaven.test.skip=true
此时项目构建的日志中显示没有对测试代码进行编译,而且跳过了测试类的执行:
Dmaven.test.skip=true 参数控制了“maven-compiler-plugin” 和“maven-surefire-plugin” 两个插件的行为,在项目构建过程当中跳过了测试代码的编译和测试。此外,还能够经过配置“pom.xml”文件,完成与上述执行Maven命令一样的效果: 
<project>
    [...]
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.20</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
        </plugins>
    </build>
    [...]
</project>
 

动态指定要运行的测试类:

在进行单元测试时,有时候不须要执行项目中全部的测试类,“maven-surefire-plugin”插件支持命令中设置Dtest参数,来执行指定的测试类。例如只执行“ATest” 测试类:
mvn -Dtest=ATest test
”maven-surefire-plugin“插件还支持使用星号匹配测试类名的方式以指定运行特定的测试类,星号表示匹配零个或多个字符。例如只执行”A“开头的测试类:
mvn -Dtest=A* test
除了使用星号匹配,还能够使用逗号指定多个测试类:
mvn test -Dtest=ATest,BTest
同时匹配类名以A开头的测试类和类名为BTest的测试类:
mvn -Dtest=A*,BTest test
当test命令经过参数匹配不到任何测试类时,项目将会构建失败。配置参数DfailIfNoTests=false能够在匹配不到测试类时依旧构建成功:
mvn -Dtest=AATest -DfailIfNoTests=false  test
   使用DfailIfNoTests=false参数也是另外一种跳过测试的方法。“maven-surefire-plugin”插件并无提供经过指定测试类的类名来跳过执行某个测试类的命令,但能够经过在“pom.xml”文件中进行排除指定的测试类。

包含与排除测试用例:

<include/>元素配置的测试类名将会被执行:
<project>
   [...]
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.20</version>
                <configuration>
                    <includes>
                        <include>**/*Tests.java</include>
                    </includes>
                </configuration>
            </plugin>
        </plugins>
    </build>
[...]
</project> 
其中“ **/*Tests.java”匹配以Tests结尾的Java类,其中两个星号用来表示匹配任意路径,一个星号用来匹配路径风格符除外的零个或多个字符。
使用<excludes/>元素中排除执行匹配到的测试类:
<project>
    [...]
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.20</version>
                <configuration>
                    <excludes>
                        <exclude>**/CTest.java</exclude>
                        <exclude>**/DTest.java</exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
   [...]
</project>

 

参考资料:java

Maven文档:http://maven.apache.org/guides/apache

maven-surefire-plugin 文档:http://maven.apache.org/surefire/maven-surefire-plugin/框架

=====================================================================maven

 结束: 欢迎给我留言
相关文章
相关标签/搜索