四、基于逻辑覆盖的方法
下面方法以该图为例子:
可知有4种判定条件:T1: a>1,T2: b<2,T3: a==3,T4: x>3。
4种路径:L13: p1+p3,L14: p1+p4,L23: p2+p3,L24: p2+p4。
1.语句覆盖(最弱)
(1)基本思想:应保证程序的每一条可执行语句至少执行一次。(例如本题,只要执行一个分支L24即可满足语句覆盖100%)。
(2)等同于对图中所有节点的覆盖。
(3)只关注语句而非判定表达式,所以对隐式分支根本察觉不到错误,铁fw。
2.判定覆盖
(1)基本思想:应保证程序中每个判定节点的取真和取假分支至少执行一次。(每个分支都要执行一次)
(2)等同于对图中所有边的覆盖。
(3)画出判定表:
(4)依然有局限性,不是直接关注单个条件,依然会有小杂鱼跑掉。(例如本题,如果错写成(a>1)||(b<2),那如果只采用3,4依然无法发现缺陷,所以有用但不多)
3.条件覆盖
(1)基本思想:应保证程序中每个复合判定节点中,每个简单判定条件的取真和取假情况至少执行一次(例如本题两个判定节点,但是有四个判定条件)。
(2)每个判定条件取真/假各一次,不考虑判定节点的真假情况。
(3)写出条件表(条件1和条件2各为真为假一次,加上条件3和条件4各为真为假一次,不过两者错开,则刚好完成下面的表格):
4.判定/条件覆盖
(1)即判定覆盖+条件覆盖,就是既要条件覆盖率100%,又要判定覆盖率100%。
(2)每个判定条件和判定节点均取到真/假各一次。
(3)设计一组符合该指标要求的测试用例比较困难,修改流程图得:
(4)写出判定表:
5.条件组合覆盖
(1)基本思想:应满足每个判定节点中,所有简单判定条件的所有可能的取值组合情况应至少执行一次(注意是取值,无穷无尽)。
(2)实质是通过列出真值表的方式来得到完全的覆盖,即以冗余换取方法的简单性。
(3)当判定节点非常复杂,或者判定节点数过多,这方法就变成纯nt了。
6.对路径的测试——基本路径测试法(超级重点)
(1)根据程序代码 画出程序流程图:
关键点在于判定节点写成菱形,正常语句写成方块,该图 方块序号14就是结束的地方。
还有就是把判定条件写上,分别是Y和N,写成T和F应该也不错吧?
(2)根据程序流程图画出控制流图。
这步骤不要觉得简单,真的画出来就能拿分!
(3)计算程序的环路复杂度V(G)。
方法有三种:
a.区域法:流程图中区域的数量对应于环型的复杂性,图中共4个区域,故V(G)= 4。
b.边法:公式为V(G)= E-N+2,E是边的数量,N是节点的数量。V(G)=10-8+2
c.节点法:公式为V(G)= P+1,P是流图G中判定节点的数量。V(G)=3+1
(4)导出可执行路径。
关键在于找到结束方块,本题上面说了就是14。
PS:独立路径数量 = 其程序图的环复杂度。
(5)设计测试用例:
7.环路复杂度奇葩版
(1)使用公式V(G)= E-N+2,必须保证图是个强(双向)连通图,即结束的地方连回到开始地方。
但是注意区域法不需要加这条边,这个仅针对这个边法,也不需要修改源代码。
(2)使用公式V(G)= P+1,必须保证不包含孤立节点,即Switch语句引起的多分支的程序可以修改为if…else if…else形式的判定结构。
该图中转化后,2和3.5和4.5,共三个节点,最后复杂度就是3+1=4。
(3)对于多出口程序,就让几个出口合在一块,然后用区域法最快,注意这时候区域法不连一块就用不了,前面俩情况不是这样的。
这里可算出复杂度为5。