單元測試(unit testing),是指對軟體中的最小可測試單元進行檢查和驗證。
總的來說,單元就是人為規定的最小的被測功能模塊。單元測試是在軟體開發過程中要進行的最低級別的測試活動,軟體的獨立單元將在與程序的其他部分相隔離的情況下進行測試。
那單元測試框架該怎麼搭呢?JUnit5又能給我們帶來怎樣的驚喜呢?首先我們來看看什麼是Junit5,再看看如何使用吧~
What is Junit5?
Junit5簡介
什麼是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的新特性
特性與JUnit4註解比較
JUnit5的 新特性有:嵌套單元測試、Lambda支持、參數化測試、重複測試、動態測試
JUnit 4 與 JUnit 5 中的註解比較
|
|
|
Junit5 |
Junit4 |
說明 |
@Test |
@Test |
被註解的方法是一個測試方法。與 JUnit 4 相同。 |
@BeforeAll |
@BeforeClass |
被註解的(靜態)方法將在當前類中的所有 @Test 方法前執行一次。 |
@BeforeEach |
@Before |
被註解的方法將在當前類中的每個 @Test 方法前執行。 |
@AfterEach |
@After |
被註解的方法將在當前類中的每個 @Test 方法後執行。 |
@AfterAll |
@AfterClass |
被註解的(靜態)方法將在當前類中的所有 @Test 方法後執行一次。 |
@Disabled |
@Ignore |
被註解的方法不會執行(將被跳過),但會報告為已執行。 |
JUnit 5 常用註解
Junit5常用註解展示
|
|
註解 |
說明 |
@Test |
表明一個測試方法 |
@DisplayName |
測試類或方法的顯示名稱 |
@BeforeEach |
表明在單個測試方法運行之前執行的方法 |
@AfterEach |
表明在單個測試方法運行之後執行的方法 |
@BeforeAll |
表明在所有測試方法運行之前執行的方法 |
@AfterAll |
表明在所有測試方法運行之後執行的方法 |
@Disabled |
禁用測試類或方法 |
@Tag |
為測試類或方法添加標籤 |
@RepeatedTest |
額外重複執行 |
@Nested |
嵌套測試 |
實操演示
1)創建maven工程XUnit,pom.xml中添加Junit5的依賴
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.5.2</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-runner</artifactId>
<version>1.5.1</version>
</dependency>
複製代碼
2)其餘的XUnit框架通用的設計運行規則可參考博客: 如何利用xUnit框架對測試用例進行維護-xUnit簡介及基本使用方法(基於Junit4)
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(JUnitPlatform.class) |
執行套件 |
@SelectPackage({「com.packageA」,「com.packageB」}) |
創建測試套件 |
@SelectClasses( {a.class,b.class,c.class} ) |
創建測試套件 |
@IncludePackage(「包名」) |
過濾需要執行的測試包 |
@ExcludePackages |
過濾不需要執行的測試包 |
@IncludeClassNamePatterns |
過濾需要執行的測試類 |
@ExcludeClassNamePatterns |
過濾不需要執行的測試類 |
@IncludeTags(「production」) |
過濾需要執行的測試方法 |
@ExcludeTags(「PROD」) |
過濾不需要執行的測試方法 |
@RunWith 是從Junit4遷移過來的,@RunWith 連同它的參數 JUnitPlatform.class(一個基於 JUnit 4 且理解 JUnit Platform 的 Runner)讓您可以在 Eclipse 內運行 JUnit Jupiter 單元測試。Eclipse 尚未原生支持 JUnit 5。未來,Eclipse 將提供原生的 JUnit 5 支持,那時我們不再需要此註解;Junit5官方給出了替代它的註解:
@RunWith+@SelectPackages 有兩個包testcasedemo, junit5demo,利用@RunWith+@SelectPackages將包中測試類依次運行
套件類:
測試結果:
@RunWith+@SelectPackages+@IncludePackage
@RunWith+@SelectPackages+@IncludePackages配合使用過濾出需要執行的測試包testcasedemo.demo2
套件類:
測試結果:
@RunWith+@SelectPackages+@ExcludePackages
@RunWith+@SelectPackages+@ExcludePackages配合使用過濾出不需要執行的測試包testcasedemo.demo2
套件類:
測試結果:
@RunWith+@SelectPackages+@IncludeClassNamePatterns
將junit5demo包下的TestJunit5demo和testcasedemo.demo2所有測試類過濾出來並執行
套件類:
測試結果
@RunWith+@SelectPackages+@IncludeTags 在testcasedemo.demo2.TestDemo2的方法testDemo2上加上註解@Tag:
過濾並執行方法testDemo2:
套件類:
測試結果:
參考文檔
Junit5官網:
https://junit.org/junit5/docs/current/user-guide/#overview
IBM Developer:
https://www.ibm.com/developerworks/cn/java/j-introducing-junit5-part1-jupiter-api/index.html
https://www.ibm.com/developerworks/cn/java/j-junit5/index.html