在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: