本文為霍格沃茲測試學院優秀學員 Junit 學習筆記。測試開發技能進階,文末加群。
一、Junit 簡介與架構
什麼是 Junit5,在 Junit5 的官方介紹文檔中這寫到:
Junit5 由JUnit Platform + JUnit Jupiter + JUnit Vintage3部分構成,借用 IBM Developer 的一張圖來說明 JUnit 5 的架構:
JUnit Platform:
其主要作用是在 JVM 上啟動測試框架。它定義了一個抽象的 TestEngine API 來定義運行在平臺上的測試框架;也就是說其他的自動化測試引擎或開發人員⾃⼰定製的引擎都可以接入 Junit 實現對接和執行。同時還支持通過命令行、Gradle 和 Maven 來運行平臺(這對於我們做自動化測試至關重要)。
JUnit Jupiter:
這是 Junit5 的核心,可以看作是承載 Junit4 原有功能的演進,包含了 JUnit 5 最新的編程模型和擴展機制;很多豐富的新特性使 JUnit ⾃動化測試更加方便、功能更加豐富和強大。也是測試需要重點學習的地方;Jupiter 本身也是⼀一個基於 Junit Platform 的引擎實現,對 JUnit 5 而言,JUnit Jupiter API 只是另一個 API!。
JUnit Vintage:
Junit 發展了10數年,Junit 3 和 Junit 4 都積累了大量的⽤用戶,作為新一代框 架,這個模塊是對 JUnit3,JUnit4 版本兼容的測試引擎,使舊版本 junit 的⾃動化測試腳本也可以順暢運行在 Junit5 下,它也可以看作是基於 Junit Platform 實現的引擎範例。
JUnit 5 對 Java 運行環境的最低要求是 Java 8。
二、Junit5 的新特性
- 嵌套單元測試
- Lambda支持
- 參數化測試
- 重複測試
- 動態測試
JUnit 4 與 JUnit 5 中的註解比較
三、JUnit 5 常用註解
3.1 Junit5 常用註解
3.2 實操演示
- 1)創建 maven 工程 XUnit,pom.xml中添加Junit5的依賴。
<code> <dependency>
<groupid>org.junit.platform/<groupid>
<artifactid>junit-platform-launcher/<artifactid>
<version>1.5.2/<version>
<scope>test/<scope>
/<dependency>
<dependency>
<groupid>org.junit.jupiter/<groupid>
<artifactid>junit-jupiter-engine/<artifactid>
<version>5.5.2/<version>
<scope>test/<scope>
/<dependency>
<dependency>
<groupid>org.junit.vintage/<groupid>
<artifactid>junit-vintage-engine/<artifactid>
<version>5.5.2/<version>
<scope>test/<scope>
/<dependency>/<code>
- 2)其餘的 XUnit 框架通用的設計運行規則可參考:《如何利用 xUnit 框架對測試用例進行維護》。
- 3)添加用例@Test,再在用例執行前後添加@BeforeEach、@AfterEach:
- 運行結果:
- 4)在測試類執行前後添加@BeforeAll和@AfterAll:
- 測試結果:
- 5)在測試用例test1上加入註解@Disabled,使test1失效。
- 測試結果:
- 從測試結果中我們可以看到 test1 用例被 ignore,沒有被執行。
- 6)分別將test1和test2用@DisplayName加上用例展示名稱。
- 測試結果:
- 7)對測試用例2加上註解@RepeatedTest,使其額外重複執行3次:
- 測試結果:
- 從測試結果中我們可以看到測試用例2被額外重複執行了3次
- 8)對於@Nested嵌套執行舉例如下:
- 測試結果:
- 由測試結果可以看出,@Nested的執行順序為先執行@Nested嵌套外層的用例,再以倒敘形式執行@Nested用例,然後再執行第二層嵌套的用例:外層->倒敘嵌套->第二層嵌套。
四、Junit5 套件執行
@RunWith 是從Junit4遷移過來的,@RunWith 連同它的參數 JUnitPlatform.class(一個基於 JUnit 4 且理解 JUnit Platform 的 Runner)讓您可以在 Eclipse 內運行 JUnit Jupiter 單元測試。Eclipse 尚未原生支持 JUnit 5。未來,Eclipse 將提供原生的 JUnit 5 支持,那時我們不再需要此註解;Junit5官方給出了替代它的註解:
4.1 @RunWith+@SelectPackages
- 有兩個包testcasedemo, junit5demo,利用 @RunWith+@SelectPackages 將包中測試類依次運行。
套件類:
測試結果:
4.2 @RunWith+@SelectPackages+@IncludePackages
- @RunWith+@SelectPackages+@IncludePackages配合使用過濾出需要執行的測試包testcasedemo.demo2。
套件類:
測試結果:
4.3 @RunWith+@SelectPackages+@ExcludePackages
- @RunWith+@SelectPackages+@ExcludePackages配合使用過濾出不需要執行的測試包testcasedemo.demo2。
套件類:
測試結果:
4.4 @RunWith+@SelectPackages+@IncludeClassNamePatterns
- 將 junit5demo 包下的 TestJunit5demo 和 testcasedemo.demo2 所有測試類過濾出來並執行。
套件類:
測試結果:
4.5 @RunWith+@SelectPackages+@IncludeTags
在testcasedemo.demo2.TestDemo2的方法testDemo2上加上註解@Tag:
過濾並執行方法testDemo2:
套件類:
測試結果:
閱讀更多 霍格沃茲軟件測試學院 的文章