主路径覆盖 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 包含所有对应的往返路径。
这些准则会忽略不在往返路径中的节点和边。
也就是说不蕴含:节点覆盖、边覆盖、边对覆盖。
简单路径与主路径示例

练习


基本路径覆盖 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 的基本路径测试一般包括四步:
- 生成控制流图。
- 计算圈复杂度。
- 选择一组基本路径。
- 为这些基本路径生成测试用例。
基本路径测试 = 控制流图 + 圈复杂度 + 独立路径集合 + 测试用例生成。
如果程序有多个返回点,那么在构造控制流图或者计算圈复杂度时,需要特别处理,例如把多个返回点统一连接到一个虚拟出口节点。
这样才能保持“一个入口、一个出口”的假设。
