網頁

2021/6/2

Unit Test 程式碼測試覆蓋率 code test coverage

單元測試(Unit Testing)的程式碼測式覆蓋率(test coverage)的意思如下。


     Code coverage         Lines of code executed (測試執行的的程式碼行數)
    (test coverage) = ──────────────────────────────────────────────────────
                           Total number of lines (程式碼總行數)

例如以下為要被測試的方法isLongName(String name)

isLongName()

public static boolean isLongName(String name) {
    if (name.length() > 5) {
        return true; // 這行沒被下面的testIsLongName()測試到。
    }
    return false;
}

testIsLongName()用來測試上面的測試程式碼。

testIsLongName()

public void testIsLongName {
    boolean result = isLongName("John");
    assert false == result;
}

被測程式isLongName(String name)的行數為6行(含大括弧),而有被測試程式執行過的行數有5行,所以測試覆蓋率為:5/6 * 100% = 83.3%。


此時若修改isLongName(String name)的邏輯為直接回傳判斷式的結果。

isLongName()

public static boolean isLongName(String name) {
    return name.length() > 5;
}

則程式行數由原本的5行變為3行,測試程式執行的行數也為3行,測試覆蓋率為:3/3 * 100% = 100%。這代表著在測試程式不變的情況下,被測程式越短會有越高的測試覆蓋率。即使測試覆蓋率100%也無法測到所有可能的結果,例如上例中就沒測到結果為true的情況。所以測試覆蓋率並不能完全代表測試程式的品質優劣。


在Java主流IDE如EclipseIntelliJ IDEA都有內建工具可顯示JUnit或TestNG測試的覆蓋率。


沒有留言:

張貼留言