單元測試

September 6, 2021

Junit5 是目前最新的框架,其由三個模組組成

___________________________________________________________________________________________________________________________________
|                                                                                                                                  | 
|                                                                                                                                  |
|                                            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");
}