一、簡介
與以前版本的JUnit不同,JUnit 5由來自三個不同子項目的幾個不同模塊組成。
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
- JUnit Platform是基於JVM的運行測試的基礎框架在,它定義了開發運行在這個測試框架上的TestEngine API。此外該平臺提供了一個控制檯啓動器,可以從命令行啓動平臺,可以爲Gradle和 Maven構建插件,同時提供基於JUnit 4的Runner。
- JUnit Jupiter是在JUnit 5中編寫測試和擴展的新編程模型和擴展模型的組合.Jupiter子項目提供了一個TestEngine在平臺上運行基於Jupiter的測試。
- JUnit Vintage提供了一個TestEngine在平臺上運行基於JUnit 3和JUnit 4的測試。
需要java8或更高版本的jdk
二、環境
主流IDE都支持(IntelliJ IDEA,Eclipse, NetBeans和Visual Studio Code),可用(Gradle,Maven和 Ant)等工具輕鬆支持JUnit平臺。
由於我使用都是Eclipse IDE for Java Developers。Version: 2018-12 (4.10.0)。所以沒法全都講。
Eclipse自帶了。如圖所示
三、Hello JUnit
本文代碼詳見github倉庫:https://github.com/landbroken/JavaLearning/tree/master/com.lyl.JUnit
待測試類
package com.lyl.JUnit;
public class Calculate {
public int add(int a,int b){
return a+b;
}
public int minus(int a , int b){
return a-b;
}
}
測試類
package com.lyl.JUnit;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
/**
* 第一個測試用例
* @author lyl
*
*/
public class FirstTests {
private final Calculate cal = new Calculate();
//@Test:表示方法是一種測試方法。
//與JUnit 4的@Test註釋不同,此註釋不會聲明任何屬性,因爲JUnit Jupiter中的測試擴展基於它們自己的專用註釋進行操作。
//除非被覆蓋,否則這些方法是繼承的。
@Test
public void testAdd() {
int result = cal.add(3, 3);
assertEquals(6,result);
}
@Test
public void testMinus() {
int result = cal.minus(5, 2);
assertEquals(3,result);
}
}
運行方法:右鍵-Run As/Coverage As-JUnit Test
運行結果:
如果出現NoClassDefFoundError問題,可能是之前包沒添加對。重新添加一下,或見參考文獻[4]。
四、編寫測試
4.1 註釋
@Test
表示方法是一種測試方法。與JUnit 4的@Test註釋不同,此註釋不會聲明任何屬性,因爲JUnit Jupiter中的測試擴展基於它們自己的專用註釋進行操作。除非被覆蓋,否則這些方法是繼承的。
@ParameterizedTest
表示方法是參數化測試。除非被覆蓋,否則這些方法是繼承的。
@RepeatedTest
表示方法是重複測試的測試模板。除非被覆蓋,否則這些方法是繼承的。
@TestFactory
表示方法是動態測試的測試工廠。除非被覆蓋,否則這些方法是繼承的。
@TestTemplate
表示方法是設計爲多次調用的測試用例的模板,具體取決於註冊提供程序返回的調用上下文的數量。除非被覆蓋,否則這些方法是繼承的。
@TestMethodOrder
用於配置帶註釋的測試類的測試方法執行順序 ; 類似於JUnit 4的@FixMethodOrder。這樣的註釋是繼承的。
@TestInstance
用於爲帶註釋的測試類配置測試實例生命週期。這樣的註釋是繼承的。
@DisplayName
聲明測試類或測試方法的自定義顯示名稱。這樣的註釋不是繼承的。
@DisplayNameGeneration
聲明測試類的自定義顯示名稱生成器。這樣的註釋是繼承的。
@BeforeEach
表示該註釋的方法應該被執行之前 的每個 @Test,@RepeatedTest,@ParameterizedTest,或@TestFactory方法在當前類; 類似於JUnit 4的@Before。除非被覆蓋,否則這些方法是繼承的。
@AfterEach
表示該註釋的方法應該被執行之後 每個 @Test,@RepeatedTest,@ParameterizedTest,或@TestFactory方法在當前類; 類似於JUnit 4的@After。除非被覆蓋,否則這些方法是繼承的。
@BeforeAll
表示該註釋的方法應該被執行之前 所有 @Test,@RepeatedTest,@ParameterizedTest,和@TestFactory方法在當前類; 類似於JUnit 4的@BeforeClass。這些方法是繼承的(除非它們被隱藏或覆蓋)並且必須是static(除非使用“每類” 測試實例生命週期)。
@AfterAll
表示該註釋的方法應該被執行之後 的所有 @Test,@RepeatedTest,@ParameterizedTest,和@TestFactory方法在當前類; 類似於JUnit 4的@AfterClass。這些方法是繼承的(除非它們被隱藏或覆蓋)並且必須是static(除非使用“每類” 測試實例生命週期)。
@Nested
表示帶註釋的類是非靜態嵌套測試類。除非使用“每類” 測試實例生命週期,否則不能在測試類中直接使用@BeforeAll和@AfterAll方法。這樣的註釋不是繼承的。@Nested
@Tag
用於在類或方法級別聲明用於過濾測試的標記 ; 類似於TestNG中的測試組或JUnit 4中的類別。此類註釋在類級別繼承,但不在方法級別繼承。
@Disabled
用於禁用測試類或測試方法; 類似於JUnit 4的@Ignore。這樣的註釋不是繼承的。
@ExtendWith
用於以聲明方式註冊擴展。這樣的註釋是繼承的。
@RegisterExtension
用於通過字段以編程方式註冊擴展。除非它們被遮蔽,否則這些字段是繼承的。
@TempDir
用於通過生命週期方法或測試方法中的字段注入或參數注入來提供臨時目錄 ; 位於org.junit.jupiter.api.io包裝中。