文章目录
- 白盒测试的基本原理
- 关注对象
- 优势
- 不足和弊端
- 白盒测试的经济学问题
- 控制流分析技术
- 控制流分析技术要解决的问题
- 线性结构
- 条件判定结构
- while-do循环结构
- do-while循环结构
- 控制流分析内容
- 逻辑覆盖测试
- 语句覆盖测试
- 判定覆盖测试
- 条件覆盖测试
白盒测试的基本原理
关注对象
源代码:
阅读源代码,检验代码的规范性,并对照函数功能查找代码的逻辑缺陷、内存管理缺陷、数据定义和使用缺陷
程序结构:
使用与程序设计相关的图标,例如函数调用图、算法流程图,找到程序设计的缺陷,或评价程序的执行效率
优势
- 针对性强,便于快速定位缺陷
- 在函数级别开始工作,缺陷修复的成本低
- 有助于了解测试的覆盖程度
- 有助于代码优化和缺陷预防
不足和弊端
- 对测试人员要求高
- 成本高,准备时间长
白盒测试的经济学问题
- 通过测试无法证明,被测软件系统是没有缺陷的
- 软件测试的经济学问题
- 应对策略二:白盒测试
- 对每一种可能的执行路径进行测试,是否可行
控制流分析技术
控制流分析技术要解决的问题
- 什么因素导致程序结构变得复杂?
- 如何衡量程序结构的复杂程度?
- 控制程序执行流程发生变化的主要因素是什么?
- 如何测试这些因素,并确保测试的效率?
线性结构
void func1(int a){int b;b = a + 1;printf("a=%d,b=%d\n",a,b); }
只有一条可执行路径
条件判定结构
void func2(int a){int b = 0;if(a>1){b = a + 1;}else{b = a - 1;}printf("a=%d,b=%d\n",a,b); }
void func3(int a){int b = 0;switch(a){case 0:b = a;nreak;case 1:b = a;nreak;case 2:b = a;nreak;default:break;}printf("a=%d,b=%d\n",a,b); }
while-do循环结构
void func4(int a){int b = 0;int i = 1;while(i < 10){b = b+a*i;i ++;}printf("a=%d,b=%d\n",a,b); }
do-while循环结构
void func5(int a){int b = 0;int i = 1;do{b = b+a*i;i ++;}while(i < 10)printf("a=%d,b=%d\n",a,b); }
控制流分析内容
关注判定节点固有的复杂性
- 焦点:判定表达式
- 方法:逻辑覆盖测试
关注判定结构与循环结构对执行路径产生的影响
- 焦点:路径
- 方法:独立路径测试
关注循环结构本身的复杂性
- 焦点:循环体
- 方法基于数据的静态分析
逻辑覆盖测试
逻辑覆盖测试基本准则:
对程序代码中所有的逻辑值均需要测试真值和假值的情况
int func6(int a,int b,int c,int x){1if((a>1)&&(b>2))2x= c+1;3if((a==3)&&(x>3))4x= c+1;5printf("a=%d,b=%d,c=%d,x=%d\n",a,b,c,x);6 return x;}
控制流图
代码包含两个简单的判定结构
每个判定结构由两个子条件构成
4个基本逻辑判定条件
T1:a>1
T2:b<2
T3:a==3
T4:x>3图中T表示True,也就是取真分支
F表示False,即取假分支
Lij表示执行pi,pj两个子路径
4条执行路径
L13:p1→p3
L14:p1→p4
L23:p2→p3
L24:p2→p4
语句覆盖测试
语句测试基本准则:
设计测试用例时,需要保证程序中每一条可执行语句至少应执行一次
测试用例设计
语句覆盖是最弱的一种覆盖标准,它主要存在两种弊端
- 关注语句,而非关注判定节点
- 对隐式分支无效
判定覆盖测试
- 判定覆盖也称为分支覆盖
- 设计测试用例时,应保证程序中每个判定节点取得每种可能的结果至少一次
- 判定覆盖相当于对控制流图进行边覆盖
条件覆盖测试
- 设计测试用例时,应保证程序中每个复合判定表达式中,每个简单判定条件的取真和取假情况至少执行一次