白盒测试(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
动态白盒测试
白盒测试分静态和动态两种,动态测试是指通过运行被测程序,检查运行结果与预期结果的差异,并分析运行效率和健壮性等性能。
动态白盒测试流程:
- 选取定义域有效值,或定义域外无效值;(等价类划分思想)
- 已选取值决定预期的结果;
- 用选取值执行程序;
- 执行结果与对已选取值决定预期的结果对比,不吻合程序有错
逻辑覆盖测试
为了满足白盒测试的四大原则,需要使用逻辑覆盖测试法来设计测试用例。逻辑覆盖测试是以程序内部的逻辑结构为基础设计测试用例的方法,首先需要就行代码的结构分析,绘制流程图。
代码如图所示:
对应结构图如下:
注意:圆圈中的数字代表代码的行数
之后进行逻辑覆盖,由于覆盖测试的目标不同,逻辑覆盖又可分为:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。
从表中的介绍可知,从上到下,该方法覆盖的路径越多。其他方法覆盖的路径不全面,那为什么不直接使用路径覆盖?这是由于如果程序中出现了多个判断和多个循环,可能的路径数目将会急剧增长,以至实现路径覆盖不可能。
为了解决上面的问题,出现了基本路径覆盖,它在程序控制流图的基础上,通过分析程序控制流图的环路复杂性,导出基本可执行路径(独立路径)的集合,然后据此设计测试用例。
各个覆盖方法的优缺点:
在实际测试中,即使对于路径数很有限的程序已经做到路径覆盖,仍然不能保证被测试程序的正确性,还需要采用其他测试方法进行补充。
数据流测试
数据流测试分析常常集中于定义/引用异常的缺陷,用于如下三方面测试。
- 变量被定义,但是从来没有使用(引用)
- 所使用的变量没有被定义
- 变量在使用之前被定义两次
早期的数据流测试主要用于检测程序编写时出现的一些警告信息,如“所定义的变量未被使用等”问题,这些问题光靠简单的语法分析器或者是语义分析器是无法检测出来的。
程序插桩
在程序的特定部位插入记录动态特性的语句,最终是为了把程序执行过程中发生的一些重要的历史事件记录下来。例如,记录在程序执行过程中某些变量值的变化情况,变化的范围等。这些插入的语句常常被称为“探测器”或者“探测点”。
总结
- 白盒测试方法基于被测程序的源代码开发测试用例。常见的白盒测试方法有逻辑覆盖、数据流测试、路径分析以及程序插装等。
- 逻辑覆盖以程序内部的逻辑结构为基础设计测试用例,要求对被测程序的结构作到一定程度的覆盖,如语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖及路径覆盖。路径覆盖是最强的逻辑覆盖准则,实际上我们只能有选择地测试程序中某些有代表的性路径。