2.3 路径分析法
路径分析法概述
路径分析法(Path Analysis)延续了部分覆盖分析法的思路,对程序或业务进行分析,对路径进行覆盖或”优化”处理。
路径分析法常被用于白盒的程序路径覆盖,其实也可以用于业务流程的分析与覆盖。
独立路径选择和Z路径覆盖是两种常见的路径覆盖方法。
路径覆盖测试
定义
**路径覆盖(Path Coverage)**就是设计足够多的测试用例,覆盖程序中所有可能的路径。路径分析法实质上也是一种覆盖方法,这种覆盖是基于对路径的分析。
组合-路径覆盖
取组合覆盖和路径覆盖测试用例集的并集,得到组合-路径覆盖,则满足了以上所有的逻辑覆盖,是目前为止的最强覆盖。
组合-路径覆盖测试用例
| 序号 | 组合号 | 测试用例 | 覆盖条件 | 执行路径 | 期望 |
|---|---|---|---|---|---|
| 1 | 1, 5 | x=4, y=0, z=5 | T₁, T₂, T₃, T₄ | ace | 13 |
| 2 | 1, 8 | x=4, y=0, z=7 | T₁, T₂, F₃, F₄ | acd | 15 |
| 3 | 4, 5 | x=2, y=2, z=3 | F₁, F₂, T₃, T₄ | abe | 2 |
| 4 | 2, 6 | x=4, y=8, z=3 | T₁, F₂, T₃, F₄ | abe | 4 |
| 5 | 3, 7 | x=2, y=0, z=6 | F₁, T₂, F₃, T₄ | abe | 2 |
| 6 | 4, 8 | - | F₁, F₂, F₃, F₄ | abd | - |
注:序号6因条件矛盾故无相应测试用例。
ESTCA覆盖准则
逻辑覆盖理论上是想要做到测试全面而无遗漏,但其出发点是设计合理的、完善的测试用例设计,然而却很难做到真正做到无遗漏。
K.A.Foster从测试工作实践的教训出发,吸收了计算机硬件的测试原理,提出了一种经验型的测试覆盖准则——错误敏感测试用例分析ESTCA(Error Sensitive Test Cases Analysis)。
ESTCA覆盖准则是一套错误敏感用例分析规则。这一规则虽然并不完备,但在普通程序中却是有效的。
ESTCA规则
规则1
对于A rel B型(rel可以是<、=或>)的分支谓词,应适当的选择A与B的值,使得测试执行到该分支语句时,A<B、A=B、A>B的情况分别出现一次。
目的:检测逻辑符号写错的情况,如将”A<B”错写为”A>B”。
规则2
对于A rel C型(rel可以是>或<,A是变量,C是常量)的分支谓词:
- 当rel为<时,应适当的选择A的值,使A=C-M(M是距C最小的机器容许正数,若A和C都为正整数时,M=1)
- 当rel为>时,应适当的选择A的值,使A=C+M
目的:检测”差1”之类的错误,如”A>1”错写成”A>0”。
规则3
对外部输入变量赋值,使其在每一个测试用例中均有不同的值与符号,并与同一组测试用例中其他变量的值与符号不同。
目的:检测程序语句中的错误,如应该引用某一变量而错成引用另一个常量。
基本路径测试
独立路径
独立路径是指在程序中至少引进一个新的处理语句集合或一个新条件的任一路径。一条独立路径是至少包含一条其他独立路径中从未有过的边的路径。
控制流图
**控制流图(Control Flow Graph)**是指用是由节点和控制边,描述流程的控制结构。
控制流图的特点
- 具有唯一入口节点(源节点),表示开始语句
- 具有唯一出口节点(汇节点),表示结束语句
- 节点由带有标号的圆圈表示,表示一个或多个无分支的源程序语句
- 控制边由带箭头的直线或弧表示,代表控制流的方向
- 包含条件的节点被称为判定节点(或判断节点)
- 由边和节点所包围起来的范围称为区域
复合条件的处理
如果程序判断中的条件表达式是由一个或多个逻辑运算符(or, and, not)连接的复合条件,则在控制流图中需要将复合表达式拆分为多个单个条件,并映射为控制流图。
环形复杂度(圈复杂度)
定义
通过对控制流图的分析可以计算流程复杂度,再从程序的环路复杂性可以导出程序的独立路径条数,这是确定程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。
计算方法
方法1:区域法
V(G) = A,其中A是控制流图G中区域的数目
方法2:边点法
V(G) = E - N + 2,其中E是控制流图中边的数量,N是控制流图中节点的数目
方法3:判定节点法
V(G) = P + 1,其中P是控制流图中判断节点的数目
基本路径测试法步骤
步骤1:画出控制流图
步骤2:计算环形复杂度
步骤3:确定基本路径
利用”主路径 + 转向”的策略确定基路径集合:
- 首先从流图的入口节点出发,到出口节点结束,寻找一条包含尽可能多分支节点的路径记录下来作为主路径
- 然后以主路径为基础,一次对各个分支节点转向到另外一条未执行分支以产生新的路径
- 每次只改变一个分支节点的路径选择
步骤4:设计测试用例
使得基本路径组中的每条路径被执行一次。
循环结构测试
Z路径覆盖
最简单的循环测试方法是把循环当做分支结构,只需考虑循环一次和直接跳出循环体两种情况。这种简化循环意义下的路径覆盖称为Z路径覆盖。
Z路径覆盖对于解决程序中出现多个循环,或者有多个判断和循环的情况,可以大大缓解测试路径的急剧增长。
简单循环测试
设n为循环次数的上限,1为循环次数的下限,则可以设计7个测试用例:
| 序号 | 测试用例 | 期望 | 说明 |
|---|---|---|---|
| 1 | num=0 | 0 | 循环次数<1,差1原则 |
| 2 | num=1 | 1 | 循环次数=1 |
| 3 | num=2 | 1 | 循环次数>1,差1原则 |
| 4 | num=35 | 324 | 任意有效循环次数 |
| 5 | num=99 | 2500 | 循环次数<100,差1原则 |
| 6 | num=100 | 2500 | 循环次数=100 |
| 7 | num=101 | 2601 | 循环次数>100,差1原则 |
总结
围绕分支结构的基于基本路径的测试用例设计方法,可以大大减少覆盖逐渐加强带来的测试用例数目急剧增多的问题,也解决了许多分支结构关系多且复杂的测试问题。