首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 測試用例編寫指南:原則、覆蓋率與 JUnit 實戰

     編輯:程式設計疑難解答

測試用例本質

測試用例是輸入數據集合,每組數據驅動被測代碼執行,通過斷言驗證輸出是否符合預期。核心目標:發現缺陷、保證質量、支撐重構。

編寫原則:覆蓋率導向

1. 語句覆蓋

每行代碼至少執行一次。

2. 分支覆蓋

每個判斷的真/假分支均執行到。
示例:


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。

3. 路徑覆蓋

覆蓋所有可能執行路徑。上例有 4 條路徑(a-c, a-d, b-c, b-d),需 4 個用例。
現實妥協:路徑數呈指數增長,通常以分支覆蓋為基線,關鍵邏輯補充路徑覆蓋。

邊界值與等價類分區

  • 邊界值:0, 1, -1, MAX, MIN, null, 空集合 等。
  • 等價類:將輸入域劃分為有效/無效類,各取代表值。

JUnit 5 實戰範例


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

最佳實踐建議

  1. 命名規範:方法名_條件_預期結果,如 add_positiveNumbers_returnsSum。
  2. 獨立性:用例間無依賴,可任意順序並行運行。
  3. 快速反饋:單元測試毫秒級完成,集成測試分離配置。
  4. 持續集成:納入 CI 流水線,覆蓋率門檻(如 80%+)。

語言無關性

測試用例編寫原則(覆蓋率、邊界、等價類)與語言無關,Java/JUnit、Python/pytest、Go/testing、JS/Jest 均遵循同一核心邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved