前一篇介绍了Code Coverage的一些指标,那么如何比较简单的评价一款软件对这些指标的支持呢。由于公司的项目组选择AQtime这个工具,所以有机会能进行比较深入的体验一下。
为了避免IDE自动产生的code,我们采用记事本来编写一个简单的C dll,用cl.exe进行编译,同时,写一些简单的测试案例。
MyMath.cpp
- #include <iostream>
- extern "C" _declspec(dllexport) int foo(int x, int y)
- {
- int result=0;
- if(x<5)
- {
- result+=1;
- }
- if(y<5)
- {
- result+=10;
- }
- return result;
- }
该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,传入不同的参数即可)。
- #include <windows.h>
- #include <iostream>
- int main()
- {
- HINSTANCE hLib=LoadLibrary("MyMath.dll");
- if(hLib!=0)
- {
- printf("MyMath.dll loaded.\n");
- }
- else
- {
- printf("MyMath.dll failed to load.\n");
- }
- typedef int (*FooPtr)(int x, int y);
- FooPtr foo=(FooPtr)GetProcAddress(hLib,"foo");
- int result=foo(1,10);
- printf("The result is %d.\n",result);
- FreeLibrary(hLib);
- return 0;
- }
同样,在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中统计的行数;
- 覆盖的行数是前面标有绿色或者黄色的行数之和(看如何设置);没有覆盖的行数是标有红色的行数之和;