天天看點

測試開發基礎 mvn test | 利用 Maven Surefire Plugin 做測試用例基礎執行管理一、需求二、環境三、指定測試類四、指定測試方法五、失敗重試六、套件運作六、Pom 中指定預設執行七、寫在最後

本文為霍格沃茲測試學院優秀學員學習筆記。

一、需求

在測試工作場景中,經常會遇到下面的問題:

  1. 執行自動化測試用例的時候,隻想指定某個測試類,或者某個方法,又或者某一類用例等,怎麼辦?
  2. 想要和 Jenkins 一起進行持續內建,可是用例又不可能在 IDE 裡面執行,怎麼辦?

這個時候就需要 Maven 登場了,利用

Maven 的Maven-Surefire-Plugin

插件可以幫助我們完成上述的目标!它可以通過指令行的形式來管理我們要執行的用例。

二、環境

2.1 環境要求

  • Maven 3.x +
  • JDK 1.7 +

2.2 支援架構

對于我們測試來說,常接觸的幾個用例管理架構都支援(這裡指 Java 技術棧)

  • Using TestNG
  • Using JUnit 5 Platform
  • Using JUnit

2.3 相關依賴

本文将以 Junit5 為例進行研究學習,是以下面的依賴添加也以 Junit5 為準。

常用到的 Junit5 相關依賴:

<dependency>
   <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-launcher</artifactId>
    <version>1.6.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-runner</artifactId>
    <version>1.5.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.6.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.vintage</groupId>
    <artifactId>junit-vintage-engine</artifactId>
    <version>5.6.2</version>
    <scope>test</scope>
</dependency>           

Maven-Surefire-Plugin:

<build>
   <plugins>
       <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-surefire-plugin</artifactId>
           <version>2.22.0</version>
       </plugin>
       <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-compiler-plugin</artifactId>
           <version>3.8.1</version>
           <configuration>
               <source>8</source>
               <target>8</target>
           </configuration>
            </plugin>
   </plugins>
</build>           

指定編譯 JDK 版本:

<properties>
    <aspectj.version>1.8.10</aspectj.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>           

三、指定測試類

現有如下結構的測試類,在此基礎上進行示範:

測試開發基礎 mvn test | 利用 Maven Surefire Plugin 做測試用例基礎執行管理一、需求二、環境三、指定測試類四、指定測試方法五、失敗重試六、套件運作六、Pom 中指定預設執行七、寫在最後

3.1 mvn test

使用

mvn test

指令可以一次性執行所有的用例,執行完之後可以看到控制台中的結果:

測試開發基礎 mvn test | 利用 Maven Surefire Plugin 做測試用例基礎執行管理一、需求二、環境三、指定測試類四、指定測試方法五、失敗重試六、套件運作六、Pom 中指定預設執行七、寫在最後

執行完之後我們打開

target

,所有

maven

執行完的結果都會在

target

目錄下的

surefire-reports

下:

測試開發基礎 mvn test | 利用 Maven Surefire Plugin 做測試用例基礎執行管理一、需求二、環境三、指定測試類四、指定測試方法五、失敗重試六、套件運作六、Pom 中指定預設執行七、寫在最後

其中:

  • xml:可用于

    Jenkins

    解析,檔案與測試類對應,裡面的内容代表了測試用例的執行情況。
  • txt:測試結果的指令行輸出。

3.2 mvn -Dtest=${TestClass} test

mvn -Dtest=${TestClass}

指令可以指定運作測試類,例如

我這裡要運作

MavenDemo1Test

下的用例,就可以使用

mvn -Dtest=MavenDemo1Test test

import org.junit.jupiter.api.Test; ¨K31K           

執行測試:

$ mvn -Dtest=MavenDemo1Test test           

測試結果:

測試開發基礎 mvn test | 利用 Maven Surefire Plugin 做測試用例基礎執行管理一、需求二、環境三、指定測試類四、指定測試方法五、失敗重試六、套件運作六、Pom 中指定預設執行七、寫在最後

3.3 mvn -Dtest= ${TestClass1} , ${TestClass2} test

我們還可以以

逗号

分隔指定多個測試類執行,例如這裡我想執行

MavenDemo1Test

MavenDemo2Test

mvn -Dtest=MavenDemo1Test,MavenDemo2Test test           
測試開發基礎 mvn test | 利用 Maven Surefire Plugin 做測試用例基礎執行管理一、需求二、環境三、指定測試類四、指定測試方法五、失敗重試六、套件運作六、Pom 中指定預設執行七、寫在最後

3.4 mvn -Dtest=${TestCi*le} test

我們可以使用通配符來比對要執行的測試類,例如這裡我利用通配符同時指定測試類

MavenDemo1Test

MavenDemo2Test

$ mvn -Dtest=MavenDemo*Test test           
測試開發基礎 mvn test | 利用 Maven Surefire Plugin 做測試用例基礎執行管理一、需求二、環境三、指定測試類四、指定測試方法五、失敗重試六、套件運作六、Pom 中指定預設執行七、寫在最後

3.5 mvn -Dtest =$ {TestCi*le} , ${TestClass} test

當然,上述的測試方式組合起來也是可以的,例如這裡利用通配符執行

MavenDemo1Test

MavenDemo2Test

,再精确指定執行

MavenPackageDemoTest

:

$ mvn -Dtest=MavenDemo*Test,MavenPackageDemoTest test           
測試開發基礎 mvn test | 利用 Maven Surefire Plugin 做測試用例基礎執行管理一、需求二、環境三、指定測試類四、指定測試方法五、失敗重試六、套件運作六、Pom 中指定預設執行七、寫在最後

