覆盖率测试工具gcov & lcov使用手册

时间:2022-06-30 10:58:22

Gcov: 代码覆盖率工具

1.      编译

编译时gcc添加编译选项“gcc-fprofile-arcs“和”–ftest-coverage”:

e.g:gcc-fprofile-arcs  -ftest-coverage -otest test0309.c

覆盖率测试工具gcov & lcov使用手册覆盖率测试工具gcov & lcov使用手册

编译完后会生成* .gcno文件

2.   执行

执行生成的可执行程序,gcda文件:

# ./test

#  ./test test.c test0309.gcno

覆盖率测试工具gcov & lcov使用手册

Notes:

·        Gcov主要使用.gcno.gcda两个文件.

·        .gcno:gcov note文件,由-ftest-coverage编译参数产生,包含重建基本块图和相应块的源码的行号信息。

·        .gcda:由加了-fprofile-arcs编译参数的编译后的可执行文件运行产生。包含了弧跳变的次数和其他概要信息(程序运行完毕后才能产生)。

·        Gcov执行函数覆盖、语句覆盖、分支覆盖.

 

3.     收集信息

覆盖率测试工具gcov & lcov使用手册

4.      报告:执行覆盖,生成*.gcov覆盖率文件

# gcov test0309.c        //如有多个文件则:gcov main.c,gcov tmp.c

覆盖率测试工具gcov & lcov使用手册

覆盖率测试工具gcov & lcov使用手册

(1)保存覆盖率报告文件:也可用 -c参数。

# gcov test0309.c >> yourfilename.gcov

e.g:gcov test0309.c >>abc.gcov

*.c.gcov文件就包含了函数和代码执行次数和测试的信息

覆盖率测试工具gcov & lcov使用手册

// 前面的数字表明该clause被执行的次数

(2)分支测试:-b参数

//在.gcov文件中输出每个分支的执行频率及分支统计信息。

 # gcov-b test0309.c

覆盖率测试工具gcov & lcov使用手册

(3)基本块统计:-a参数

               //在.gcov 文件中输出每个基本块的执行次数。若不加-a,则输出main函数的基本块次数

# gcov –a test0309.c

覆盖率测试工具gcov & lcov使用手册

(6)函数执行次数和可执行函数的百分比:# gcov –f test0309.c

覆盖率测试工具gcov & lcov使用手册

LCOV:图形化前端工具

Lcov则是上的gcov 结果展现的一个前端,可以将覆盖率信息转换成html文件输出。输出包括概述、覆盖率百分比、图表,快速浏览覆盖率数据。

1.    使用lcov收集覆盖率数据并写入文件:

使用lcov --directory .   --capture --output-file **.info生成info文件.

//  “.” 表示当前目录,收集coveragedata,即.gcda文件中的信息。并写入*.info文件.

e.g: #lcov --directory . --capture  --output-file test0309.info 

覆盖率测试工具gcov & lcov使用手册

也可使用如下命令:

        # lcov -c -o test0309.info -d .

        # lcov -d . -t 'test0309' -o 'test0309.info'-b . -c

·        -d  . :参数 d指路径,"." 指当前路径

·        -t  "name" :指目标文件,这里 是 test0309

·        -o  "filename" :输出格式化后的信息文件名

可以查看生成的info文件信息:# cat test0309.info

·        TN: <Test name> 表示测试用例名称, 默认为空。

·        SF: <File name> 表示带全路径的源代码文件名。

·        FN: <函数启始行号>, <函数名>; <函数有效行总数>;<函数有效行总数中被执行个数>

·        FNF: <函数总数>

·        FNH: <函数总数中被执行到的个数>

·        BRDA: <分支所在行号>, <对应的代码块编号>, <分支编号>,<执行的次数>

·        BRF: <分支总数>BRH: <分支总数中被执行到的个数>

·        DA: <代码行号>, <当前行被执行到的次数>

·        LF: < counts> 代码有效行总数

·        LH: <counts> 代码有效行总数中被执行到的个数

 覆盖率测试工具gcov & lcov使用手册

2.  若要locv生成分支branch信息、输出基本块:

修改/etc/lcovrc文件,修改如下配置:

# vi /etc/lcovrc

# Include branch coverage datadisplay (can be disabled by the --no-branch-coverage option of genhtml)

                genhtml_branch_coverage = 1                         //去掉注释,值改为1.

# Specify if branch coverage data should be collected andprocessed.

lcov_branch_coverage = 1                             //去掉注释,值改为1

覆盖率测试工具gcov & lcov使用手册


覆盖率测试工具gcov & lcov使用手册

3.  获得HTML输出文件

genhtml:根据信息文件(.info)产生html 文档,输出到一个文件夹中。

执行 genhtml  -o  results  *.info就会生成result目录,生成的html文件就在result目录下。

e.g: # genhtml –o result test0309.info

覆盖率测试工具gcov & lcov使用手册

进入result目录下,使用浏览器查看index.html文件。

覆盖率测试工具gcov & lcov使用手册

针对CMake编译项目集成gcov和lcov代码覆盖率测试

1.   修改Makefile

在项目顶层目录修改Makefile文件,此处修改“CMakeList.txt”文件,为CXX_FLAGS_DEBUG、C_FLAGS_DEBUG、LINKER_FLAGS_DEBUG添加gcc编译选项“-fprofile-acrs–ftest-coverage” 如下:

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}  -fprofile-arcs -ftest-coverage")

set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}  -fprofile-arcs -ftest-coverage")

set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG}  -fprofile-arcs -ftest-

coverage-lgcov")

Notes:CFLAGS 表示用于 C编译器的选项,CXXFLAGS表示用于C++编译器的选项。

覆盖率测试工具gcov & lcov使用手册覆盖率测试工具gcov & lcov使用手册

2.      生成配置文件

# cmake ../mecfcgi-DCMAKE_BUILD_TYPE=Debug -DENABLE_GCOV=1

3.      编译:# make  

4.      看到每个.o文件生成对应的.gcno文件

覆盖率测试工具gcov & lcov使用手册覆盖率测试工具gcov & lcov使用手册

5.   运行程序

(1)进入/root/xinshh/nes_sdk/mecfcgi/dist目录,执行strat-nes-hhtpd.sh脚本文件启动。

# sh start-nes-httpd.sh 

覆盖率测试工具gcov & lcov使用手册

Notes: 若重新编译源码,需要给该脚本加上执行权限

# chmod 777 start-nes-httpd.sh

(2)进入/ /root/xinshh/nes_sdk/mecfcgi_build目录,运行相应程序:

# ./mecfcgi

#./mecfcgi-test

覆盖率测试工具gcov & lcov使用手册覆盖率测试工具gcov & lcov使用手册

6.   生成.gcda文件

覆盖率测试工具gcov & lcov使用手册覆盖率测试工具gcov & lcov使用手册

7.      使用lcov工具收集覆盖率并写入文件:

# lcov --directory . --capture --output-file mecfcgi_0311.info

覆盖率测试工具gcov & lcov使用手册覆盖率测试工具gcov & lcov使用手册

8.      输出生成HTML结果文件:

# genhtml –o result mecfcgi_0311.info

覆盖率测试工具gcov & lcov使用手册覆盖率测试工具gcov & lcov使用手册

覆盖率测试工具gcov & lcov使用手册

9.      查看覆盖率信息:在result目录下的index文件打开浏览器查看。

覆盖率测试工具gcov & lcov使用手册