注:转载文章如涉及版权,请通知。原创作品如转载,请注明出处并保持完整。

Test Theory——Coverage Analyze 3: Path Coverage

上一篇 / 下一篇  2009-05-21 14:36:08 / 个人分类:Testing

路径覆盖率(Path Coverage)指示被给的函数的每条可能的路径在控制流中是否被执行。

首先我们必须对路径做个基本的定义。
那何为路径呢?

我们看看Parasoft C++ Test中对Path的定义:
Path: A unique sequence of basic blocks starting from the function entry to point of exit.

也就是说,一个路径就是一个从函数的入口到函数的出口的唯一的系列分支。

从路径覆盖中,我们可以看出可以组合的逻辑条件的路径,有些地方将路径覆盖率也称之为断言覆盖率(Predicate Coverage).

由于往往造成路径不同的是各种循环、条件组合、分支选择等,因此对于一个完全测试的话,我们必须设计和执行大量、复杂的测试用例。

因为循环可能引入很大的路径数,我们往往只考虑有限数量的循环可能性。从这个思维出发,我们便能产生许多变种来处理循环,如内部边界路径测试(Boundary-interior path testing)只考虑循环的两个可能性。重复零次和多于零次的重复。对于do-while 循环,两种,零次反复和多于零次反复。

我们再来看看C++ Test中是如何处理和计算各种循环情况的路径的。
C++test considers two possibilities for while-loops and for-loops: zero and at least one repetition. For do-while-loops, the two possibilities are one iteration and more than one iteration.

另外,研究者也发明了很多种的路径覆盖技术来避免大数量的路径。 n-length sub-path coverage 报告你是否执行了具有N分支子路径的所有路径。其它的变种包括linear code sequence and jump (LCSAJ) coverage 和data flow coverage.

路径覆盖率是一种比较强的覆盖率,它需要对程序进行彻底的测试,但是也有两个主要的缺点:
1.循环导致的大路径问题。因为路径是随着分支数成指数增长的。如果一个函数包含10个IF语句,那么就有1024个路径要测试。而且再加入一个IF语句,路径数就将达到2048。显然要想达到彻底的测试,必须付出很大的人力和时间的成本。当然,我们往往不会这样去做,而是采用一些变种技术有针对性的进行大路径覆盖率的统计。
2.许多路径可能与执行的数据有关。这往往导致覆盖率的统计误差。如果这种情况比重比较大,显然这将带来额外的排错任务。也正是因为如此,路径覆盖不能完全取代一些其他的覆盖率如条件覆盖。条件覆盖将在后面讲到。
我们看个例子:
if(A==TURE)
statment1;
if(A==TURE)
Statement2;
这里很明显只要两条路径就够了,而且最多也只能执行两条路径,但是路径覆盖率统计时将认为这里包含四条路径,所以有两条路径将永远无法统计,这将造成误报并影响统计率报告。

其实,对于覆盖率的统计往往不是我们能够控制的,但是明确覆盖率的定义和如何有效的执行这些不同的覆盖率来完成不同的工作才是最关键的。






TAG:

 

评分:0

我来说两句

charlie.chow

charlie.chow

积极,乐观,淡定

日历

« 2024-05-10  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 9050
  • 日志数: 36
  • 建立时间: 2009-05-17
  • 更新时间: 2009-06-19

RSS订阅

Open Toolbar