在Linux中,可以用gcov进行代码覆盖率测试。设想一种测试场景:被测对象是一个动态链接库,另外有几个试程序,现在想知道:
(1)这些测试程序是否足够多了,即是否能覆盖所有的动态链接库中的代码;
(2)动态链接库中是否有冗余的代码,即无论什么测试都不可能走到的代码;
(3)动态链接库中的hot spot, 即那些代码是被执行最多的,以便优化
gcov 就可以很好的满足上述3点需求。
步骤如下:
(1)编译测试对象
在编译被测对象时加入“-fprofile-arcs -ftest-coverage ”, 例如下面是动态链接库的源码:cal.c
#include <stdio.h>
int cal(int i)
{
if(i<0)
printf("\n %d", i);
if(i<5)
printf("\n%d", i);
if(i>20)
printf("\n%d", i);
if(i>100)
printf("\n%d", i);
return 1;
}
编译命令如下:
gcc -fprofile-arcs -ftest-coverage -c cal.c
gcc -fprofile-arcs -ftest-coverage -shared -o libcal.so cal.o
编译成功后,除了产生*.so , *.o, 还将在cal.c 所在的目录中产生cal.gcno文件
(2)编译测试程序
main.c:
#include <stdio.h>
int main()
{
int i = 0;
for(i=0;i<45;i++)
{
cal(i);
}
return 1;
}
编译命令如下(假设libcal.so放在/root下):
gcc -o main main.c -L/root -lcal
(3)运行测试程序
./main
运行完毕后,在cal.c 所在的目录中产生cal.gcda文件
(4)运行gcov
进入cal.c所在的目录,运行“gcov cal.c”, 会产生cal.c.gov, 内容如下:
-: 0:Source:cal.c
-: 0:Graph:cal.gcno
-: 0:Data:cal.gcda
-: 0:Runs:1
-: 0:Programs:1
-: 1:#include <stdio.h>
-: 2:int cal(int i)
45: 3:{
45: 4: if(i<0)
#####: 5: printf("\n %d", i);
45: 6: if(i<5)
5: 7: printf("\n%d", i);
45: 8: if(i>20)
24: 9: printf("\n%d", i);
45: 10: if(i>100)
#####: 11: printf("\n%d", i);
-: 12:
45: 13: