【IT168 技术文档】 测试过程中不可缺少的一个步骤,可以揭示没有测试的代码
确定代码达到的覆盖率(覆盖程度)是测试过程中不可缺少的一步。代码覆盖率的度量是软件质量度量中非常重要的一个指标,因为它可以揭示哪些代码/代码块从没有执行过,这通常是“死代码”或者“不完备测试”的指示信号。
如果测试活动中不仅考虑了达到的覆盖率程度,还研究了单个测试用例,如该用例的执行是按照预期的路径执行的吗?,这样做的话,代码覆盖率的价值可能还会增加。
表示项目的进展
如果项目总体的覆盖率一直在被监控,它在一定程度上可以表示项目的进展程度。举例:
如果项目总体的覆盖率持续增长,表明测试进度没有落下,正在赶上;
如果项目总体的覆盖率正在下降,可能意味着新加入的代码没有进行适当的测试。
Two Weaknesses of Code Coverage
即便是达到了要求的覆盖率,你也要时刻提醒自己,代码覆盖率还存在以下两个不足。
不能检测代码遗漏
例如,假设需求是这样的:“最大输入的值是500,如果输入值大于500,则将会当做500来处理”。
如果函数的实现遗漏了对输入值的检查,当然也遗漏了正确的处理方式,如果输入值大于500。代码覆盖率的检查不能发现这个问题。即便是“输入值为501”的测试用例也执行过了。
代码覆盖率度量对“计算”类单元“反应迟钝”
如下代码举例
long double sin(long double x_deg)
{
int i;
long double temp, x_rad;
int sign = -1;
x_rad = x_deg / 180 * pi ;
temp = x_rad;
for(i=3; i<=(MAX_FAC-2); i+=2)
{
temp += sign * pot(x_rad,i) / fac(i);
sign *= -1;
}
return(temp);
}
执行一个测试用例(输入值x_deg = 0),输出返回0 是符合预期的结果,它是正确的。该用例的覆盖率度量指标为:
100%的分支覆盖,100%的 MC/DC覆盖,100%的MCC覆盖。
虽然你达到了100%的各种指标,但你对该函数的计算结果是正确的,还是没有信心。
另外一个完全不同的函数是signum(),它同样是输入0,返回0。
以上的例子表明,100%的代码覆盖率还远不够。