AQtime代码覆盖率深度分析之一

前一篇介绍了Code Coverage的一些指标,那么如何比较简单的评价一款软件对这些指标的支持呢。由于公司的项目组选择AQtime这个工具,所以有机会能进行比较深入的体验一下。

为了避免IDE自动产生的code,我们采用记事本来编写一个简单的C dll,用cl.exe进行编译,同时,写一些简单的测试案例。

MyMath.cpp

[cpp]  view plain  copy
  1. #include <iostream>  
  2. extern "C" _declspec(dllexportint foo(int x, int y)  
  3. {  
  4.     int result=0;  
  5.     if(x<5)  
  6.     {  
  7.         result+=1;  
  8.     }  
  9.     if(y<5)  
  10.     {  
  11.         result+=10;  
  12.     }  
  13.     return result;  
  14. }  

该dll包含一个函数,共8行。有4个条件x<5, x≥5, y<5, y≥5四种条件,一共四条路径abd=0, abe=10, acd=1, ace=1,如下图所示:

在vs2008的command line中,输入如下命令:

cl.exe /EHsc /Zi /Od /LDd MyMath.cpp

即可得到MyMath.dll, MyMath.pdb, VC90.pdb

编写如下测试文件test.cpp(如果需要增加或者改动case,传入不同的参数即可)。

[cpp]  view plain  copy
  1. #include <windows.h>  
  2. #include <iostream>  
  3.   
  4. int main()  
  5. {  
  6.     HINSTANCE hLib=LoadLibrary("MyMath.dll");  
  7.     if(hLib!=0)  
  8.     {  
  9.          printf("MyMath.dll loaded.\n");  
  10.     }  
  11.     else  
  12.     {  
  13.          printf("MyMath.dll failed to load.\n");  
  14.     }  
  15.    
  16.     typedef int (*FooPtr)(int x, int y);  
  17.     FooPtr foo=(FooPtr)GetProcAddress(hLib,"foo");  
  18.     int result=foo(1,10);  
  19.     printf("The result is %d.\n",result);  
  20.     FreeLibrary(hLib);  
  21.     return 0;  
  22. }  

同样,在vs2008命令行中,输入

cl.exe /EHsc test.cpp

即可得到test.exe测试程序。

 

新建一个AQtime code coverage工程,加入MyMath.dll作为目标文件,在运行参数中设置test.exe为Host Application。

注意:由于我们是在vs2008的环境下用cl.exe进行编译,vc90.pdb是必须的,否则会对结果有影响。开始时我忽略了这个文件,结果发现竟然有20%的差别。

 

下面分别采用不同的测试案例,进行测试,看看AQtime会有什么输出,如下图所示:

由上图可见,AQtime对语句覆盖(statemet coverage),函数覆盖(function coverage),循环覆盖(loop coverage)是支持比较好的,语句覆盖和函数覆盖在AQtime中对应的指标分别为Line Coverage和Routine Coverage;而对于条件覆盖(condition coverage),决策覆盖(decision coverage),条件/决策覆盖(condition/decision coverage)而言,其最终的summary中,并没有独立的指标项列出来。但是AQtime也对这些指标有个比较模糊/清晰的支持,如在Condition Coverage栏中,x=1, y=1 和x=10, y=10,一个的line coverage为100%,而另外一个为75%。显然,如果我们只有设计了第一个测试用例,很有可能就被迷惑;而在x=1, y=10和x=10, y=1中,每个case的line coverage都是87.5%,这就会提醒我们有些case漏掉了,而这两个case的合并结果为100%,的确是满足了条件覆盖的定义。同样的分析可以在Decision Coverage和Condition/Decision Coverage中体现出来。

 

另外,AQtime提供一个选项Mark partially executed lines as Partially executed(yellow)/Non-executed(red dot)/Completely executed(green dot)来如何统计或标识line coverage,选成Completely executed(green dot)可以相应的提高line coverage的百分比,但是,正如上一篇所提,我们不应该简单的追求一个代码覆盖率的数据,所以正确的做法应该是选择前面两项,这样才有利于我们发现问题,设计更有效的测试案例。

 

综上,AQtime是一个比较简单易用的代码测试覆盖率工具,其统计结果的方式为:

  • 根据debug info,如果是在VS2008或更高版本的的环境下编译,VCXX.PDB文件是必须的;
  • 其总行数是代码前面标有绿色和红色的行数之和,而不是实际我们在IDE中统计的行数;
  • 覆盖的行数是前面标有绿色或者黄色的行数之和(看如何设置);没有覆盖的行数是标有红色的行数之和;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值