代碼覆蓋率:質量的黃金標准,你的軟件有多可靠?
原創-
2024-08-23 11:22:53
-
37436
本篇目錄
代碼覆蓋率是什麽?代碼覆蓋率一定要達到100%嗎……
最近很多客戶在咨詢禅道的時候,提出來了上述這類問題。我們能明顯感受到大家對軟件質量的重視程度越來越高。在重視代碼覆蓋率的同時,大家也能更爲及時地暴露出現有軟件開發流程中存在的各類風險。
今天,我們就來好好聊聊代碼覆蓋率,用一篇文章講透代碼覆蓋率的各類問題。
其實近幾年,從軟件質量聯盟組織(CISQ)的報告就能看出軟件質量帶來的各類問題,2022年,美國軟件公司因軟件質量不佳至少損失了2.41萬億美元,還額外累積了約1.5萬億美元的技術債務。這恰好印證了,不良代碼的部署、爲了加快進度而忽略測試等行爲,都在一點一點蠶食搖搖欲墜的軟件質量。
細節決定成敗。軟件開發不僅需要精確度、前瞻性,更是一件需要持續關注細節的精細活兒。舉個也許不太恰當的例子,如果我們在建造高樓時,忽視內部結構、複雜組件的檢驗的話,那後果將會不堪設想。
基于此,爲了提高軟件質量,對代碼覆蓋率的關注也要盡早提上日程了。
代碼覆蓋率能幫團隊識別未被測試的代碼區域,從而確認這些區域是否隱藏著未被發現的錯誤或潛在問題。
需要注意的是,100%的代碼覆蓋率並不意味著軟件毫無缺陷。團隊真正的重點應放在編寫有意義的測試上,放在編寫能夠覆蓋各種場景(比如極端情況、潛在錯誤路徑)的測試中。
通常這類工具會通過以下幾種標准進行計算:
達成100%的覆蓋率意味著確保每個定義的函數至少被調用一次,從而驗證功能的遍曆性。
計算公式:函數覆蓋率=(已經執行的函數數/總函數數)*100%
例子:
計算公式:語句覆蓋率=(已經執行的語句數/總語句數)*100%
例子:
計算公式:分支覆蓋率=(已經執行的分支數/總分支數)*100%
例子:
計算公式:條件覆蓋率=(已經執行的條件數/總條件數)*100%
例子:
多重條件決策覆蓋率(MC/DC)是一種更嚴格的條件覆蓋形式,它能確保每個條件獨立地影響決策結果。
例子:
除這四種最常見的覆蓋率外,還會有行覆蓋率、參數值覆蓋率等。行覆蓋率衡量的是測試期間執行的代碼行數,但可能無法識別行的部分執行過程。參數值覆蓋率確保使用各種輸入值測試函數,主要用于測試參數處理、邊界條件以及不同輸入場景下函數的整體穩健性等問題。
在測試用例中,通過不同覆蓋率的組合,能夠更爲全面地保證代碼質量。
舉一個較爲複雜的例子(根據各種條件確定某人是否有資格享受折扣):
實際上,代碼覆蓋率衡量的是代碼的執行程度,它主要明確已經執行了哪些代碼,哪些代碼還未經測試;而測試覆蓋率主要體現測試已經覆蓋了哪些功能特性。
測試覆蓋率可以通過各種測試方案實現:
在探討代碼覆蓋率的過程中,我們不是僅在審視一段段冷冰冰的代碼,而是在探索一個更爲深遠的話題——如何確保構建的軟件穩固、可靠。即使在虛擬的世界裏,也存在著無數的可能性與變數。理想的100%代碼覆蓋率也許很難達到,但在持續優化的過程中,我們能夠更全面地測試,更加細致地思考。
最近很多客戶在咨詢禅道的時候,提出來了上述這類問題。我們能明顯感受到大家對軟件質量的重視程度越來越高。在重視代碼覆蓋率的同時,大家也能更爲及時地暴露出現有軟件開發流程中存在的各類風險。
今天,我們就來好好聊聊代碼覆蓋率,用一篇文章講透代碼覆蓋率的各類問題。
其實近幾年,從軟件質量聯盟組織(CISQ)的報告就能看出軟件質量帶來的各類問題,2022年,美國軟件公司因軟件質量不佳至少損失了2.41萬億美元,還額外累積了約1.5萬億美元的技術債務。這恰好印證了,不良代碼的部署、爲了加快進度而忽略測試等行爲,都在一點一點蠶食搖搖欲墜的軟件質量。
細節決定成敗。軟件開發不僅需要精確度、前瞻性,更是一件需要持續關注細節的精細活兒。舉個也許不太恰當的例子,如果我們在建造高樓時,忽視內部結構、複雜組件的檢驗的話,那後果將會不堪設想。

