本文整理自博主的软件测试学习笔记,适用于软件测试学科的入门学习,专业课期末复习等。包含核心要点,力求简洁高效,希望对各位小伙伴有所帮助。
目录
(3) 根据程序环复杂度的计算公式,求出程序路径集合中的独立路径数目
(4) 根据环复杂度的计算结果,源程序的基本路径集合中有多少条独立路径
一、白盒测试简介
白盒测试(White-box Testing)又称为结构测试或逻辑测试,它一般用来分析程序的内部结构,针对程序的逻辑结构来设计测试用例进行测试。
白盒测试的测试目的是,通过检查软件内部的逻辑结构,对软件中的逻辑路径进行覆盖测试;在程序不同地方设立检查点,检查程序的状态,以确定实际运行状态与预期状态是否一致。
主要包含的测试方法有:
- 基于逻辑的覆盖(语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖)
- 基于路径覆盖
二、程序结构的控制流图
白盒测试需要分析程序的内部结构,程序流图是非常常见的辅助我们分析程序结构的工具。且大多软件测试专业课期末考试也会要求同学们会画给定程序的控制流图,并依此分析环复杂度和设计白盒用例,以考察路径覆盖这一白盒测试方法。
具体如何画图、解题,留到后面讲解题方法的时候再详细说明。这里先熟悉常见程序结构的控制流图:
三、基于逻辑的覆盖
1、语句覆盖
基本思想:设计测试用例时要保证程序的每一条语句至少执行一次。语句覆盖等同于对流程图中所有节点的覆盖。
局限性:语句覆盖是“最弱的覆盖”,只考虑了语句而非判定表达式。
2、判定覆盖(分支覆盖)
基本思想:使程序中每个判断的取真和取假至少经历一次,即判断的真假均曾被满足。判定覆盖等同于对流程图中所有边的覆盖。
局限性:未彻底分析每个简单判定条件的取值情况,仍然会导致遗漏部分缺陷。
3、条件覆盖
基本思想:条件覆盖要求所设计的测试用例能使每个判定中的每一个条件都获得可能的取值, 即每个条件至少取一次真值、取一次假值。只考虑条件本身,不考虑整个判定节点的真假情况。
局限性:条件覆盖不能保证100%的判定覆盖。
4、判定-条件覆盖
基本思想:测试用例可以使得判定中每个条件所有的可能取值都至少执行一次(条件覆盖),同时每个判定本身所有的可能取值也至少执行一次(判定覆盖)。
局限性:判定条件覆盖并未考虑条件的组合情况。
*修正的判定-条件覆盖
修正方式:
示例:
最终抽取最少独立影响对,即为测试用例集。
5、组合覆盖(条件组合覆盖)
基本思想:测试用例应该使得每个判定中的各个条件的各种可能的组合都至少出现一次。实质是通过列出真值表的方式来得到完全的覆盖,即以冗余换取方法的简单性。满足条件组合覆盖的测试用例一定是满足判定覆盖、条件覆盖和判定-条件覆盖的。
局限性:覆盖率较高,但测试用例数量也较多。
⭐逻辑覆盖-解题方法
参考上面提到的知识点,可以给出下面的答案(注意,答案不唯一):
⭐四、基本路径的覆盖-解题方法
路径覆盖与控制流图紧密相关,“路径”指的就是控制流图中的节点与边。概念清晰易懂,这里不过多阐述,只讲最关键的部分:如何解题。
示例:
(1) 根据代码画出程序流程图
画流程图的目的是为了将程序转为控制流图。
流程图与控制流图不同,流程图一般是长这样的:
流程图中,一般会标识出开始和结束,会标识出每一个步骤或程序中的每一条语句(用矩形表示),会标识出每一个判定以及判定的结果(用菱形和YES、NO表示)。
可以简单地记,控制流图的图里只有圆形的节点和边,而流程图要素更多,节点有菱形有矩形还有YES和NO就行。
画流程图的方式也很简单,只需逐句地阅读程序,如果是一条普通的顺序执行的语句,就画个矩形并在矩形内写上该条语句的标识(有时要求也没有那么严格,不一定要把所有的顺序执行的语句各自画到不同的节点上;将一串语句压缩,画到一个节点中,也是可以的);如果遇到判定,就用菱形表示,并在每条边上标上判定的结果。
因此,上述代码的流程图可以画作:
注意:流程图并不是目的,而是获得控制流图的手段。 因此在练习或考试中,即使每个人画出的流程图都不完全相同,但只要能得到正确的控制流图以及后续的环复杂度,就不必说它错。
(2) 画出控制流图
流程图压缩的原则:
- 剔除注释语句
- 剔除数据变量的声明语句
- 所有连续的串行语句压缩为一个
- 所有循环次数压缩为一次循环
因此可以获得控制流图:
(3) 根据程序环复杂度的计算公式,求出程序路径集合中的独立路径数目
环复杂度也叫圈复杂度,计算方式(下面的图与上面的例题无关,仅用于说明环复杂度的计算方式):
推荐应试中采用第三种方法V(G) = P+1得出答案!!!因为判定节点的数量并不与控制流图强相关,换句话说,即使控制流图画错了,数对源程序代码中有几个判定节点,环复杂度也能算对!
而第一种和第二种方法可以作为验算的方式,来判断自己的控制流图是否画对。
例题中,根据第(2)步得出的控制流图,可算得一共有3个判定节点(节点3、4、6),因此V(G) = P + 1 = 3+1,控制流程图环形复杂度为 4。
(4) 根据环复杂度的计算结果,源程序的基本路径集合中有多少条独立路径
环复杂度是4,即有4条独立路径。分别写出即可:
(5) 写出对应的测试用例
掌握上面这些要点,就能解路径覆盖的综合题了。
*补充练习
(1)程序流程图
(2)控制流图
(右上角的节点14才是结束)
(3)环路复杂度
V(G) = P + 1,P是判定节点的数量,为3。因此 3+1=4,环路复杂度为4。
也可以用 V(G) = E - N + 2,其中 E 为边的数量,N 为节点的数量。根据控制流图计算:E = 10,N = 8,因此 V(G) = 10 - 8 + 2 = 4。
(4)基本路径集
路径1:5 -> 14
路径2:5 -> 7 -> 8 -> 14
路径3:5 -> 7 -> 9 -> 10 -> 5 -> 14
路径4:5 -> 7 -> 9 -> 11 -> 12 -> 5 -> 14
(5)写出对应测试用例
用例1: i = 100, j = 4
用例2: i = 1, j = 6
用例3: i = 10, j = 7
用例4: i = 10, j = 100
*路径覆盖小结
基于路径的覆盖是最重要的白盒测试方法之一,其思想可用于任何动态模型中。
如在单元测试阶段,主要用于对程序源代码的执行测试;在集成测试或系统测试阶段,主要用于对业务流程、页面跳转等类似动态执行路径的测试。
以及,路径覆盖中除了环复杂度的计算,还涉及“基本复杂度”的计算,本文不作详细介绍,只作简单说明。
基本复杂度
概念:通过对程序图中的结构化设计节点进行不断压缩,最终得到一个无法压缩的程序图,该图的环复杂度就称为基本复杂度。基本复杂度关注的是程序中所有非结构化设计的代码,包含测试优化和设计优化的思想。
即使程序环复杂度较高,但若基本复杂度不高,则说明该程序多为结构化的设计,设计本身较优,引入缺陷的风险更低,也更利于分别针对被压缩的结构化设计展开独立测试。