McCabe 迴圈複雜度:使用流程圖計算
軟體度量
度量提供了軟體產品或過程的特徵或屬性的大小、維度或容量的定量概念或指示。軟體度量可以定義為與軟體成本、質量、規模和進度相關的軟體屬性的定量度量。
例如 -
度量 - 錯誤數量
指標 - 每人發現的錯誤數量
軟體測試中的迴圈複雜度
在軟體測試中,程式碼段的迴圈複雜度是一個指標,用於衡量給定軟體程式的複雜度。它可以定義為軟體產品原始碼中獨立路徑的定量度量。可以透過控制流圖或透過軟體程式中的函式、模組、方法或類來衡量。
獨立路徑是指至少有一條邊在任何其他路徑中都尚未遍歷的路徑。1976 年,Thomas J. McCabe 開發了迴圈複雜度。迴圈複雜度基於軟體程式的控制流表示。控制流以圖的形式表示軟體程式,該圖由節點和邊組成。
節點表示處理任務,邊表示節點之間的控制流。

軟體程式的流程圖表示法
流程圖表示法定義了透過邊連線的節點。以下是 if-else、while 語句和正常流程式列的流程圖。

如何計算迴圈複雜度
數學表示 - 迴圈複雜度是透過圖表的獨立路徑的集合。它透過以下公式表示 -
V(G) = E – N + 2,其中 E = 邊數,N = 節點數
或,
V(G) = P + 1,其中 P = 謂詞節點數,包含條件
迴圈複雜度的屬性
V(G) 表示透過圖表示的最大獨立路徑數。
V(G) > 1
如果 V(G) = 1,即 V(G) 為單位,則 G 只能有一條路徑。
將複雜度降低到 10。
迴圈複雜度對軟體測試有什麼用?
基本路徑測試是一種在白盒測試中使用的技術,以確保在軟體測試期間至少執行一條語句。迴圈複雜度評估透過程式的所有線性獨立路徑,即測試用例的數量將等於軟體程式的迴圈複雜度。它由於迴圈複雜度 (M) 的屬性而有用 -
M 是實現分支覆蓋所需的測試用例數(稱為上限)。
或者,M 可以是透過圖的路徑數,包括獨立路徑(稱為下限)。
計算迴圈複雜度和設計測試用例的步驟
從軟體程式碼構建具有節點和邊的圖。
識別獨立路徑。
如果 V(G) = 1,即 V(G) 為單位,則 G 只能有一條路徑。
設計測試用例。
在形成基本集後,必須編寫測試用例以實現每條路徑。
V(G) - 如果軟體程式很小,則也可以手動計算迴圈複雜度。如果程式過於複雜,則需要自動化工具,因為它涉及更多流程圖。根據複雜度數字,專案團隊決定需要實施哪些措施來進行度量。
下表概述了複雜度數字和 V(G) 的相應含義 -
| 複雜度 | 意義 |
|---|---|
| 1 – 10 | 結構良好、編寫良好的程式碼 高可測試性 成本和工作量較低 |
| 10 – 20 | 複雜程式碼 中等可測試性 中等成本和工作量 |
| 20 – 40 | 過於複雜的程式碼 低可測試性 高成本和工作量 |
| > 40 | 無法測試 非常高的成本和工作量 |
計算迴圈複雜度的工具
全球市場上有許多工具可用於確定軟體產品或應用程式的複雜性。某些工具用於某些技術。複雜度可以透過軟體程式中的決策點數量來確定。例如,原始碼中的 if、for、for-each、while、do、catch、case 語句。
一些用於計算迴圈複雜度的工具是 -
OClint
這是一個靜態程式碼分析工具,用於提高軟體產品的質量,並透過檢查 C、C++、Objective-C 程式碼並找出可能的問題(如 -)來減少缺陷:
可能的錯誤 - if、else、try、catch、finally 語句
未使用的程式碼 - 這包括未使用的區域性變數和引數。
複雜的程式碼 - 這包括非常高的迴圈複雜度、NPath 複雜度和非常高的 NCSS。
冗餘程式碼 - 這包括冗餘的 if 語句、無用的括號等。
程式碼異味 - 這包括長方法和長引數列表。
不良實踐 - 這包括反向邏輯和引數賦值。
使用 OClint,我們可以使用高階功能自動化檢查過程 -
依賴於軟體原始碼的抽象語法樹以獲得更好的準確性和效率。減少誤報以防止有用的結果淹沒在其中。
它允許在執行時甚至動態載入規則到系統中。
它提供敏捷且可擴充套件的配置,以確保使用者可以自定義工具的行為。
它的命令列呼叫支援持續整合 (CI) 和軟體程式碼的持續檢查,以便儘早解決技術債務,從而降低維護成本。
GTMetrix
此工具用於分析頁面的載入速度及其效能。它為我們的頁面和 Pagespeed 以及 WiSlow 提供分數。它是一個開源工具,用於獲取有關站點效能的詳細報告。它還提供有關改進網頁分數的建議。它還有助於我們從 WordPress 執行分析。
它還有助於我們安排每日、每週或每月的報告。它還會在 WordPress 管理員處通知我們網站的狀態。首先,我們需要建立一個 GTMetrix 帳戶。該帳戶在有限的時間內和每天一定數量的請求內是免費的。
Reflector Add In
此工具用於 .NET 程式集的程式碼度量。
迴圈複雜度的使用
它還可以指導測試過程,並且易於應用。
它還有助於開發人員向客戶保證所有路徑都已徹底測試。
它有助於更多地強調未覆蓋的路徑。
它有助於更多地強調未覆蓋的路徑。
迴圈複雜度指標有助於提高程式碼覆蓋率。
它有助於評估應用程式或軟體程式中的風險。
如果儘早使用,指標有助於降低程式的更多風險。
迴圈複雜度的優點
迴圈複雜度可用作質量指標。
它提供了各種設計的相對複雜性。
它比 Halstead 的指標計算速度更快。
迴圈複雜度還用於衡量最低工作量和最佳集中領域。
它還可以指導測試過程,並且易於應用。
迴圈複雜度的缺點
迴圈複雜度是軟體程式的控制複雜度的度量,而不是資料複雜度的度量。
巢狀條件結構比未測試的結構更難且更復雜。
對於簡單的比較和決策結構,迴圈複雜度可能會給出誤導性的數字。
結論
迴圈複雜度是一種軟體度量技術。它用於結構化或白盒測試。它主要用於評估軟體程式的複雜性。如果軟體程式具有更多決策點,則軟體程式的複雜性會增加。對於複雜度較高的軟體程式,隨著時間的推移,錯誤的機率會增加,從而導致維護和故障排除。
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP