iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0

Junit 5 常用註解

  • @Test:標註方法為測試程試
  • @BeforeEach:每項測試項目開始前都會執行一次
  • @AfterEach:每項測試項目結束都會執行一次
  • @BeforeAll:測試開始之前執行一次
  • @AfterAll:測試結束之後執行一次
  • @Disabled:不列入測試項目
  • @DisplayName:測試結果顯示特定名稱

延伸先前計算相關的方法測試,我們補齊加減乘除各種方法跟測試

public class Calculator {

    public int add(int x, int y) {
        return x + y;
    }

    public int subtract(int x, int y) {
        return x - y;
    }

    public int multiply(int x, int y) {
        return x * y;
    }

    public int divide(int x, int y) {
        if (y == 0) {
            throw new IllegalArgumentException("Cannot divide by zero");
        }
        return x / y;
    }
}

測試類也加上對應的測試

class CalculatorTest {
    @Test
    public void testAdd() {
        Calculator calc = new Calculator();
        int result = calc.add(1, 1);
        assertEquals(2, result);
    }

    @Test
    public void testSubtract() {
        Calculator calc = new Calculator();
        int result = calc.subtract(3, 1);
        assertEquals(2, result);
    }

    @Test
    public void testMultiply() {
        Calculator calc = new Calculator();
        int result = calc.multiply(3, 2);
        assertEquals(6, result);
    }

    @Test
    public void testDivide() {
        Calculator calc = new Calculator();
        int result = calc.divide(2, 2);
        assertEquals(1, result, "result should be 1");
        assertThrows(IllegalArgumentException.class, () -> {
            calc.divide(2, 0);
        });
    }
}

把這些註解都應用到我們的測試案例裡

class CalculatorTest {

    private Calculator calc;

    @BeforeEach
    void initCalculator() {
        System.out.println("-----每個項目執行前我都執行一次 @BeforeEach-----");
        calc = new Calculator();
    }

    @AfterEach
    void tearDownCalculator() {
        System.out.println("-----每個項目執行完我都執行一次 @AfterEach-----");
        calc = null;
    }

    @BeforeAll
    static void beforeAll() {
        System.out.println("=====全部開始前是我 @BeforeAll=====");
    }

    @AfterAll
    static void afterAll() {
        System.out.println("=====全部結束後是我 @AfterAll=====");
    }

    @Test
    @DisplayName("加法測試")
    public void testAdd() {
        System.out.println("執行 testAdd()");
        int result = calc.add(1, 1);
        assertEquals(2, result);
    }

    @Test
    @DisplayName("減法測試")
    public void testSubtract() {
        System.out.println("執行 testSubtract()");
        int result = calc.subtract(3, 1);
        assertEquals(2, result);
    }

    @Test
    public void testMultiply() {
        System.out.println("執行 testMultiply()");
        int result = calc.multiply(3, 2);
        assertEquals(6, result);
    }

    @Test
    @Disabled
    public void testDivide() {
        System.out.println("執行 testDivide()");
        int result = calc.divide(2, 2);
        assertEquals(1, result, "result should be 1");
        assertThrows(IllegalArgumentException.class, () -> {
            calc.divide(2, 0);
        });
    }
}
  • 可以觀察到前面的方法因為都需要初始化 Calculator ,所以可以運用到 @BeforeEach 這個註解來幫我們讓程式碼更簡潔。

  • 每個測試結束後也可以加入 @AfterEach 來進行特定處理,這邊就假設我們需要釋出空間把 calc 清空

  • 依據測試需要也可以用 @BeforeAll @AfterAll 可以在最一開始及最後進行一些處理,不管你執行的是單項測試或是全部一起,這兩種都會最先和最後被執行。

  • @DisplayName 則是可以直接改變執行結果顯示的測試名稱

  • @Disabled 會跳過該項目,不被執行,但還是會在執行結果中顯示有被禁用

把每個執行都加上 log 之後可以看一下執行結果

https://ithelp.ithome.com.tw/upload/images/20240927/201509779ppBP4lUyD.png

可以看到對應的 log 就知道那些執行的順序,是否回想起這就是 AOP 的應用了!! 其實在測試撰寫的時候也都會用到這樣的概念。


Ref:

相關文章也會同步更新我的部落格,有興趣也可以在裡面找其他的技術分享跟資訊。


上一篇
Day 18 - UnitTest (2) - Junit 5 測試方法與斷言應用
下一篇
Day 20 - UnitTest (4) - Service/Dao 層測試撰寫
系列文
關於我和 Spring Boot 變成家人的那件事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言