單元測試的覆蓋率(Code Coverage)是一種衡量軟體測試完整性的重要指標,它表示程式碼在測試過程中被執行的比例。計算單元測試覆蓋率主要有以下幾種方法:
-
行覆蓋率(Line Coverage):計算被測試的程式碼中有多少行被執行。公式如下:
[
\text{行覆蓋率} = \frac{\text{被執行的程式碼行數}}{\text{總的程式碼行數}} \times 100%
] -
分支覆蓋率(Branch Coverage):計算程式碼中所有分支(如 if 語句的每個分支)被執行的情況。公式如下:
[
\text{分支覆蓋率} = \frac{\text{被執行的分支數}}{\text{總的分支數}} \times 100%
] -
函式覆蓋率(Function Coverage):計算所有函式是否都被至少呼叫一次。公式如下:
[
\text{函式覆蓋率} = \frac{\text{被呼叫的函式數}}{\text{總的函式數}} \times 100%
] -
路徑覆蓋率(Path Coverage):計算程式碼中所有可能執行的路徑是否都被執行。公式如下:
[
\text{路徑覆蓋率} = \frac{\text{被執行的路徑數}}{\text{總的路徑數}} \times 100%
] -
條件覆蓋率(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
檔案將顯示每行程式碼的執行情況,幫助你計算覆蓋率。
總結來說,單元測試覆蓋率是透過分析程式碼在測試過程中的執行情況,計算出程式碼的不同部分(行、分支、函式、路徑、條件)被測試的比例,從而評估測試的完整性。