代码覆盖率测试(自时请表明原文出处(http://blog.sina.com.cn/wyw1976)及作者邮箱([email protected]))

代码覆盖率测试(转载自转载时请表明原文出处(http://blog.sina.com.cn/wyw1976)及作者邮箱([email protected]))

 在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:        return 1;
        -:   14:
        -:   15:}

其中, “#####”表示该行没执行,数字表示执行的次数

 

 (4)运行lcov

lcov是一个与gcov配合使用, 可以将gcov的结果整理成HTML。可能需要安装“apt-get install lcov”

执行“lcov --directory  .   --capture --output-file cov.txt”

然后“genhtml  -o  results cov.txt”

最终结果会以html的形式放在result目录下。

 

需要说明的是:

(1)gcov的结果可以累加。如果上面的程序main运行多次, cal.c.gov的结果是不同的,每行执行的次数会增加。

(2)*.gcno会产生在源文件编译时所在的目录。例如cal.c所在的目录是/root/cal_lib, 动态链接库编译成功后,将该目录删除了,运行程序main时,仍然会产生/root/cal_lib并在其中生成cal.gcda.

(3)在运行gcov时, cal.c, cal.gcno和cal.gcda必须在同一目录中。

你可能感兴趣的:(代码覆盖率测试(自时请表明原文出处(http://blog.sina.com.cn/wyw1976)及作者邮箱([email protected])))