Junit5 是目前最新的框架,其由三個模組組成
- JUnit Platform
- 在 JVM 上啟動測試框架的基礎,在 Junit 之外的框架都能接入
- JUnit Jupiter
- Junit5 的核心,內部包含了一個測試引擎,用於在 JUnit Platform 上運行
- JUnit Vintage
- …
___________________________________________________________________________________________________________________________________
| |
| |
| Junit5 |
| ________________________ ________________________ ________________________ |
| | | | | | | |
| | | | | | | |
| | JUnit Platform | + | JUnit Jupiter | + | JUnit Vintage | |
| | | | | | | |
| |_______________________| |_______________________| |_______________________| |
| |
| |
| |
| |
|__________________________________________________________________________________________________________________________________|
Srping boot 2.4 以上版本移除預設對 Vitage 的依賴,所以不能使用 Junit4 的功能
Junit5 常用註解
注解 | 描述 |
---|---|
@Test | 表示當前方法是測試方法 |
@ParameterizedTest | 表示方法是參數化測試 |
@RepeatedTest | 表示方法可重複執行 |
@DisplayName | 在測試類別或測試方法設置顯示名稱 |
@BeforeEach | 在每個單元測試前執行 |
@AfterEach | 在每個單元測試後執行 |
@BeforeAll | 在所有單元測試前執行 |
@AfterAll | 在所有單元測試後執行 |
@Tag | 表示單元測試類別 |
@Disable | 表示測試類或方法不執行 |
@Timeout | 當測試方法運行超過指定時間將回傳錯誤 |
@ExtendWith | 測試類或方法提供擴展類引用 |
Assertions 斷言
斷言方法都是來至 org.junit.jupiter.api.Assertions
的靜態方法。可用來驗證業務邏輯是否正確。
基本
方法 | 描述 |
---|---|
assertEquals | 判別兩個物件是否相等 |
assertNotEquals | 判別兩個物件是否不相等 |
assertSame | 判別兩個物件引用是否指向同一個物件 |
assertNotSame | 判別兩個物件引用是否指向非同一個物件 |
assertTrue | 判別傳入 boolean 值是否為 true |
assertFalse | 判別傳入 boolean 值是否為 false |
assertNull | 判別物件是否為 null |
assertNotNull | 判別物件是否為非 null |
數組斷言
透過 assertArrayEquals
方法來判斷兩個對像或原始類型的數組是否相等
@Test
@DisplayName("array assertion")
public void arrayTest() {
assertArrayEquals(new int[]{1, 2}, new int[] {1, 2});
}
組合斷言
透過 assertAll
可傳入多個 org.junit.jupiter.api.Executable
function interface 的方式做為要驗證的斷言。
@Test
@DisplayName("assert all")
public void allTest() {
assertAll("Math",
() -> assertEquals(2, 1 + 1),
() -> assertTrue(1 > 0)
);
}
異常斷言
使用 assertThrows
搭配 lambda 語法
@Test
@DisplayName("Assert Exception")
public void exceptionTest() {
ArithmeticException exception = Assertions.assertThrows( ArithmeticException.class, () -> System.out.println(1 % 0));
}
參數化測試
為了讓測試的參數有多種可能。可以使用不同的參數進行多個單元測試,而不需要每新增一個參數就添加一個單元測試,省去很多不必要的重複代碼等。
方法 | 描述 |
---|---|
@ValueSource | 指定參數來源,基本上支援 JAVA 中基礎類和 class、String 類別 |
@NullSource | 提供 null 型態參數 |
@EnumSource | 提供 Enum 型態參數 |
@CsvFileSource | 讀取提供的 CSV 檔案內容作為參數值 |
@MethodSource | 獲取指定方法的回傳值作為參數,但這需要是一個 stream 類型 |
@ParameterizedTest
@ValueSource(strings = {"one", "two", "three"})
public void parameterizedTest1(String string) {
Assertions.assertTrue(StringUtils.isNotBlank(string));
}
@ParameterizedTest
@MethodSource("method")
public void testWithExplicitLocalMethodSource(String name) {
Assertions.assertNotNull(name);
}
static Stream<String> method() {
return Stream.of("apple", "banana");
}