Gcov: 代码覆盖率工具
1. 编译:
编译时gcc添加编译选项“gcc-fprofile-arcs“和”–ftest-coverage”:
e.g:gcc-fprofile-arcs -ftest-coverage -otest test0309.c
编译完后会生成* .gcno文件
2. 执行:
执行生成的可执行程序,gcda文件:
# ./test
# ./test test.c test0309.gcno
Notes:
· Gcov主要使用.gcno和.gcda两个文件.
· .gcno:gcov note文件,由-ftest-coverage编译参数产生,包含重建基本块图和相应块的源码的行号信息。
· .gcda:由加了-fprofile-arcs编译参数的编译后的可执行文件运行产生。包含了弧跳变的次数和其他概要信息(程序运行完毕后才能产生)。
· Gcov执行函数覆盖、语句覆盖、分支覆盖.
3. 收集信息:
4. 报告:执行覆盖,生成*.gcov覆盖率文件
# gcov test0309.c //如有多个文件则:gcov main.c,gcov tmp.c
(1)保存覆盖率报告文件:也可用 -c参数。
# gcov test0309.c >> yourfilename.gcov
e.g:gcov test0309.c >>abc.gcov
*.c.gcov文件就包含了函数和代码执行次数和测试的信息。
// 前面的数字表明该clause被执行的次数
(2)分支测试:-b参数
//在.gcov文件中输出每个分支的执行频率及分支统计信息。
# gcov-b test0309.c
(3)基本块统计:-a参数
//在.gcov 文件中输出每个基本块的执行次数。若不加-a,则输出main函数的基本块次数
# gcov –a test0309.c
(6)函数执行次数和可执行函数的百分比:# gcov –f test0309.c
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
也可使用如下命令:
# 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> 代码有效行总数中被执行到的个数
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
3. 获得HTML输出文件
genhtml:根据信息文件(.info)产生html 文档,输出到一个文件夹中。
执行 genhtml -o results *.info就会生成result目录,生成的html文件就在result目录下。
e.g: # genhtml –o result test0309.info
进入result目录下,使用浏览器查看index.html文件。
针对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++编译器的选项。
2. 生成配置文件:
# cmake ../mecfcgi-DCMAKE_BUILD_TYPE=Debug -DENABLE_GCOV=1
3. 编译:# make
4. 看到每个.o文件生成对应的.gcno文件
5. 运行程序:
(1)进入/root/xinshh/nes_sdk/mecfcgi/dist目录,执行strat-nes-hhtpd.sh脚本文件启动。
# sh start-nes-httpd.sh
Notes: 若重新编译源码,需要给该脚本加上执行权限
# chmod 777 start-nes-httpd.sh
(2)进入/ /root/xinshh/nes_sdk/mecfcgi_build目录,运行相应程序:
# ./mecfcgi
#./mecfcgi-test
6. 生成.gcda文件:
7. 使用lcov工具收集覆盖率并写入文件:
# lcov --directory . --capture --output-file mecfcgi_0311.info
8. 输出生成HTML结果文件:
# genhtml –o result mecfcgi_0311.info
9. 查看覆盖率信息:在result目录下的index文件打开浏览器查看。