Junit 5 常用註解

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;
}
}

測試類也加上對應的測試

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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);
});
}
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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 的應用了!! 其實在測試撰寫的時候也都會用到這樣的概念。


參考資料: