Chinaunix首页 | 论坛 | 博客
  • 博客访问: 219577
  • 博文数量: 42
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 420
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-09 10:55
个人简介

每天改变一点点,生活充满了惊喜。

文章分类

全部博文(42)

文章存档

2016年(8)

2015年(29)

2014年(5)

我的朋友

分类: C/C++

2015-05-13 17:28:59

昨日又有同事问我 BullseyeCoverage 的使用方法,由于时间久远,有些遗忘,只后悔当初为什么没有整理记录下来,只好重新查阅了很多文档。
今日整理下比较重要的知识,方便以后查阅,也好给大家一点帮助。

BullseyeCoverage 工具主要用于检查C/C++程序的测试覆盖率,它可以帮助你:
1.识别在测试过程中没有完全执行的代码;
2.获取测试完整性相关的一些度量,来帮助你判断是否已经充分测试。
这对于手工测试和自动化测试来说都是有益的。

BullseyeCoverage 主要评估 条件/决策覆盖率,函数覆盖率。
有两个概念需要解释下,什么叫条件覆盖率,什么叫决策覆盖率?
条件覆盖率:度量每个子表达式结果的true和false是否被测试到。
决策覆盖率:又称分支覆盖率、路径覆盖率,度量程序中每个判定的分支是否被测试到。
注:对于决策和条件具体怎么来区分,举个例子:
  1. if (v1 == v2 && (v3 || v4))
对于决策来说,(v1 == v2 && (v3 || v4)) 这个表达式的true和false,是覆盖率评估的两个代码分支。
而对于条件来说,v3 、 v4、v1 == v2、 v1 == v2 && (v3 || v4) 这个四个表达式分别取true和false值,是评估的所有条件值。


具体的,对于某个程序,BullseyeCoverage 能够探测到代码的以下内容是否被覆盖到:
1.
每个决策(判定)的ture和false;
2.每个条件的true和false;
3.switch语句的每个分支以及隐含的default分支;
4.try-block语句的分支;
5.函数和方法是否被调用;
6.每一个以花括号包含的语句块;
7.for语句的循环体。

BullseyeCoverage 使用步骤一般是:
1.安装BullseyeCoverage, 并使 BullseyeCoverage 工具可用,然后
重新编译你的程序。
因为BullseyeCoverage工具是通过在程序中插桩代码来记录执行信息,所以需要使用工具自带的编译器来重新编译程序。
2.运行被评估程序。
3.产生和查看覆盖率评估报告。
4.重复执行第二和第三个步骤,直到满足你的测试为止。
---------------------------------------------------------------------------------------------------------------------------------------------
上面介绍了一些BullseyeCoverage 相关的理论知识,以下是一些使用实践(Linux系统)。
1.安装与设置
具体的安装这里就不详述了,从官网下载相应的版本包(),make && make install 即可。
完成后,bin目录下会有一些工具集,如果想使用方便些,把bin目录加入到PATH环境变量中,
另外,还需要设置 COVFILE 环境变量,这个环境变量是一个文件路径,
这个路径指示的文件
(这里我们称它为覆盖率文件用来存放工具获取的相关数据,可以设置为这样:
export COVFILE=`pwd`/test.cov 
由于覆盖率文件中记录代码文件的名称是以覆盖率文件所在的目录作为相对地址的,
所以执行以上命令的工作目录最好是在代码文件的最上层目录中,实际上就是把后续生成的覆盖率文件放置在此目录中。

2.编译源代码
首先执行 cov01 -s 查看是否已经启用工具,如果未启用,执行cov01 -1 启用工具
然后按照正常的步骤编译,此时唯一的变化是编译时,实际上使用的是
BullseyeCoverage 自带的编译器。
编译完成后,会生成test.cov 文件。
最后执行cov01 -0 停用工具。

注意,如果被评估的程序是长期运行的Deamon 进程,在编译之前你需要在源代码中增加以下代码:
  1. #if _BullseyeCoverage 
  2.     cov_write();
  3. #endif
BullseyeCoverage 工具是在程序执行退出后,向覆盖率文件中写入收集到的数据,对于Deamon进程,数据就会一直在内存中,不会写入覆盖率文件中。
以上代码只有在cov01 启用BullseyeCoverage 时才会生效,如果上面的代码生效,会在程序执行到这段代码时,将数据写入到覆盖率文件中。
至于上面的代码写在源代码的哪一行,我认为是加在你执行测试时,运行的最后一行代码的后面即可。

3.执行程序
将第二步编译好的程序进行部署,test.cov 文件拷贝至可执行程序目录下,执行完测试之后,test.cov 文件中会写入本次测试的覆盖率统计数据。

4.覆盖率分析
在命令行界面下,使用以下命令可以查看相应的覆盖率信息:
(1)covsrc -f test.cov  [ filename | dir ]
        查看源代码总体覆盖率情况;
(2)covfn -f test.cov  [ filename | dir ]
        查看函数覆盖率;
(3)covclass -f test.cov [ filename | dir ] 
        查看类覆盖率;
        
另外还可以使用 covhtml 将test.cov 文件中的数据转换成html格式,就可以在浏览器中打开。
covhtml -f test.cov html_dir
这里可能会报错,找不到源代码,因为工具会结合源代码来展示覆盖率的结果,如果找不到源代码也能生成覆盖率数据,但不能进入到相应的代码中查看。
官网上介绍了两种方法解决这个问题,通过covhtml的-d 选项来指定源代码的目录,或者通过 COVSRCDIR 环境变量来指定,
可能由于版本的原因,以上方法在我使用的过程中都未奏效,那只有把test.cov文件拷贝回原来的生成路径,就OK了。

用浏览器打开html_dir目录下的 index.html 就可以看到 Function Coverage、Condition/decision Coverage 覆盖和未覆盖的数目及比例。
还要提一个可能产生困惑的地方,就是在浏览器中,打开某个源代码文件时,最右端会有一些 -->、 T、F、t、f、X 等等这样的标记,
它们表示代码执行的一些轨迹,以及代码的具体覆盖情况,具体的含义可以参考官网给出的解释。
An arrow --> indicates incomplete coverage.
An X indicates one of:
    a function or lambda expression that was entered
    a switch label that was selected
    a try-block that finished
    an exception handler that was entered
    a range-based for statement body that was entered
A T or F indicates a boolean decision that evaluated true or false, respectively.
A t or f indicates a boolean condition within a decision if the condition evaluated true or false, respectively.
A k indicates a constant decision or condition. Since no variation in coverage is possible, this mark is supplementary.
The slash / means this probe is excluded from summary results.
阅读(10938) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

judyxinxin2017-10-20 18:13:19

hi,你好!
我刚开始研究BullseyeCoverage,苦于没有key.想请前辈分享一下你用的安装包+key。
我希望是先在windows上使用然后移植到嵌入式设备上。
谢谢!我的qq 383668002.