四、指定測試方法

4.1 mvn -Dtest=TestCircle#mytest test

除了可以指定執行測試類,還可以指定測試方法,

測試類

測試方法

之間用

#

隔開即可例如這個我想要指定執行

MavenDemo1Test

中的

test2

方法:

$ mvn -Dtest=MavenDemo1Test#test2 test           
測試開發基礎 mvn test | 利用 Maven Surefire Plugin 做測試用例基礎執行管理一、需求二、環境三、指定測試類四、指定測試方法五、失敗重試六、套件運作六、Pom 中指定預設執行七、寫在最後

4.2 mvn -Dtest=TestCircle#test* test

方法依然可以使用通配符,例如這裡要執行

MavenPackageDemoTest

中的方法

MavenPackageTest

,可以比對以 Test 結尾:

$ mvn -Dtest=MavenPackageDemoTest#*Test test           
測試開發基礎 mvn test | 利用 Maven Surefire Plugin 做測試用例基礎執行管理一、需求二、環境三、指定測試類四、指定測試方法五、失敗重試六、套件運作六、Pom 中指定預設執行七、寫在最後

4.3 mvn -Dtest=TestCircle#testOne+testTwo test

mvn 也可以指定某個測試類下面的多個方法,使用

+

号分隔方法,例如指定

MavenDemo1Test

下的方法

test1()

test2()

$ mvn -Dtest=MavenDemo1Test#test1+test2 test           
測試開發基礎 mvn test | 利用 Maven Surefire Plugin 做測試用例基礎執行管理一、需求二、環境三、指定測試類四、指定測試方法五、失敗重試六、套件運作六、Pom 中指定預設執行七、寫在最後

五、失敗重試

mvn 還提供了失敗重試,設定失敗重試的次數,當用例執行時直到用例成功或者失敗次數達到上限,指令如下:

mvn -Dsurefire.rerunFailingTestsCount=2 test           

可是遺憾的是,此功能隻支援 Junit4,官網給出的說明如下:

測試開發基礎 mvn test | 利用 Maven Surefire Plugin 做測試用例基礎執行管理一、需求二、環境三、指定測試類四、指定測試方法五、失敗重試六、套件運作六、Pom 中指定預設執行七、寫在最後

六、套件運作

在 Junit5 中,我們其實是可以利用

@RunWith(JUnitPlatform.class)

運作測試套件的,具體内容可參考文章:

單元測試架構怎麼搭?新版的Junit5有哪些神奇之處?

然而當我們使用mvn來執行套件時,

套件:

import MavenTestPackage1.MavenPackageDemoTest;
import org.junit.platform.runner.JUnitPlatform;
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.SuiteDisplayName;
import org.junit.runner.RunWith;

@RunWith(JUnitPlatform.class)
@SuiteDisplayName("測試套件")
@SelectClasses({
        MavenPackageDemoTest.class,MavenDemo1Test.class
}
)
public class TestSuite {

}           

mvn 指令:

mvn -Dtest=TestSuite test           

會出現如下報錯:

測試開發基礎 mvn test | 利用 Maven Surefire Plugin 做測試用例基礎執行管理一、需求二、環境三、指定測試類四、指定測試方法五、失敗重試六、套件運作六、Pom 中指定預設執行七、寫在最後

據說是因為 surefire 插件的版本問題,當切換到 2.19 版本的時候,套件執行成功了,可是 mvn test 指令又失敗了,這顯然不是我們想要的結果,于是乎開始了 Google 之路。。。

最終找到了一個相對合理的解釋!抱歉,又要失望了,Google 到别人的解釋如下(已翻譯完成~):

測試開發基礎 mvn test | 利用 Maven Surefire Plugin 做測試用例基礎執行管理一、需求二、環境三、指定測試類四、指定測試方法五、失敗重試六、套件運作六、Pom 中指定預設執行七、寫在最後

簡單的說就是

surefire

插件暫時還不支援在

Junit5

下執行繼承至

Junit4

@RunWith

,是以還是需要有心人出來解決這個問題才行了~~

六、Pom 中指定預設執行

除了使用指令行,我們還可以在 pom 中指定我們預設需要執行的類或者不需要執行的類。

例如這裡我預設隻想執行

MavenPackageDemoTest

,而另外兩個

MavenDemo

開頭的測試類我都不想執行,這個時候可以在

pom

中做如下配置,在

surefire

插件下添加

configuration

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <version>3.0.0-M3</version>
   <configuration>
       <includes>
           <include>MavenPackageDemoTest.java</include>
       </includes>
       <excludes>
           <exclude>MavenDemo*.java</exclude>
       </excludes>
   </configuration>
</plugin>           

執行

mvn test

,檢視結果:

測試開發基礎 mvn test | 利用 Maven Surefire Plugin 做測試用例基礎執行管理一、需求二、環境三、指定測試類四、指定測試方法五、失敗重試六、套件運作六、Pom 中指定預設執行七、寫在最後

從結果中可以看到僅僅執行了我們預設指定的

MavenPackageDemoTest

case

,其餘以

MavenDemo

開頭的測試類均未被執行。

七、寫在最後

這裡介紹了

maven-surefire-plugin

插件在測試執行中的一些常見用法,還有很多其他的用法,例如:

  • 使用很複雜的格式比對
  • 控制在不同級别上的多線程和多程序執行

    後續将慢慢研究補充,有興趣也可直接參考官網學習。

更多技術文章分享及測試資料