在此階段執行三個步驟:
- 源代碼被檢測。
- 檢測的源代碼被編譯為目標文件。
- 所有檢測和非檢測對象都鏈接到代碼覆蓋工具庫,以及形成最終可測試二進制工件所需的任何其他庫。
這些步驟通常在構建過程中執行,并且要求覆蓋工具與用戶構建系統集成。該cpptestcc工具檢測源代碼并將其編譯為目標文件。在cpptestcc被設計為用作匯編命令行編譯器前綴。
原始編譯命令行:
cc -I app/includes -D defines -c source.cpp
|
覆蓋模式編譯命令行:
cpptestcc -compiler gcc_3_4 -line-coverage -workspace /home/test/proj/cov -- cc -I app/includes -D defines -c source.cpp
|
當覆蓋模式編譯命令行執行時,cpptestcc執行以下操作:
- 編譯命令行分析提取源文件信息
- 對所有檢測到的源文件進行解析和檢測以獲取覆蓋率指標
- 使用-workspace開關在指定位置重建插裝文件;還存儲了有關報告生成期間使用的代碼結構的附加信息
- 編譯命令行修改,原始源文件替換為插裝版本
- 執行編譯命令行,在與原始命令行相同的位置創建對象文件
您可以將[INSTALL_DIR]/bin目錄添加到 PATH 變量中,這樣在指定cpptestcc命令時就不必使用完整路徑 。本文檔中的所有示例均假設已完成此操作。
以下模式描述了覆蓋檢測的語法:
cpptestcc -compiler <compiler configuration> <coverage metric specification> -workspace <workspace directory> -- <compilation command line>
|
- <compiler configuration>指支持的編譯器配置,例如 gcc_3_4;有關支持的編譯器 列表,請參閱支持的編譯器。
- <coverage metric specification>“覆蓋”指的是支持的覆蓋度量,例如,線路覆蓋。有關支持的覆蓋率指標列表,請參閱cpptestcc 的命令行參考。
- 該cpptestcc命令行從與編譯器命令行分離--隔板。
鏈接檢測代碼
必須修改原始鏈接器命令以包含代碼覆蓋率檢測所需的附加庫。以下示例顯示了這通常是如何完成的:
原始編譯命令行:
lxx -L app/lib app/source.o -lsomelib -o app.exe
|
覆蓋模式編譯命令行:
lxx -L app/lib app/source.o somelib.lib <coverage tool>/runtime/lib/cpptest.lib -o app.exe
|
執行檢測代碼
執行環境的細節取決于應用程序的細節,但覆蓋工具對執行施加了以下有限的依賴:
- 如果覆蓋工具庫被鏈接為共享(動態加載)庫,那么您必須確保在啟動檢測的應用程序時可以加載該庫。在 Windows 上,這通常需要將[INSTALL_DIR]/bin目錄添加到 PATH 環境變量中。在 Linux 系統上,添加[INSTALL_DIR]/runtime/lib到 LD_LIBRARY_PATH 變量。
- 如果覆蓋結果傳輸信道被修改,則必須滿足由修改產生的所有要求。例如,如果結果是通過 TCP/IP 套接字或 rs232 發送的,則需要在檢測的應用程序執行之前啟動適當的偵聽代理。
在檢測的應用程序完成執行后,收集的結果必須存儲在將用于生成報告的文件中。
生成報告
最終覆蓋率報告由兩種類型的信息生成:
- cpptestcc構建過程中生成的代碼結構信息(存儲在workspace中)
- 通過檢測代碼執行獲得的覆蓋結果
覆蓋率報告可以 HTML 格式生成或發送到 DTP 服務器。以下示例顯示了用于生成報告的命令:
cpptestcli -config builtin://Coverage -input cpptest_results.clog -workspace /home/test/proj/cov
|
為了在 DTP 中正確合并覆蓋數據,您必須在命令行或 .properties 設置文件中指定一個或多個覆蓋圖像標簽。覆蓋圖像會自動發送到連接的 DTP 服務器,在那里它可以與過濾器相關聯。
您可以指定一組最多三個標簽,這些標簽可用于在 DTP 服務器中使用以下report.coverage.images屬性創建覆蓋圖像:
report.coverage.images=[tag1; tag2; tag3]
|
在報告中心管理頁面(管理> 項目> 過濾器> [單擊過濾器])中的 DTP 中關聯覆蓋圖像。
您還可以使用該report.coverage.limit屬性指定較低的覆蓋閾值:
report.coverage.limit=[value]
|
低于此值的覆蓋率結果在報告中突出顯示。默認值為40。
使用示例
在此示例中,以下代碼來自名為 的 c++ 源文件main.c:
#include <iostream>
int main(int argc, char ** argv) {
if (argc > 1) {
std::cout << "Thank you for arguments" << std::endl;
} else {
std::cout << "Provide some arguments please !" << std::endl;
}
return 0;
}
|
正常的文件編譯命令是gcc:
g++ -c main.c -o main.o
|
要檢測此文件并將檢測后的代碼編譯為目標文件,編譯命令行必須包含cpptestcc命令前綴:
cpptestcc -compiler gcc_3_4 -line-coverage -workspace /home/test/proj/cov -- g++ -c main.c -o main.o
|
作為 cpptestcc 命令調用的結果,創建了兩個工件:
- 帶有檢測代碼的對象
- 代碼結構信息存儲在 -workspace選項指定的目錄中
一旦源文件被檢測并編譯成目標文件,它就可以鏈接起來形成最終的可執行文件。通常這個簡單的例子將與以下命令鏈接:
g++ main.o -o app.exe
|
覆蓋率檢測需要額外的庫,因此鏈接命令行需要如下所示:
g++ main.o <coverage tool install dir>/runtime/lib/cpptest.a -o app.exe
|
在此示例中,使用了覆蓋庫的靜態版本。還提供了動態/共享版本以及源代碼,用于構建自定義版本。
一旦應用程序被鏈接,就可以執行它來收集有關代碼覆蓋率的信息。運行以下命令:
./app.exe
|
應用程序將cpptest_results.clog在當前工作目錄中輸出默認命名的覆蓋率日志文件。
最后,使用以下命令生成報告:
cpptestcli -config builtin://Coverage -workspace /home/test/proj/cov -input cpptest_results.clog -report report_dir
|
將創建一個報告目錄,其中包含帶有代碼覆蓋率信息的 HTML 報告。