主路径覆盖 Prime Path Coverage

如果一个图中包含循环,那么它就有无限多条路径。

因此,CPC 不可行。

CPC:Complete Path Coverage,完全路径覆盖。

简单路径 Simple Path

从节点 ni 到节点 nj 的一条路径,如果除了第一个节点和最后一个节点可以相同之外,没有任何节点重复出现,那么这条路径就是简单路径。

没有内部循环。

一个循环本身也可以是一条简单路径。

简单路径

主路径 Prime Path

一条简单路径,如果它不是任何其他简单路径的真子路径,那么它就是主路径。

这里的 proper subpath,真子路径 可以理解为:

它作为子路径出现在另一条更长的简单路径中,并且不是完全相同的那条路径。

主路径

主路径覆盖 Prime Path Coverage,PPC

主路径覆盖是一种简单、优雅并且有限的覆盖准则。

测试需求 TR 包含图 G 中的每一条主路径。

测试路径集合中必须覆盖图里的所有主路径。

也就是说,PPC 蕴含节点覆盖和边覆盖。

但是,PPC 不蕴含 EPC。

eg: 一个v指向自己的循环,然后循环退出后到v',如果是EPC则是[v, v, v'],而PPC则是[v, v']

往返路径 Round-Trip Path

一条从某个节点开始,并且最终回到同一个节点的主路径。

简单往返路径覆盖 Simple Round Trip Coverage,SRTC

对于图 G 中每个可达的、能够开始并结束一条往返路径的顶点,测试需求 TR 至少包含一条对应的往返路径。

完全往返路径覆盖 Complete Round Trip Coverage,CRTC

对于图 G 中每个可达的、能够开始并结束往返路径的顶点,测试需求 TR 包含所有对应的往返路径。

这些准则会忽略不在往返路径中的节点和边。

也就是说不蕴含:节点覆盖、边覆盖、边对覆盖。

简单路径与主路径示例

简单路径与主路径示例

练习

练习题图1

练习题图2

基本路径覆盖 Basic Path Coverage

前面讲的是 Prime Path Coverage,主路径覆盖,偏图覆盖准则。

接下来讲的是 McCabe 提出的 Basic Path Testing,基本路径测试,它和圈复杂度有关。

基本路径测试 Basic Path Testing

它是一种介于 分支覆盖 和 所有路径覆盖 之间的测试准则。

基本路径测试是一种测试方法,它满足分支测试的要求,并且测试所有独立路径。

这些独立路径可以用来构造程序中的任意路径。

独立路径 Independent Path

一条通过系统的路径,只有当它包含了其他路径中没有覆盖过的某些顶点或边时,它才是相对于其他路径独立的。

线性独立路径

假设图中有这些边:[e1,e2,e3,e4,e5,e6,e7,e8,e9]

可以把每一条路径看作一个向量,向量的每个元素对应图中的一条边,如果路径中包含这条边,那么对应的元素就是1,否则就是0。

例如[1,1,0,0,1,1,0,0,1]

[e1, e2, e3, e4, e5, e6, e7, e8, e9]
 
[1,1,0,0,1,1,0,0,1]
[1,1,1,1,1,1,0,0,1]
[1,1,0,0,1,1,1,1,1]
[1,1,1,1,1,1,1,1,1]
[1,1,2,2,1,1,2,2,1]

从线性代数的角度看,每个矩阵都有一个唯一的秩。

并且矩阵的秩一定小于或等于列数。

线性独立路径的数量

线性独立路径的数量就是这个矩阵的秩。

而这个矩阵的秩,恰好等于图的 cyclomatic complexity,圈复杂度。

McCabe 的圈复杂度

CC = E - V + 2

其中:

  • E 是图中的边数
  • V 是图中的节点数
  • CC 是图的圈复杂度

McCabe 的基本路径测试

McCabe 的基本路径测试一般包括四步:

  1. 生成控制流图。
  2. 计算圈复杂度。
  3. 选择一组基本路径。
  4. 为这些基本路径生成测试用例。

基本路径测试 = 控制流图 + 圈复杂度 + 独立路径集合 + 测试用例生成。

如果程序有多个返回点,那么在构造控制流图或者计算圈复杂度时,需要特别处理,例如把多个返回点统一连接到一个虚拟出口节点。

这样才能保持“一个入口、一个出口”的假设。