本文為霍格沃茲測試學院優秀學員學習筆記。
一、需求
在測試工作場景中,經常會遇到下面的問題:
- 執行自動化測試用例的時候,隻想指定某個測試類,或者某個方法,又或者某一類用例等,怎麼辦?
- 想要和 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>
三、指定測試類
現有如下結構的測試類,在此基礎上進行示範:

3.1 mvn test
使用
mvn test
指令可以一次性執行所有的用例,執行完之後可以看到控制台中的結果:
執行完之後我們打開
target
,所有
maven
執行完的結果都會在
target
目錄下的
surefire-reports
下:
其中:
- 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
測試結果:
3.3 mvn -Dtest= ${TestClass1} , ${TestClass2} test
我們還可以以
逗号
分隔指定多個測試類執行,例如這裡我想執行
MavenDemo1Test
和
MavenDemo2Test
mvn -Dtest=MavenDemo1Test,MavenDemo2Test test
3.4 mvn -Dtest=${TestCi*le} test
我們可以使用通配符來比對要執行的測試類,例如這裡我利用通配符同時指定測試類
MavenDemo1Test
MavenDemo2Test
$ mvn -Dtest=MavenDemo*Test test
3.5 mvn -Dtest =$ {TestCi*le} , ${TestClass} test
當然,上述的測試方式組合起來也是可以的,例如這裡利用通配符執行
MavenDemo1Test
MavenDemo2Test
,再精确指定執行
MavenPackageDemoTest
:
$ mvn -Dtest=MavenDemo*Test,MavenPackageDemoTest test
四、指定測試方法
4.1 mvn -Dtest=TestCircle#mytest test
除了可以指定執行測試類,還可以指定測試方法,
測試類
測試方法
之間用
#
隔開即可例如這個我想要指定執行
MavenDemo1Test
中的
test2
方法:
$ mvn -Dtest=MavenDemo1Test#test2 test
4.2 mvn -Dtest=TestCircle#test* test
方法依然可以使用通配符,例如這裡要執行
MavenPackageDemoTest
中的方法
MavenPackageTest
,可以比對以 Test 結尾:
$ mvn -Dtest=MavenPackageDemoTest#*Test test
4.3 mvn -Dtest=TestCircle#testOne+testTwo test
mvn 也可以指定某個測試類下面的多個方法,使用
+
号分隔方法,例如指定
MavenDemo1Test
下的方法
test1()
test2()
。
$ mvn -Dtest=MavenDemo1Test#test1+test2 test
五、失敗重試
mvn 還提供了失敗重試,設定失敗重試的次數,當用例執行時直到用例成功或者失敗次數達到上限,指令如下:
mvn -Dsurefire.rerunFailingTestsCount=2 test
可是遺憾的是,此功能隻支援 Junit4,官網給出的說明如下:
六、套件運作
在 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
會出現如下報錯:
據說是因為 surefire 插件的版本問題,當切換到 2.19 版本的時候,套件執行成功了,可是 mvn test 指令又失敗了,這顯然不是我們想要的結果,于是乎開始了 Google 之路。。。
最終找到了一個相對合理的解釋!抱歉,又要失望了,Google 到别人的解釋如下(已翻譯完成~):
簡單的說就是
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
,檢視結果:
從結果中可以看到僅僅執行了我們預設指定的
MavenPackageDemoTest
case
,其餘以
MavenDemo
開頭的測試類均未被執行。
七、寫在最後
這裡介紹了
maven-surefire-plugin
插件在測試執行中的一些常見用法,還有很多其他的用法,例如:
- 使用很複雜的格式比對
-
控制在不同級别上的多線程和多程序執行
後續将慢慢研究補充,有興趣也可直接參考官網學習。