使用gcov进行保险测试

 
使用 gcov 行保 险测试

章里,我 将会探 gcov 用程序,并且了解一下如何使用 gcov 来帮助 测试
与支持 件配置与 化。我 将会了解如何使用 gcov 来构建 件,并且理解他所
提供的各 数据 型。最后,我 将探 行保 险测试时 要避免的事情。
gcov 是什
gcov 可以 做什 么开 始。 gcov 是一个保 险测试 工具。当构建一个程序
gcov 监视 一个程序的 行,并且会 标识 行了哪一行源 ,哪一行没有 行。
gcov 可以 标识 出某一行源 行的次数, 这对 行配置很有用
(程序在哪里花 了大多数的 时间 )。因 gcov 可以分辨出哪一行没有 行,
这对 于保 险测试 工具是很有用的。
将会 讨论 3.2.2 版本的 GNU 编译 器工具 gcov 的用法。
gcov 使用目的
使用该工具可以查看测试的覆盖率,进而分析测试用例设计的缺陷。
使用该工具可以查看程序在某分支处的执行频率,进而分析程序的性能。
使用 gcov 注意事项
该工具每次重新编译后,统计数据会被清空。所以项目测试必须在确定的版本上
进行测试,而版本有修正后应使用 gcov 工具对变更部分进行补充测试。
备镜
来看一下如何 gcov 的使用准 备镜 像。我 将会在接下来的部分提供更
详细 gcov 选项 ,所以 里只是作 一个介 。我 将将会使用下面的所列的
bubblesort 的源
1:       #include <stdio.h>
2:
3:       void bubbleSort( int list[], int size )
4:       {
5:         int i, j, temp, swap = 1;
6:
7:         while (swap) {
8:
9:           swap = 0;
10:
11:           for ( i = (size-1) ; i >= 0 ; i— ) {
12:
13:             for ( j = 1 ; j <= i ; j++ ) {
14:
15:               if ( list[j-1] > list[j] ) {
16:
17:                 temp = list[j-1];
18:                 list[j-1] = list[j];
19:                 list[j] = temp;
20:                 swap = 1;
21:
22:               }
23:
24:             }
25:
26:           }
27:
28:         }
29:
30:       }
31:
32:       int main()
33:       {
34:         int theList[10]={10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
35:         int i;
36:
37:         /* Invoke the bubble sort algorithm */
38:         bubbleSort( theList, 10 );
39:
40:         /* Print out the final list */
41:         for (i = 0 ; i < 10 ; i++) {
42:           printf("%d/n", theList[i]);
43:         }
44:
45:       }
gcov
程序将会与 编译 器工具 一起使用。 就意味着我 将要在其上 行保 险测试
像必 用一个特殊的 选项 集合 编译 。下面是我 用来演示 编译 bubbleSort.c 的命令:
    gcc bubblesort.c -o bubblesort -ftest-coverage -fprofile-arcs
当我 们执 行生成的程序 会生成一些包含 于程序的相 数据的文件。 gcov 程序将会
使用 些文件来 告数据并且向 开发 者提供相 的信息。当指定 -ftest-coverage 选项时
为每 一个源 生成两个文件。 些文件会使用 .bb .bbg 为扩 展名,并且用
文件来重 组每 一个可 行程序的程序流 -fprofile-arcs ,将会生成一个包含
一个指令分支的 数的以 .da 为扩 展名的文件。 些文件会在 行以后与
文件一起使用,来 标识 行行
使用 gcov 程序
在我 好了我 的程序 像了, 们继续 其余的部分。运行我 的程序就
会生成我 在前面所 讨论 的数据集文件。然后我 使用我 希望 检测 的源 运行 gcov 程序。如下面所示:
$ ./bubblesort
    ...
$ gcov bubblesort.c
100.00% of 17 source lines executed in file bubblesort.c
Creating bubblesort.c.gcov.
在我 的例子程序中所有的源 行至少都 行了一次。我 可以通 过查
所生成的 bubblesort.c.gcov 文件来了解 一源 行所 实际 运行的次数。如下面所示:
        -:    0:Source:bubblesort.c
        -:    0:Graph:bubblesort.gcno
        -:    0:Data:bubblesort.gcda
        -:    0:Runs:1
        -:    0:Programs:1
        -:    1:#include <stdio.h>
        -:    2:void bubbleSort(int list[],int size)
        1:    3:{
        1:    4:    int i,j,temp,swap=1;
        4:    5:    while(swap)
        -:    6:    {
        2:    7:    swap=0;
       22:    8:    for(i=(size-1);i>=0;i--)
        -:    9:    {
      110:   10:        for(j=1;j<=i;j++)
        -:   11:        {
       90:   12:        if(list[j-1]>list[j])
        -:   13:        {
       45:   14:            temp=list[j-1];
       45:   15:            list[j-1]=list[j];
       45:   16:            list[j]=temp;
       45:   17:            swap=1;
        -:   18:        }
        -:   19:        }
        -:   20:    }
        -:   21:    }
        1:   22:}
        -:   23:int main()
        1:   24:{
        1:   25:    int theList[10]={10,9,8,7,6,5,4,3,2,1};
        -:   26:    int i;
        -:   27:    /*Invoke the buble sort algorithm*/
        1:   28:    bubbleSort(theList,10);
        -:   29:
        -:   30:    /*print out the final list*/
       11:   31:    for(i=0;i<10;i++)
        -:   32:    {
       10:   33:    printf("%d/n",theList[i]);
        -:   34:    }
        1:   35:    return 0;
        -:   36:}
来看一下其中的一些 关键 点,看一下他所提供的内容。第一列 示了源
一行源 行的次数。在一些情况下, 行次数并没有提供。 些只是并不会
影响代 简单 C 元素。
数可以提供一些 于程序 行的信息。例如, 测试 的第 12 行了 90 次,
14-17 行的代 只是 行了 45 次。 个函数 用了 90 次,
真正成功的 45 次。 话说 ,大部分的 测试时间 在两个元素的交 上。
是由于 测试 数据的 序所造成的。
里我 可以看到代 段中最常 行的部分就是排序算法的内循 部分。
是因 由于退出 测试 10 行要比第 12 行的次数多一些。
看分支概率
也可以使用 -b 选项 看程序的分支数据。 选项 出程序中 一个
分支的 度与相 的摘要。例如,我 使用 -b 选项 gcov 命令:
$ gcov -b bubblesort.c
100.00% of 17 source lines executed in file bubblesort.c
100.00% of 12 branches executed in file bubblesort.c
100.00% of 12 branches taken at least once in file bubblesort.c
100.00% of 2 calls executed in file bubblesort.c
Creating bubblesort.c.gcov.
所生成的 bubblesort.c.gcov 文件如下所示。
       
-:    0:Source:bubblesort.c
        -:    0:Graph:bubblesort.gcno
        -:    0:Data:bubblesort.gcda
        -:    0:Runs:1
        -:    0:Programs:1
        -:    1:#include <stdio.h>
        -:    2:void bubbleSort(int list[],int size)
function bubbleSort called 1 returned 100% blocks executed 100%
        1:    3:{
        1:    4:    int i,j,temp,swap=1;
        4:    5:    while(swap)
branch  0 taken 67%
branch  1 taken 33% (fallthrough)
        -:    6:    {
        2:    7:    swap=0;
       22:    8:    for(i=(size-1);i>=0;i--)
branch  0 taken 91%
branch  1 taken 9% (fallthrough)
        -:    9:    {
      110:   10:        for(j=1;j<=i;j++)
branch  0 taken 82%
branch  1 taken 18% (fallthrough)
        -:   11:        {
       90:   12:        if(list[j-1]>list[j])
branch  0 taken 50% (fallthrough)
branch  1 taken 50%
        -:   13:        {
       45:   14:            temp=list[j-1];
       45:   15:            list[j-1]=list[j];
       45:   16:            list[j]=temp;
      
45:   17:            swap=1;
        -:   18:        }
        -:   19:        }
        -:   20:    }
        -:   21:    }
        1:   22:}
        -:   23:int main()
function main called 1 returned 100% blocks executed 100%
        1:   24:{
        1:   25:    int theList[10]={10,9,8,7,6,5,4,3,2,1};
        -:   26:    int i;
        -:   27:    /*Invoke the buble sort algorithm*/
        1:   28:    bubbleSort(theList,10);
call    0 returned 100%
        -:   29:
        -:   30:    /*print out the final list*/
       11:   31:    for(i=0;i<10;i++)
branch  0 taken 91%
branch  1 taken 9% (fallthrough)
        -:   32:    {
       10:   33:    printf("%d/n",theList[i]);
call    0 returned 100%
        -:   34:    }
        1:   35:    return 0;
        -:   36:}
里我 可看到 与上面的文件相 似,但是 一次 一个分支点都用他
行了 示。
分支点依 于目 标结 构建指令集。第 12 行是一个 简单 if 句,所以有一个分支点。
里我 可以注意到 50% 前面 察程序的 行次数可以看出。
其他的分支点有一些 于分析。例如,第 7 行是一个 while 句,有两个分支点。
X86 汇编 中, 一行分 编译 成我 下面所看到的 子:
1:   cmpl        $0, -20(%ebp)
2:   jne        .L4
3:   jmp        .L1
里我 可看出, swap 量与 0 行比 。如果他不等于 0, 就会跳 到第 2 行,
.L4 。否 要跳 到第 3 ,.L1 。第 2 行所示的分支概率 67% 是因 为这 一行 3 次,
但是 jne 行了两次。当第 2 行的 jne 并没有 ,我 势头 到第 3 行。
行一次,但是一旦 行,程序就 束了。所以分支 1 要花 100% 时间
所以分支概率在理解程序流 是要相当有用的,但是要参考 汇编 需要理解分支点在哪里。
不完整程序 测试
gcov 数一个 测试 并不是 100% 的程序 ,并没有 行的行是 标记为 ####
而不是 行次数。 下面 示的是一个由 gcov 建的文件来 示少于 100% 测试
 1:                #include <stdio.h>
 2:
 3:                int main()
 4:           1    {
 5:           1      int a=1, b=2;
 6:
 7:           1      if (a == 1) {
 8:           1        printf("a = 1/n");
 9:                  } else {
 10:      ######        printf("a != 1/n");
 11:                  }
 12:
 13:           1      if (b == 1) {
 14:      ######        printf("b = 1/n");
 15:                  } else {
 16:           1        printf("b != 1/n");
 17:                  }
 18:
 19:           1      return 0;
 20:                }
 
个程序运行 gcov 用程序也会向 出相 的信息。他会 示可能
行的源 行的行数以及 实际 运行的百分比。
 
$ gcov incomptest.c
 77.78% of 9 source lines executed in file incomptest.c
 Creating incomptest.c.gcov.
 
$
 
如果我 的例子程序有多个函数,我 可以通 使用 -f 选项 一个函数
行情况。 如下面的我 bubbleSort 程序所 行的演示:
$ gcov -f bubblesort.c
100.00% of 11 source lines executed in function bubbleSort
100.00% of 6 source lines executed in function main
100.00% of 17 source lines executed in file bubblesort.c
Creating bubblesort.c.gcov.
$
gcov 可用的 选项
gcov
程序 用的格式
gcov [options] sourcefile
其可用的 选项 如下:
选项              目的
-v
-version         打印版本信息
-h,-help        
打印帮助信息
-b,-branch-probabilities
出文件 出分支
-c,-branch-counts    
打印分支 数而不是分支
-n,-no-output        
gcov 出文件
-l,-long-file-names    
文件名
-f,-function-summaries    
打印 一个函数的概要
-o,-object-directory    .bb,.bbg,.da
文件存放的目
从上面 个表中,我 可以看到一个 个字符 选项 ,以及一个 长选项 。当从命令行
中使用 gcov 命令 选项 是比 有用的,但是当 gcov Makefile 的一个部分
使用 长选项 ,因 为这 更易于理解。
当了解 gcov 程序的版本信息 ,可以使用 -v 选项 。因 gcov 是与一个指定的 编译
工具 链联 系在一起的( 实际 上是由 gcc 工具 而构建的), gcc 版本与 gcov 的版本是相同的。
gcov
程序的 介以及 选项 帮助可以用 -h 选项
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值