單元測試(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如Eclipse或IntelliJ IDEA都有內建工具可顯示JUnit或TestNG測試的覆蓋率。
沒有留言:
張貼留言