精準測試:JaCoCo 的百分百覆蓋率意味著沒有缺陷嗎?

满满元气弹發表於2024-08-23

在軟體開發中,許多開發和測試工程師認為只要透過 JaCoCo 實現了 100% 的程式碼覆蓋率,軟體就會沒有缺陷,可以高枕無憂。但這種想法其實是一個誤解。本文將透過實際的程式碼示例,揭示即使 JaCoCo 達到 100% 的程式碼覆蓋率,系統仍然可能存在嚴重缺陷的原因。

故事一

假設你正在開發一款健康風險評估應用,該應用的核心功能包含兩個分支,每個分支根據不同的健康因子採用不同的計算邏輯。現在,測試工程師設計了兩個測試用例,分別針對年齡為 54 歲和 41 歲的情況。測試完成後,JaCoCo 顯示程式碼覆蓋率達到了 100%。然而,儘管兩個測試用例的程式碼都被執行,但其中一個用例透過,另一個卻未透過。

public static int calculateRiskFactor(int age, int healthIndex) {
    if (age > 50) {
        return (age * healthIndex) / 5;  // 年齡大於50時,使用正確的計算方法
    } else {
        return (age + healthIndex) * 2;  // 年齡50或以下時,使用錯誤的計算方法
    }
}

這個故事說明,即使 JaCoCo 顯示程式碼覆蓋率為 100%,這並不代表系統沒有問題。我們仍然需要考慮,所執行的程式碼是否真正透過了測試。現實中的程式碼遠比這個例子複雜,有些程式碼可能被執行過但未透過,再次執行時雖然透過了,卻未覆蓋到對應的程式碼路徑。然而,JaCoCo 依然將其計入 100% 的覆蓋率。
那怎樣避免這種情況呢?這時,我們需要引入測試用例與程式碼的關聯,並確保程式碼的執行根據測試用例的透過狀態可逆。對於未透過的程式碼,不應計入覆蓋率範圍內。
1. JaCoCo 無法和用例進行關聯,要實現僅透過的測試用例關聯,首先要建立用例和程式碼的關聯。

下面是一個例子,如何透過機器人助手,建立用例和程式碼的關聯:機器人助手輔助測試人員協同執行測試用例的執行,同時自動對測試過程捕獲和留痕

2. 帶有用例和程式碼關聯的覆蓋率資料過來時,先快取,判斷是否透過,透過時才記錄。

透過這樣的方式就可以去除干擾並得到有效的覆蓋率資料。

故事二

再假設你正在開發一款關鍵應用,其中的核心功能只有三行程式碼。這段程式碼涉及計算一個關鍵的健康因子,該引數將用於控制保險費用的計算。由於該費用不能出錯且功能至關重要,你決定為這段程式碼編寫多個單元測試,以確保其準確性和穩定性。

public static int calculateRiskFactor(int age, int healthIndex) {
    int adjustedAge = (age / 2) + (healthIndex * 3);
    int riskFactor = (adjustedAge * healthIndex) / (age - healthIndex * 2); 
    return riskFactor + (age % healthIndex);
}

你為這段程式碼編寫了五個單元測試,所有測試都順利透過。更讓人興奮的是,JaCoCo 的測試報告顯示程式碼覆蓋率達到了 100%。於是你認為這段程式碼已經無懈可擊。
然而,第二天你發現,使用這段程式碼的系統在生產環境中出現了嚴重問題。當 age 的值正好是 healthIndex 的兩倍時,函式會觸發除以零的錯誤,導致系統崩潰。
例如,當 age 為 40,healthIndex 為 20 時,以下程式碼將觸發除零錯誤:

ublic static void main(String[] args) {
    int age = 40;
    int healthIndex = 20; // healthIndex * 2 == age

    int risk = calculateRiskFactor(age, healthIndex);
    System.out.println("Risk Factor: " + risk);
}

儘管這段程式碼的覆蓋率達到了 100%,但顯然它並不完美。在實際的複雜系統中,類似的問題可能有成千上萬,即使程式碼覆蓋率看似完美,問題仍然層出不窮。
JaCoCo 的 100% 程式碼覆蓋率並不能保證軟體質量。追求更高的覆蓋率不能神奇地解決所有問題。對於這種情況,我們需要引入更多手段,例如對程式碼本身進行風險識別,建立風險程式碼庫,以便識別潛在風險,協助提升測試的全面性和深度,而不僅僅是追求表面的覆蓋率數字。開發和測試工程師應當關注程式碼的實際行為,特別是那些測試無法覆蓋的邊緣情況,以真正提升軟體的可靠性和安全性。

上海復深藍精準測試產品 TestForce/複測高手 (www.fucegaoshou.com) 出品,想了解更多請聯絡下面企微:

相關文章