软件测试笔记(四):白盒测试
1 白盒测试
白盒测试是对软件的过程性细节做细致的检查,把测试对象看作是一个打开的盒子,允许测试人员利用程序内部的逻辑结构以及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序状态,确定实际状态是否与预期的状态一致。
白盒测试只测试软件产品的内部结构和处理过程,而不是测试软件产品的功能,可以分为静态和动态两种:
- 静态白盒测试就是在不执行测试的情况下有条理仔细审查软件设计、体系结构和代码,从而找出软件缺陷的过程
- 动态白盒测试也叫结构化测试,通过查看并使用代码的内部结构,设计和执行测试
白盒测试的常见方法包括:
- 逻辑覆盖法
- 路径分析
- 控制结构测试
2 逻辑覆盖法
逻辑覆盖法又叫控制流覆盖,是按照程序内部逻辑结构设计测试用例的测试方法,根据程序中的判定和条件控制流覆盖准则来定量度量测试进行程度,按照覆盖标准的不同,可以分为:
- 语句覆盖
- 判定覆盖
- 条件覆盖
- 条件判定覆盖
- 修正条件判定覆盖
- 条件组合覆盖
- 路径覆盖
2.1 语句覆盖
语句覆盖又叫线覆盖面或者段覆盖面,含义是选择足够数目的测试数据,使被测试程序中每条语句至少执行一次。语句覆盖可以直接应用于目标代码,不需要处理源代码,但是由于对一些控制结构不敏感(比如同样的测试用例,语句中的逻辑运算符从and
改为or
也同样通过),逻辑覆盖率低,因此往往不能发现判断中逻辑运算符出现的错误。
2.2 判定覆盖
又叫分支覆盖或所有边覆盖,用于测试控制结构中布尔表达式分别为真和假,其中布尔表达式被认为是一个整体,不考虑内部是否包含了“逻辑与”或者“逻辑或”等运算符。判定覆盖的基本思想是设计的测试用例是的程序中每个判定至少分别取“真”分支和取“假”分支经历一次,即判断真假值均被满足。
判定覆盖比语句覆盖提供了更强的测试能力,但是,大部分的判定语句是由多个逻辑条件组合而成的,仅仅判断最终的逻辑运算结果并不能真正覆盖所有的测试路径,这是判定覆盖的一个缺点。
2.3 条件覆盖
条件覆盖是设计测试用例,使得每个判断中每个条件的可能取值至少满足一次。
条件覆盖比判定覆盖增加了对符合判定情况的测试,增加了测试路径,但是条件覆盖只能保证每个条件至少有一次为真,而不考虑所有的判定结果。
2.4 条件/判定覆盖
条件/判定覆盖是综合了条件覆盖与判定覆盖的一种方法,含义是通过设计足够的测试用例,使得判断条件中所有条件可能至少执行一次取值,同时所有判断的可能结果至少执行一次。
表面上,条件/判定覆盖能同时满足判定覆盖以及条件覆盖两种标准,但实际上并没有完全覆盖所有的“真”和“假”取值的条件组合情况,这种情况下需要将判定语句中的复合条件表达式进行分解,形成由多个基本判定嵌套组成的流程图,以有效检查所有条件是否正确。
2.5 修正条件/判定覆盖
修正条件/判定覆盖(缩写为MC/DC
)可以解释为:
- 每个条件的所有可能结果至少出现一次
- 每个判定本身的所有可能结果也至少出现一次
- 每个入口点与出口点至少要唤醒一次
- 每个条件都显示能单独影响判定结果
MC/DC
具有如下优点:
- 继承了多重条件覆盖的优点
- 线性地增加了测试用例的数量
- 对操作数以及非等式条件变化反应敏感
- 具有更高的目标码覆盖率
2.6 条件组合覆盖
基本思想是,设计测试用例使得:
- 每个条件中的所有可能至少出现一次
- 每个判断本身的判定结果也至少出现一次
条件组合覆盖是一种相当强的覆盖准则,可以有效地检查各种可能的条件取值的组合是否正确,它不但可以覆盖所有条件的可能取值组合,还可以覆盖所有判断的可取分支,但仍有可能的路径会遗漏掉,测试还不完全。
2.7 路径覆盖
路径覆盖的基本思想是,选择足够的测试用例,使得程序中所有可能的路径都至少被执行一次。一条路径是从函数的入口到出口分支的一个唯一序列。
路径覆盖的覆盖率比前面几种逻辑覆盖要大,但是随着代码增加,测试工作将呈指数级增长,比如一个函数包括10个判断语句,那么就需要测试2^10 = 1024
个路径。
2.8 总结
语句覆盖的效果最弱,路径覆盖的效果最好,如下图所示:
优缺点集合:
3 路径分析
路径分析测试法是在程序控制流程图的基础上,通过分析控制构造的环路复杂性,导出独立路径集合,设计测试用例的方法。程序的所有路径作为一个集合,在这些路径集合中必然存在一个最短路径,这个最小的路径称为基路径或独立路径。
路径分析与测试法主要步骤如下:
- 绘制控制流图
- 计算圈复杂性,圈复杂性用于计算程序的基本独立路径数目,确保所有语句至少执行一次的测试数量的上界
- 确定独立路径的集合,独立路径是指至少引入程序的一个新处理语句集合或一个新条件的路径,即独立路径必须包含一条在定义之前不曾使用的边
- 测试用例生成,设计测试用例的数据输入和预期结果,确保基本路径集中每条路径上的执行
4 控制结构测试
控制结构测试可以分为:
- 条件测试:检查程序模块中所包含逻辑条件的测试用例设计方法
- 循环测试:检测代码中的简单循环、嵌套循环以及串接循环,测试用例包括零次循环、一次循环、两次循环、m次循环、最大循环次数等等
- Z路径覆盖:是路径覆盖的一个变体,是一种在大量判断和多个循环组合的情况下减少循环测试次数的方法,Z路径覆盖不考虑循环的形式和复杂度如何,也不考虑实际执行循环体次数是多少,只考虑通过循环体零次和一次这两种情况