白盒测试(White Box Testing)又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试只测试软件产品的内部结构和处理过程,而不测试软件产品的功能,用于纠正软件系统在描述、表示和规格上的错误,是进一步测试的前提。
白盒测试遵循的四大原则:
保证一个模块中所有路径至少被测试一次;
所有逻辑值都要测试真(true)和假(false)两种情况
检查程序的内部数据结构是否有效;
检查上、下边界及可操作范围内运行所有循环
静态白盒测试
白盒测试分静态和动态两种,静态测试是指不运行程序,通过人工对程序和文档进行分析与检查。下面是静态白盒测试检查的故障模式。
- 内存泄漏的故障(Memory Leak Fault, MLF)
- 数组越界故障的故障(Out of Bounds Array Access Fault OBAF)
- 使用未初始化变量故障(Uninitialized Variable Fault,UVF)
- 空指针使用故障(NULL Pointer Dereference Fault NPDF)
- 非法计算类故障(Illegal Computing Fault ILCF)
- 死循环结构(Dead Loop Fault DLF)
- 资源泄漏(RLF)
- 并发故障 (Concurrency Fault)
- 安全漏洞故障
- 疑问代码故障
简单来说,静态白盒测试就是看代码找bug
动态白盒测试
白盒测试分静态和动态两种,动态测试是指通过运行被测程序,检查运行结果与预期结果的差异,并分析运行效率和健壮性等性能。
动态白盒测试流程:
- 选取定义域有效值,或定义域外无效值;(等价类划分思想)
- 已选取值决定预期的结果;
- 用选取值执行程序;
- 执行结果与对已选取值决定预期的结果对比,不吻合程序有错
逻辑覆盖测试
为了满足白盒测试的四大原则,需要使用逻辑覆盖测试法来设计测试用例。逻辑覆盖测试是以程序内部的逻辑结构为基础设计测试用例的方法,首先需要就行代码的结构分析,绘制流程图。
代码如图所示:
对应结构图如下:
注意:圆圈中的数字代表代码的行数
之后进行逻辑覆盖,由于覆盖测试的目标不同,逻辑覆盖又可分为:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。
从表中的介绍可知,从上到下,该方法覆盖的路径越多。其他方法覆盖的路径不全面,那为什么不直接使用路径覆盖?这是由于如果程序中出现了多个判断和多个循环,可能的路径数目将会急剧增长,以至实现路径覆盖不可能。
为了解决上面的问题,出现了基本路径覆盖,它在程序控制流图的基础上,通过分析程序控制流图的环路复杂性,导出基本可执行路径(独立路径)的集合,然后据此设计测试用例。
各个覆盖方法的优缺点:
数据流测试
数据流测试分析常常集中于定义/引用异常的缺陷,用于如下三方面测试。
- 变量被定义,但是从来没有使用(引用)
- 所使用的变量没有被定义
- 变量在使用之前被定义两次
程序插桩
在程序的特定部位插入记录动态特性的语句,最终是为了把程序执行过程中发生的一些重要的历史事件记录下来。例如,记录在程序执行过程中某些变量值的变化情况,变化的范围等。这些插入的语句常常被称为“探测器”或者“探测点”。
总结
- 白盒测试方法基于被测程序的源代码开发测试用例。常见的白盒测试方法有逻辑覆盖、数据流测试、路径分析以及程序插装等。
- 逻辑覆盖以程序内部的逻辑结构为基础设计测试用例,要求对被测程序的结构作到一定程度的覆盖,如语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖及路径覆盖。路径覆盖是最强的逻辑覆盖准则,实际上我们只能有选择地测试程序中某些有代表的性路径。