單元測試的覆蓋率計算

ponder776發表於2024-07-10

單元測試的覆蓋率(Code Coverage)是一種衡量軟體測試完整性的重要指標,它表示程式碼在測試過程中被執行的比例。計算單元測試覆蓋率主要有以下幾種方法:

  1. 行覆蓋率(Line Coverage):計算被測試的程式碼中有多少行被執行。公式如下:
    [
    \text{行覆蓋率} = \frac{\text{被執行的程式碼行數}}{\text{總的程式碼行數}} \times 100%
    ]

  2. 分支覆蓋率(Branch Coverage):計算程式碼中所有分支(如 if 語句的每個分支)被執行的情況。公式如下:
    [
    \text{分支覆蓋率} = \frac{\text{被執行的分支數}}{\text{總的分支數}} \times 100%
    ]

  3. 函式覆蓋率(Function Coverage):計算所有函式是否都被至少呼叫一次。公式如下:
    [
    \text{函式覆蓋率} = \frac{\text{被呼叫的函式數}}{\text{總的函式數}} \times 100%
    ]

  4. 路徑覆蓋率(Path Coverage):計算程式碼中所有可能執行的路徑是否都被執行。公式如下:
    [
    \text{路徑覆蓋率} = \frac{\text{被執行的路徑數}}{\text{總的路徑數}} \times 100%
    ]

  5. 條件覆蓋率(Condition Coverage):計算程式碼中所有條件表示式的每個子條件(如 if 語句中的每個邏輯表示式)是否都被測試。公式如下:
    [
    \text{條件覆蓋率} = \frac{\text{被測試的條件數}}{\text{總的條件數}} \times 100%
    ]

以下是一個簡單的示例,展示如何使用程式碼覆蓋率工具來計算單元測試的覆蓋率(假設使用C++和GCov工具):

// sample.cpp
#include <iostream>

int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

int main() {
    std::cout << "Add: " << add(5, 3) << std::endl;
    std::cout << "Subtract: " << subtract(5, 3) << std::endl;
    return 0;
}

編譯程式碼並生成覆蓋率資料:

g++ -fprofile-arcs -ftest-coverage sample.cpp -o sample
./sample
gcov sample.cpp

生成的 sample.cpp.gcov 檔案將顯示每行程式碼的執行情況,幫助你計算覆蓋率。

總結來說,單元測試覆蓋率是透過分析程式碼在測試過程中的執行情況,計算出程式碼的不同部分(行、分支、函式、路徑、條件)被測試的比例,從而評估測試的完整性。

相關文章