一性锭、代碼覆蓋率生成工具gcov
1.1.gcov工具簡介
gcov
是代碼覆蓋率測試工具入愧,與GCC
一同使用,且只能用于GCC
編譯程序深碱,其具有以下功能腹鹉。
- 統(tǒng)計
C/C++
程序某行代碼執(zhí)行次數(shù)。 - 統(tǒng)計
C/C++
程序哪些代碼被執(zhí)行過敷硅。
說明:通常生成代碼覆蓋率信息需要配合單元測試工具(gtest
)使用功咒,配合單元測試發(fā)現(xiàn)哪些代碼/分支被有效執(zhí)行。
1.2.gcov工具使用
當使用gcov
工具時绞蹦,你必須在編譯文件時使用參數(shù)--coverage
力奋,這會告訴編譯器去嵌入多余代碼段,生成gcov
工具需要的信息幽七。
當編譯程序時景殷,<sourcefile>.gcno
文件將生成于當前目錄(等同于編譯時使用參數(shù)-ftest-coverage
)。
當運行程序時澡屡,<sourcefile>.gcda
文件將會生成于當前目錄(等同于編譯時使用參數(shù)-fprofile-arcs
)猿挚。
gcov
需要上述兩個文件來生成相關(guān)的代碼覆蓋率信息。
總結(jié):
.gcda
文件在程序執(zhí)行后生成驶鹉,該程序編譯時需要加入?yún)?shù)-fprofile-arcs
绩蜻。.gcno
文件在編譯程序時生成,該程序編譯時需要加入?yún)?shù)-ftest-coverage
室埋。編譯時添加參數(shù)
--coverage
等同于-fprofile-arcs -ftest-coverage
办绝。
1.3.gcov使用示例
首先我們創(chuàng)建一個名test.cpp
的C++
源文件(插入排序)。
/* FILENAME : test.cpp */
#include <iostream>
#include <algorithm>
#include <vector>
template<class It>
using value_type_t = typename std::iterator_traits<It>::value_type;
template<class It, class Compare = std::less<value_type_t<It>>>
void InsertionSort(It begin, It end, Compare cmp = Compare()) {
for(auto it = begin; it != end; it = std::next(it)) {
auto const insertion = std::upper_bound(begin, it, *it, cmp);
std::rotate(insertion, it, std::next(it));
}
}
int main(int argc, char *argv[]) {
std::vector<int> arr = {8,3,4,0,5,1,2,9,7,6};
InsertionSort(arr.begin(), arr.end());
for(int i : arr) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
生成可執(zhí)行文件$ g++ -o test test.cpp --coverage
姚淆,此時會產(chǎn)生成test.gcno
文件孕蝉。
運行程序$ ./test
,此時會產(chǎn)生test.gcda
文件肉盹。
使用命令$ gcov test.gcda
生成test.cpp.gcov
文件昔驱。
/* test.cpp.gcov */
-: 0:Source:test.cpp
-: 0:Graph:test.gcno
-: 0:Data:test.gcda
-: 0:Runs:1
-: 0:Programs:1
-: 1:#include <iostream>
-: 2:#include <algorithm>
-: 3:#include <vector>
-: 4:
-: 5:template<class It>
-: 6:using value_type_t = typename std::iterator_traits<It>::value_type;
-: 7:
-: 8:template<class It, class Compare = std::less<value_type_t<It>>>
1: 9:void InsertionSort(It begin, It end, Compare cmp = Compare()) {
11: 10: for(auto it = begin; it != end; it = std::next(it)) {
10: 11: auto const insertion = std::upper_bound(begin, it, *it, cmp);
10: 12: std::rotate(insertion, it, std::next(it));
-: 13: }
1: 14:}
-: 15:
1: 16:int main(int argc, char *argv[]) {
1: 17: std::vector<int> arr = {8,3,4,0,5,1,2,9,7,6};
1: 18: InsertionSort(arr.begin(), arr.end());
11: 19: for(int i : arr) {
10: 20: std::cout << i << " ";
-: 21: }
1: 22: std::cout << std::endl;
1: 23: return 0;
-: 24:}
二、代碼覆蓋率生成工具lcov
2.1.lcov工具簡介
lcov
是GCOV
的圖形化前端工具集上忍,其主要包含工具如下:
-
lcov
- 獲取LCOV
覆蓋率數(shù)據(jù) -
genhtml
- 將LCOV
覆蓋率數(shù)據(jù)生成HTML
文件
2.2.lcov工具示例
通過gcov
工具骤肛,生成如下覆蓋率統(tǒng)計文件:
test - 可執(zhí)行文件
test.cpp - 源代碼
test.cpp.gcov - gcov工具產(chǎn)生文件
test.gcda - 運行test后參數(shù)統(tǒng)計數(shù)據(jù)
test.gcno - 編譯test后參數(shù)統(tǒng)計數(shù)據(jù)
使用lcov
生成LCOV
覆蓋率數(shù)據(jù)文件:
$ lcov --directory ./ --capture --output-file test.info
刪除LCOV
覆蓋率數(shù)據(jù)中統(tǒng)計到的庫文件:
$lcov --remove test.info '/usr/local/*' --output-file test.info
--directory
-.gcda
文件所在目錄--capture
- 統(tǒng)計覆蓋率數(shù)據(jù)--output-file
- 輸出LCOV
覆蓋率數(shù)據(jù)的文件名--remove
- 刪除LCOV
覆蓋率數(shù)據(jù)中不需要統(tǒng)計的文件名
使用genhtml
工具生成html
頁面:
$ genhtml test.info --output-directory result
-
--output-directory
- 生成html
文件夾名