目录
2.2.1 语句覆盖(Statement Coverage)
2.2.3 条件覆盖(Condition Coverage)
2.2.4 判定/条件覆盖(Branch/Condition Coverage)
2.2.5 条件组合覆盖(Condition Combination Coverange)
2.2.6 修正的判定/条件覆盖(Modified Condition/Decision Coverage)
一、概述
软件测试不仅包括动态测试,还包括对系统的静态检查,这种检查通常不需要实际运行被测软件,而是直接对软件形式和结构进行分析。
1.1 关注对象
- 源代码
措施:阅读源代码,检验代码的规范性,并对照函数功能查找代码的逻辑缺陷、内存管理缺陷、数据定义和使用缺陷等。
- 程序结构
措施:使用与程序设计相关的图表,找到程序设计的缺陷,或评价程序的执行效率。
1.2 优劣势
优势
针对性强,便于快速定位缺陷。
在函数级别开始测试工作,缺陷修复成本低
有助于了解测试的覆盖程度
有助于代码优化和缺陷预防
不足和弊端
对测试人员要求高(测试人员需要具备一定的编程经验,白盒测试工程师需要具备广播的知识面)
成本高(白盒测试准备时间较长)
二、常见白盒测试方法
2.1 控制流分析
2.1.1 常见的程序结构
- 线性结构
- 条件判定结构
- while-do循环结构
- do-while循环结构
缺陷风险逐渐增大:串行结构<两分支的条件判断<多分支的条件判断<循环结构
2.1.2 控制流分析的内容
- 关注判定节点固有的复杂性
- 焦点:判定表达式
- 方法:逻辑覆盖测试
- 关注判定结构与循环结构对执行路径产生的影响
- 焦点:路径
- 方法:独立路径测试
- 关注循环结构本身的复杂性
- 焦点:循环体
- 方法:基于数据的静态分析
2.2 对判定的测试(逻辑覆盖)
基本测试原则:对程序代码中所有的逻辑值均需要测试真值和假值的情况
通过考察源代码中的复合判定表达式,或构成复合判定表达式的各个简单判定条件的所有取值来展开测试
2.2.1 语句覆盖(Statement Coverage)
设计测试用例时,需要保证程序中每一条可执行语句至少应执行一次
语句覆盖是最弱的一种覆盖标准,它主要存在两方面弊端:
- 关注语句,而非关注判定节点
- 对隐式分支无效(隐式分支:if条件判定中,缺少else的情况)
- 对策:优选测试数据
- 更强的覆盖准则:判定覆盖
2.2.2 判定覆盖(Branch Coverage)
判定覆盖(分支覆盖):设计测试用例时,应保证程序中每个判定节点取得每种可能的结果至少一次,相当于对控制流图进行边覆盖
判定覆盖的局限性:
当判定节点中包含的是复合判定表达式,即由多个简单判定条件通过“与"、"或"关系连接而成的判定时,判定覆盖仅关心表达式的整体取值,并不关心表达式如何构成,不能覆盖到每个子条件的所有取值情况,由此导致测试漏洞
2.2.3 条件覆盖(Condition Coverage)
设计测试用例时,应保证程序中每个复合条件判定表达式中,每个简单判定条件的取真和取假情况至少执行一次。
条件覆盖并不能确保满足判定覆盖,它虽然进一步检查了判定节点中的每个子条件,但判定节点局部的完全覆盖并不能保证对判定节点整体的完全覆盖。
2.2.4 判定/条件覆盖(Branch/Condition Coverage)
测试用例的设计应满足判定节点的取真、取假分支至少执行一次,且每个简单判定条件的取真和取假情况也至少执行一次,即判定覆盖+条件覆盖。
弊端:设计难度大
2.2.5 条件组合覆盖(Condition Combination Coverange)
测试用例的设计应满足每个判定节点中,所有简单判定条件的所有可能的取值组合情况应至少执行一次。
本质:通过列出真值表的方式来得到完全的覆盖(用测试用例的冗余来换取方法的简单性)
优势:方法简单;只需要找到所有简单情况,并列出真值表,穷尽所有组合情况即可
弊端:测试用例太多,冗余严重