技术开发 频道

代码覆盖率的价值以及不足

  【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%的代码覆盖率还远不够。

0