1、第 5 章 动态测试技术(2)-白盒测试方法教学内容:1. 掌握白盒测试的基本概念2. 掌握逻辑覆盖、基本路径覆盖白盒测试方法3. 理解其他白盒测试方法(循环测试、数据流测试、变异测试、域测试、Z 路径覆盖)的内容及其对逻辑覆盖测试的补充4. 了解白盒测试方法的选择策略课型:新授课教时:8 课时教学重点:1 白盒测试基本概念2 逻辑覆盖测试3 基本路径测试4 开源白盒测试工具的使用方法1. 白盒测试概述1. 定义:根据程序内部的逻辑结构及相关信息设计测试用例2. 主要的黑盒测试方法有2.1 逻辑覆盖测试2.2 基本路径覆盖测试2.3 循环测试2.4 程序插装2.5 程序变异测试2.6 其他白盒
2、测试 数据流测试 域测试 Z 路径覆盖 符号测试2. 逻辑覆盖测试1. 概述:1.1 考察使用测试数据运行被测程序时对程序逻辑的覆盖程度1.2 希望选择最少的测试用例来满足所需的覆盖标准1.3 常用的覆盖标准 语句覆盖 判定覆盖 条件覆盖 判定条件覆盖 条件组合覆盖 路径覆盖2. 实例2.1 题目要求:对下列子程序进行测试procedure example(y,z:real;var x:real);beginif (y1) and (z=0) then x:=x/y;if (y=2) or (x1) then x:=x+1;end;该子程序接受 x、y、z 的值,并将计算结果 x 的值返回给调
3、用程序。与该子程序对应的流程图如下:该子程序有两个判定:a: (y1) and (z=0) c: (y=2) or (x1) 判定 a 中有两个条件: y1、 z=0判定 c 中有两个条件: y=2 、x12.2 根据程序的执行流程可知: 当判定 a 为“假”时,判定 C 中的 x 就是输入的 x 值,此时,相对于输入的 x 而言,判定 C 中的“x1”就是“x1” 当判定 a 为“真”时,判定 C 中的 x 是经过 x=x/y 计算后的值,此时,相对于输入的x 而言,判定 C 中的“x1”实际是 “x/y1”,即“xy”2.3 该子程序有四条可执行路径:路径 1 sabcde , 其执行条件
4、(L1)是 a 为“t”且 c 为 “t” L1= (y1) and (z=0) and (y=2) or (x/y1)= (y1) and (z=0) and (y=2) or(y1) and (z=0) and (x y )= (y=2) and (z=0) or(y1) and (z=0) and (x y )路径 2 sace ,其执行条件(L2)是a 为“f”且 c 为 “f”L2 = not(y1) and (z=0) and not(y=2) or (x1)= not (y1) or not (z=0) and not (y=2) and not (x1) = not (y1)
5、and not (y=2) and not (x1)or not (z=0) and not (y=2) and not (x1)=(y1) and (x 1)or (z 0) and (y 2) and (x 1)路径 3 sacde ,其执行条件(L3)是a 为“f”且 c 为 “t”L3 = not (y1) and (z=0) and(y=2) or (x1)= not (y1) or not (z=0) and (y=2) or (x1)= not (y1) and (y=2) or not (y1) and (x1) ornot (z=0) and (y=2) ornot (z=0
6、) and (x1)= (y 1) and (x1) or(z 0) and (y=2) or (z 0) and (x1)路径 4 sabce ,其执行条件(L4)是a 为“t”且 c 为 “f”L4 = (y1) and (z=0) andnot (y=2) or (x/y1)= (y1) and (z=0) and not (y=2) and not (x y)=(y1) and (z=0) and (y 2) and (x y)3. 语句覆盖:3.1 语句覆盖是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每个可执行语句都至少执行一次3.2 执行条件 L1(t,t)(y=2)
7、 and (z=0) or (y1) and (z=0) and (x y )测试数据 预期结果x=4,y=2,z=0 x=34. 判定覆盖4.1 判定覆盖(也称分支覆盖)是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每个判定的所有可能结果都至少执行一次(即判定的每个分支至少经过一次)4.2 执行条件 L3(f,t)和 L4 (t,f)或者执行条件 L1(t,t)和 L2(f,f) 选择执行条件 L3(f,t)和 L4 (t,f) L3 =(y 1) and (x1) or (z 0) and (y=2) or (z 0) and (x1) L4 =(y1) and (z=0) a
8、nd (y 2) and (x y)测试数据 预期结果 路径 a cx=1,y=2,z=1 x=2 sacde f tx=3,y=3,z=0 x=1 sabce t f5. 条件覆盖5.1 条件覆盖是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每个判定中的每个条件的所有可能结果都至少出现一次测试数据 预期结果 路径 覆盖的条件x=1,y=2,z=0 x=1.5 sabcde y1, z=0, y=2,x yx=2,y=1,z=1 x=3 sacde y 1,z 0, y 2 ,x16. 判定/条件覆盖6.1 判定/条件覆盖是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每
9、个判定的所有可能结果都至少执行一次,并且,每个判定中的每个条件的所有可能结果都至少出现一次6.2 执行条件 L1(t,t)和 L2(f,f)测试数据 预期结果 路径 a c 覆盖的条件x=4,y=2,z=0 x=3 sabcde t t y1, z=0, y=2,x yx=1,y=1,z=1 x=1 sace f f y 1,z 0,y 2 ,x 17. 条件组合覆盖7.1 条件组合覆盖是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每个判定中条件结果的所有可能组合都至少出现一次7.2 判定 a 中条件结果的所有可能组合:y1, z=0 y1, z 0y 1 , z=0 y 1 ,
10、z 0 7.3 判定 c 中条件结果的所有可能组合: y=2, x1 y=2, x 1 ; y 2 , x1 y 2 , x 1测试数据 预期结果 路径 a c 覆盖的条件x=4,y=2,z=0 x=3 sabcde t t y1,z=0 y=2,xyx=1,y=2,z=1 x=2 sacde f t y1,z 0y=2,x 1x=2,y=1,z=0 x=3 sacde f t y 1,z=0y 2,x1x=1,y=1,z=1 x=1 sace f f y 1,z 0 y 2,x18. 路径覆盖8.1 路径覆盖是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每条可能执行到的路径都至少
11、经过一次(如果程序中包含环路,则要求每条环路至少经过一次)测试数据 预期结果 路径 a cx=4,y=2,z=0 x=3 sabcde t tx=3,y=3,z=0 x=1 sabce t fx=2,y=1,z=0 x=3 sacde f tx=1,y=1,z=1 x=1 sace f f9. 逻辑覆盖测试需注意的问题9.1 在逻辑覆盖测试时,我们强调“运行这些测试用例时”覆盖了被测程序的哪些判定、条件或路径9.2 这表明在使用这些测试用例运行被测程序时,能执行到相应的判定、条件或路径9.3 当运行测试数据 y = 12 时,其执行路径是 sacg,覆盖了判定 a 为真的情况(即覆盖 y 10
12、) 。由于其执行路径未经过判定 b,所以这个测试数据并不覆盖判定 b为真的情况(即不覆盖条件 y 5)9.4 而运行测试数据 y = 8 时,其执行路径是 sabdg,所以该测试数据覆盖了判定 a 为假的情况(即覆盖 y 10)和判定 b 为真的情况(即覆盖 y 5)10. 逻辑表达式错误敏感的测试10.1 逻辑覆盖测试依赖于程序中的逻辑条件,这些逻辑条件由逻辑表达式组成10.2 对于一个含有 n 个逻辑变量或关系表达式的逻辑表达式,通常需要 2n 个测试用例来覆盖其所有可能的条件组合10.3 当 n 较大时,我们可以选择对发现逻辑表达式错误比较敏感的组合条件进行测试,以较少的测试用例来发现逻
13、辑表达式中的绝大多数错误10.4 Tai 提出的分支与关系运算符(branch and relational operator,BRO)测试技术,能用较少的测试用例发现条件中分支与关系运算符的大多数错误10.5 采用 BRO 方法的前提条件:条件中的每个布尔变量和关系运算符至多出现一次,并且无公共变量10.6 BRO 方法引入条件约束的概念,含有 n 个简单条件 Ci 的复合条件 C 的约束 D 表示为(D 1,D 2,D n) , Di (0i n)表示在 Ci 的结果(outcome)上的约束,它一般是某种符号10.7 对逻辑变量,约束为 t 或 f (真、假) ;对关系表达式,约束为、=
14、10.8 符合条件 C 的一次执行覆盖条件约束 D 是指,C 中出现的每个简单条件 Ci 在这次执行中都满足 D 中对应的约束 Di10.9 下面分三种情况讨论: 若条件为 C:B 1 for(i=2;i=3;i+)if(ai ax) x=i; x=1; for(i=1;i=3;i+)if(ai ax) x=i; x=1; for(i=1;i=3;i+)if( i ax) x=i; 变异体 变异体x=1; for(i=2;i=3;i+)if(ai=ax) x=1; for(i=2;i=3;i+)if( ax ax) 增加新的测试用例 DT4=2,2,1,预期结果 x=1,可杀死变异体 (其结果
15、 x=2) 变异体是等价变异体7. 其他白盒测试1. 数据流测试1.1 根据程序中变量的定义(赋值)和引用位置来选择测试用例1.2 定义-引用链 DU 变量 x 的定义-引用链记为 x,s,s 其中 s, s为语句标号,变量 x 在 s 中定义(赋值) ,在 s中被引用,且 s 处定义的x 在 s处仍有效1.3 数据流测试就是设计测试用例使得每个 DU 链至少被覆盖一次1.4 数据流测试适用于嵌套 IF 和多重循环程序的测试2. 域测试2.1 一种基于程序结构的测试方法2.2 程序错误可分为 域错误:一条执行路径对应输入域的一类,对于一个特定的输入可能执行一条错误的路径,这种错误称为域错误,或
16、路径错误 计算性错误:对于一个特定的输入执行一条正确的路径,但由于赋值语句的错误导致输出结果不正确 丢失路径错误:由于程序中某处少了一个判定谓词而引起的错误2.3 域测试指主要针对域错误的一种测试2.4 域指被测程序的输入空间2.5 输入空间可分为不同的子空间,每个子空间对应一种不同的计算2.6 子空间的划分由程序中分支语句的谓词决定的2.7 域测试就是在分析输入域的基础上,选择适当的测试点进行测试2.8 域测试的缺点 对程序提出的限制过多 当程序存在很多路径时,所需的测试点也很多变异体测试结果原始 杀死的变异体DT1 3 3 3 3 1 DT2 2 2 3 2 1 和DT3 1 1 1 1 1 无原始程序测试用例集a1 a2 a3DT1 2 3 4DT2 2 3 2DT3 4 2 3测试用例集的充分性测试用例集 测试充分性DT1 25%DT2 50%DT3 0%3. Z 路径覆盖1. 对于一个比较复杂的程序,特别是包含循环的程序,测试不可能覆盖程序所有的路径2. Z 路径覆盖指对程序中的循环只考虑循环 0 次和循环 1 次两种情况的测试4. 符号测试1. 允许程序的输入可包含符号值