|
对楼主的回复
原帖由 碎片 于 2007-7-22 13:30 发表
问题:
1.什么是覆盖率?
2.覆盖率到底是干什么的?
3.覆盖率检测是在什么时候进行的?
4.覆盖率检测到底要不要执行程序?
if (a>1 and b=0)
x=x/a;
if (a=2 or x>1)
x=x+1;
针对上面的程序段, ...
在测试中的代码覆盖率是指你运行测试用例后,走过了多少句代码,拿这个走到过的代码除以你这个测试对象的代码行数,就是你这次测试的代码覆盖率了。
比如说,你测试的对象是一个函数,这个函数有100行代码,你所有的测试用例执行完后,走过了60行的代码,还有40行的代码没有走到过,那你这个函数的代码就只被覆盖了60%。
我们编写代码时,一定会反复调试保证它能够编译通过。所以我们会对代码的每一个分支条件和分支结果都要进行测试,覆盖率就是我们对这些测试的一个度量。
覆盖率是在我们的用例执行后进行统计的,是要运行程序的。
对于文中的例子,采用这两个 case, 我们可以设计如下的驱动,来对函数进行测试:
#include<stdio.h>
int fun(int a, int b)
{
int x = 0;
if (a > 1 && b == 0)
x=x/a;
if (a == 2 || x > 1)
x=x+1;
return x;
}
int x = 0, y = 0, z = 0;
int main(int argc, char *argv[])
{
int caseno;
for(caseno = 0; caseno <= 2; i ++)
{
switch(caseno)
{
case 1:
x = 1;
y = 0;
z = 0;
break;
case 2:
x = 2;
y = 1;
z = 1;
break;
default :
break;
}
z = fun(x,y);
printf("The result is %d",z);
}
return 0;
}
对于代码的测试,是与编译器息息相关的,不同的编译器,对代码的编译是有很大的差别的,很可能会影响到代码的输出结果。
我是在PowerPC 平台上对这个代码进行调试的,解析出来的汇编代码如下:(为了方便,我在这里只将被测函数的汇编码摘要出来)
int fun(int a, int b)
{
1. 0x40fc fun: 7c6a1b78 mr r10 <a>, r3
2. 0x4100 fun+0x4: 7c8b2378 mr r11 <b>, r4
int x = 0;
3. 0x4104 fun+0x8: 39800000 li r12 <x>, 0
if (a > 1 && b == 0)
4. 0x4108 fun+0xc: 2c0a0001 cmpwi r10 <a>, 1
5. 0x410c fun+0x10: 40810010 ble fun+0x20 (0x411c) T1 ,F1
6. 0x4110 fun+0x14: 2c0b0000 cmpwi r11 <b>, 0
7. 0x4114 fun+0x18: 40820008 bne fun+0x20 (0x411c) T2 , F2
x=x/a; statement 1
8. 0x4118 fun+0x1c: 7d8c53d6 divw r12 <x>, r12 <x>, r10 <a>
if (a == 2 || x > 1)
9. 0x411c fun+0x20: 2c0a0002 cmpwi r10 <a>, 2
10. 0x4120 fun+0x24: 4182000c beq fun+0x30 (0x412c) T3, F3
11. 0x4124 fun+0x28: 2c0c0001 cmpwi r12 <x>, 1
12. 0x4128 fun+0x2c: 40810008 ble fun+0x34 (0x4130) T4,F4
x=x+1; statement 2
13. 0x412c fun+0x30: 398c0001 addi r12 <x>, r12 <x>, 1
return x;
}
14. 0x4130 fun+0x34: 7d836378 mr r3, r12 <x>
15. 0x4134 fun+0x38: 4e800020 blr
从这些汇编来看,我们可以清楚的看出来,对于条件的判断,这个编译器是由左至右来判断的,对于 && 逻辑,当左边的条件不符合,程序会直接跳转,不会再判断右边的逻辑。 对于 || 逻辑,程序会依次判断下来。 我们在跳转语句后面做一些标记,这样看起来更方便一些 ,T代表跳转, F代表不跳转 即逻辑中的真与假。
我们设计用例虽然会考虑全部的条件,可是对于编译器来说,为了提高编译的效率,是不可能对所有的条件都进行判断的。
所以对于case 1, a= 1, b = 0, x = 3; 只能执行 T1,F3,F4 ; statement 1 未执行
对于case 2, a= 2, b = 1, x = 1; 只能执行 F1,T2,T3 ; statement 1 未执行。
从条件覆盖来看,每个case 都只覆盖了3个跳转语句,从语句覆盖来看,都未覆盖statement 1 .
另外,用工具来统计覆盖率时,一般是将所有的case 都执行完毕才一起统计的,因为单个case 是不可能100%覆盖所有分支的。
因为单元测试,尤其是代码的覆盖率,是跟编译器有非常大的关系的,而覆盖率统计的工具,一般都是对汇编码的覆盖进行统计,所以,要想对覆盖率有详细的了解,最好能够看懂汇编码。
我写的比较简单,如果大家有看不懂的地方,欢迎在下面跟贴提问。
一些拙见,希望能够对大家有所帮助!
[ 本帖最后由 seifer1754 于 2007-7-24 13:25 编辑 ] |
|