測試用例是輸入數據集合,每組數據驅動被測代碼執行,通過斷言驗證輸出是否符合預期。核心目標:發現缺陷、保證質量、支撐重構。
每行代碼至少執行一次。
每個判斷的真/假分支均執行到。
示例:
void foo(int i, int j) {
if (i > 0) { /* a */ } else { /* b */ }
if (j > 0) { /* c */ } else { /* d */ }
}
分支覆蓋需至少 2 個用例:
(i=1, j=1) 覆蓋 a,c;(i=-1, j=-1) 覆蓋 b,d。
覆蓋所有可能執行路徑。上例有 4 條路徑(a-c, a-d, b-c, b-d),需 4 個用例。
現實妥協:路徑數呈指數增長,通常以分支覆蓋為基線,關鍵邏輯補充路徑覆蓋。
0, 1, -1, MAX, MIN, null, 空集合 等。
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import static org.junit.jupiter.api.Assertions.*;
class CalculatorTest {
private Calculator calc = new Calculator();
@ParameterizedTest
@CsvSource({
"1, 1, 2", // 正常
"-1, -1, -2", // 負數
"0, 0, 0", // 邊界
"2147483647, 1, -2147483648" // 溢出
})
void testAdd(int a, int b, int expected) {
assertEquals(expected, calc.add(a, b));
}
@Test
void testDivideByZero() {
assertThrows(ArithmeticException.class, () -> calc.divide(1, 0));
}
}
方法名_條件_預期結果,如 add_positiveNumbers_returnsSum。測試用例編寫原則(覆蓋率、邊界、等價類)與語言無關,Java/JUnit、Python/pytest、Go/testing、JS/Jest 均遵循同一核心邏輯。