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

 結束: 歡迎給我留言
相關文章
相關標籤/搜索