一、代碼覆蓋率是什麽?
作爲軟件開發過程中的關鍵指標之一,代碼覆蓋率量化了測試過程中代碼被執行的程度,通常以百分比的形式呈現:代碼覆蓋率=(已測試執行的代碼行數/軟件總代碼行數)*100%簡而言之,代碼覆蓋率能夠展示測試對代碼的覆蓋廣度。
代碼覆蓋率能幫團隊識別未被測試的代碼區域,從而確認這些區域是否隱藏著未被發現的錯誤或潛在問題。
需要注意的是,100%的代碼覆蓋率並不意味著軟件毫無缺陷。團隊真正的重點應放在編寫有意義的測試上,放在編寫能夠覆蓋各種場景(比如極端情況、潛在錯誤路徑)的測試中。
二、如何計算代碼覆蓋率?
我們一般會通過工具,將代碼行覆蓋率的數據集中存儲在中心系統內。可以這樣說,也類似于在代碼的關鍵部分安裝傳感器,以便在測試執行過程中監控哪些代碼已被執行。通常這類工具會通過以下幾種標准進行計算:
1.函數覆蓋率
這一指標衡量的是在測試過程中執行的函數或子例程的百分比。它顯示了測試期間至少被調用一次的函數數量。達成100%的覆蓋率意味著確保每個定義的函數至少被調用一次,從而驗證功能的遍曆性。
計算公式:函數覆蓋率=(已經執行的函數數/總函數數)*100%
例子:
# File: calculator.py def add(a, b): return a + b def subtract(a, b): return a - b在這個例子中,實現100%的函數覆蓋率意味著在測試用例中執行“add”和“subtract”這兩個函數。
2.語句覆蓋率
語句覆蓋率關注的是函數內單個語句的執行。完整的語句覆蓋率主要用于識別死代碼(永遠不會執行的代碼)、確保代碼的每個部分都可訪問和測試。這一指標也有助于識別缺失的語句以及未使用過的語句和分支。計算公式:語句覆蓋率=(已經執行的語句數/總語句數)*100%
例子:
# File: calculator.py def multiply(a, b): result = a * b print(result) return result语句覆盖率涉及执行计算(“result = a * b”)和“print(result)”语句。
3.分支覆蓋率
在編碼中,分支指的是代碼中的點,它可以將程序流程導向一個或多個路徑。這種類型的覆蓋通過關注代碼中的決策點來擴展語句覆蓋的概念。分支覆蓋率衡量的是測試過程中已被采用的分支的百分比。完整的分支覆蓋率能夠確保所有可能的決策結果都被考慮和測試到。計算公式:分支覆蓋率=(已經執行的分支數/總分支數)*100%
例子:
# File: number_classifier.py def is_positive(num): if num > 0: return True else: return False爲了達到100%的分支覆蓋率,需要編寫測試用例覆蓋“if”和“else”分支。
4.條件覆蓋率
條件覆蓋率主要是對函數中布爾條件的評估。布爾條件指編程中計算結果爲“True”或“False”的表達式或語句。條件覆蓋率確保每個條件都經過真假測試,能夠確保決策制定過程的正確性。計算公式:條件覆蓋率=(已經執行的條件數/總條件數)*100%
例子:
# File: voting_age_checker.py def cab_vote(age): return age >= 18实现条件覆盖涉及测试“年龄”大于和小于 18 的输入。
多重條件決策覆蓋率(MC/DC)是一種更嚴格的條件覆蓋形式,它能確保每個條件獨立地影響決策結果。
例子:
# File: loan_approval.py def approve_loan(income, credit_score): return income > 50000 and credit_score > 700MC/DC覆蓋率要求測試用例能夠獨立改變“income”或“credit_score”中的任何一個,從而影響決策結果。
除這四種最常見的覆蓋率外,還會有行覆蓋率、參數值覆蓋率等。行覆蓋率衡量的是測試期間執行的代碼行數,但可能無法識別行的部分執行過程。參數值覆蓋率確保使用各種輸入值測試函數,主要用于測試參數處理、邊界條件以及不同輸入場景下函數的整體穩健性等問題。
在測試用例中,通過不同覆蓋率的組合,能夠更爲全面地保證代碼質量。
舉一個較爲複雜的例子(根據各種條件確定某人是否有資格享受折扣):
# File: discount_calculator.py def calculate_discount(age, income, has_membership): """ Calculates the discount eligibility based on age, income, and membership. """ discount = 0 if age >= 18: if income > 50000: discount = 10 if has_membership: discount += 5 elif income > 30000: discount = 5 else: discount = 0 return discount測試如下:
# File: test_discount_calculator.py from discount_calculator import calculate_discount def test_eligible_for_discount(): result = calculate_discount(25, 60000, True) assert result == 15 def test_eligible_for_partial_discount(): result = calculate_discount(30, 40000, True) assert result == 5 def test_not_eligible_for_discount(): result = calculate_discount(16, 35000, False) assert result == 0在這個例子中,我們有三個測試用例覆蓋不同的場景。但我們會發現,要想所有可能的代碼路徑的覆蓋率達到100%會很難,這就意味著該函數本身可能會過于複雜,需要重新評估。
三、代碼覆蓋率與測試覆蓋率
在實際應用中,很多人會將“代碼覆蓋率”和“測試覆蓋率”這兩個術語混淆。實際上,代碼覆蓋率衡量的是代碼的執行程度,它主要明確已經執行了哪些代碼,哪些代碼還未經測試;而測試覆蓋率主要體現測試已經覆蓋了哪些功能特性。

