上一篇簡單說明基本測試的概念跟要怎麼建立測試程式在 Spring Boot 之後,這邊就來接著提供一些測試的設計原則和一些方法。
如果以上一篇的範例來看,我們要測試加法的功能會這樣設計就是應用到 3A 原則
class CalculatorTest {
@Test
void testAdd() {
// Arange
Calculator calc = new Calculator();
int x = 1;
int y = 1;
// Act
int result = calc.add(x, y);
// Assert
assertEquals(2, result);
}
}
斷言方法 | 說明 |
---|---|
assertEquals(A, B) | 預期 A 和實際 B 值相等,等同使用 equals() 方法比較,A和B 是基本類型 |
assertNotEquals(A, B) | 預期 A 和實際 B 值不相等 |
assertTrue(A) | A 條件判斷為 true |
assertFalse(A) | A 條件判斷為 false |
assertNull(A) | A 物件為空值 |
assertNotNull(A) | A 物件不為空值 |
assertThrows(exception, method) | 預期拋出 exception,method 為執行的方法,當執行該方法拋出對應的 exception 就會通過 |
如果接著我們打算擴充 Calculator 並且進行測試,多一個除法的功能,並且除以0會拋出 IllegalArgumentException
public int divide(int x, int y) {
if (y == 0) {
throw new IllegalArgumentException("不能除以 0");
}
return x / y;
}
這邊就可以應用到那面那些方法,這邊也加入 message 可以協助我們沒通過出錯時會跳出對應的訊息,像是我這邊在 assertEquals, assertNotEquals 後面加入的訊息
@Test
public void testDivide() {
Calculator calc = new Calculator();
int result = calc.divide(2,2);
assertEquals(1, result, "result should be 1");
assertNotEquals(0, result, "result should not be 0");
assertTrue(result > 0);
assertFalse(result != 1);
assertThrows(IllegalArgumentException.class, () -> {
calc.divide(2,0);
});
}
正常上面的 assert 都會通過。
如果 assertEquals 有出錯,假設我們把 1 改成 2 assertEquals(2, result, "result should be 1");
就可以看到 console 有把這段錯誤提示印出來
特別要說明就是 assertThrows()
這個方法需要放入第1個參數是 Exception.class,第2個用 lamda 表達式,把要執行驗證的方法加入到 ( )→{ }
的 { } 裡面。
大致上基本的設計原則還有 Junit 5 的斷言用法就介紹到這邊,下一篇會介紹進階使用 Mock 的部分。
這邊可以小補充一下 Intellij 有提供一個功能可以知道我們測試的覆蓋程度,這對於撰寫測試時式一個很好的指標參考,如果你的方法裡面有很多判斷或是條件,他會告訴你目前寫的測試大概涵蓋多少,如果把我們的剛剛寫的範例拿來測試。
在要執行的方法點選右鍵,可以看到用 Run test with Coverage
可以看到有顯示目前覆蓋的百分比,只有 50 %
可以直接點擊右方項目跳到被測試的區域,並且給予顏色標記哪些有被測試到。
這邊注意到因為我們點 testDivide 所以沒有執行到 testAdd,所以他也標記出 add 方法沒被測。
解開註解後,包含 Exception 的測試後,確實覆蓋率有提升
剩下沒滿足是因為我們只有執行 testDivide ,如果點選整個 CalculatorTest 的測試就會達到 100%
Ref:
相關文章也會同步更新我的部落格,有興趣也可以在裡面找其他的技術分享跟資訊。