文章目录

  • 白盒测试的基本原理
    • 关注对象
    • 优势
    • 不足和弊端
    • 白盒测试的经济学问题
  • 控制流分析技术
    • 控制流分析技术要解决的问题
    • 线性结构
    • 条件判定结构
    • 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

语句覆盖测试

语句测试基本准则:

设计测试用例时,需要保证程序中每一条可执行语句至少应执行一次

测试用例设计



语句覆盖是最弱的一种覆盖标准,它主要存在两种弊端

  • 关注语句,而非关注判定节点
  • 对隐式分支无效

判定覆盖测试

  • 判定覆盖也称为分支覆盖
  • 设计测试用例时,应保证程序中每个判定节点取得每种可能的结果至少一次
  • 判定覆盖相当于对控制流图进行边覆盖

条件覆盖测试

  • 设计测试用例时,应保证程序中每个复合判定表达式中,每个简单判定条件的取真和取假情况至少执行一次