- 單元測試來驗證最小可測試單元(如函數、方法)的准確性;
- 響應式測試用于驗證Web應用或網站在不同設備和屏幕尺寸上的顯示和運行情況;
- 跨浏覽器測試確保Web應用或網站在不同浏覽器上的兼容性和一致性;
- 集成測試驗證系統各組件或模塊間的交互;
- 驗收測試評估軟件應用是否滿足既定要求並做好部署的准備;
- 回歸測試確保新的代碼更改不會對現有功能造成負面影響;
- ……
在探討代碼覆蓋率的過程中,我們不是僅在審視一段段冷冰冰的代碼,而是在探索一個更爲深遠的話題——如何確保構建的軟件穩固、可靠。即使在虛擬的世界裏,也存在著無數的可能性與變數。理想的100%代碼覆蓋率也許很難達到,但在持續優化的過程中,我們能夠更全面地測試,更加細致地思考。
“質量不是偶然的,它是持續改進的結果。”代碼覆蓋率可能只是其中一個手段,如何持續提升軟件質量,才是團隊需要明確並持續探索的目標。
文章翻譯鏈接:https://blog.codacy.com/what-is-code-coverage
-
禅道産品
禅道開源版 禅道企業版 禅道旗艦版 禅道IPD版 -
核心功能
産品管理 項目管理 質量管理 效能管理 -
使用文檔
基本版手冊 企業版手冊 旗艦版手冊 IPD版手冊 開發中心手冊 -
幫助中心
积分問答 常見問題 論壇交流 使用視頻 Gitee GitHub -
關于我們
關于我們 禅道軟件 最新動態 禅道活動 -
禅道社區
禅道博客 積分排行 積分商城 禅道書院 -
聯系方式
聯系人:金娟 電話:18562856230 微信:18562856230 Q Q:1826606239北京、上海、深圳分部
友情鏈接:
ZTF自動化測試框架
ZenData測試數據生成器
喧喧IM
敏捷開發
敏捷咨詢
測試窩
悅庫網盤
Ledge知識平台
渠成軟件
ZDOO全協同企業管理軟件
融管理社區
ZenDAS數據分析工具
ZenShot跨平台截圖工具
飛信釘即時通訊解決方案
項目管理
IPD學習網
PMP百科網
艾體驗
創無記2049