代碼覆蓋率生成工具gcov/lcov

一性锭、代碼覆蓋率生成工具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.cppC++源文件(插入排序)。

/* 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工具簡介

lcovGCOV的圖形化前端工具集上忍,其主要包含工具如下:

  • 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文件夾名
image

三纳本、參考鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市腋颠,隨后出現(xiàn)的幾起案子繁成,更是在濱河造成了極大的恐慌,老刑警劉巖淑玫,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巾腕,死亡現(xiàn)場離奇詭異,居然都是意外死亡絮蒿,警方通過查閱死者的電腦和手機尊搬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來土涝,“玉大人佛寿,你說我怎么就攤上這事〉常” “怎么了冀泻?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蜡饵。 經(jīng)常有香客問我弹渔,道長,這世上最難降的妖魔是什么溯祸? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任肢专,我火速辦了婚禮,結(jié)果婚禮上您没,老公的妹妹穿的比我還像新娘鸟召。我一直安慰自己,他們只是感情好氨鹏,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著压状,像睡著了一般仆抵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上种冬,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天镣丑,我揣著相機與錄音,去河邊找鬼娱两。 笑死莺匠,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的十兢。 我是一名探鬼主播趣竣,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼摇庙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了遥缕?” 一聲冷哼從身側(cè)響起卫袒,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎单匣,沒想到半個月后夕凝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡户秤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年码秉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸡号。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡泡徙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膜蠢,到底是詐尸還是另有隱情堪藐,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布挑围,位于F島的核電站礁竞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏杉辙。R本人自食惡果不足惜模捂,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜘矢。 院中可真熱鬧狂男,春花似錦、人聲如沸品腹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舞吭。三九已至泡垃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間羡鸥,已是汗流浹背蔑穴。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惧浴,地道東北人存和。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捐腿。 傳聞我的和親對象是個殘疾皇子纵朋,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容