Download - 黑盒测试 等价类划分法 边界值法 判定表法 因果图法 正交阵列法
11/37/37
回顾
黑盒测试 等价类划分法 边界值法 判定表法 因果图法 正交阵列法
22/37/37
功能性测试方法总结
精细程度
方法评价
工作量
33/37/37
测试用例数
精细程度
边界值 等价类 决策表
低
高
各种测试方法的测试用例趋势线
精细程度
44/37/37
设计测试用例的工作量
精细程度
边界值 等价类 决策表低
高
各种测试方法的测试用例设计工作量
工作量
55/37/37
功能测试方法选择 边界值分析
基于定义域 , 不识别数据或逻辑关系 很容易自动化实现 设计工作量小 生成的测试用例数比较多 测试用例执行时间长
等价类技术 考虑数据依赖关系 标识等价类时需要更多的判断和技巧 等价类标识出以后的处理也是机械的 设计工作量和测试用例数属中等
决策表技术 又要考虑数据的逻辑依赖关系 所得测试用例可以是完备的 测试数量在一定意义上讲是最少的 需要通过多次迭代 设计工作量很大
66/37/37
保险金计算程序 保险金 =500 × 年龄系数 – 安全驾驶折扣
• 安全驾驶折扣是投保人驾驶执照上当前点数的函数• 年龄系数是投保人年龄的函数• 若点数低于等于与年龄有关的点数门限,则给予安全驾驶折扣
程序输入 : 年龄 , 点数 驾驶人年龄范围为 16-100 岁 点数范围为 0-12 输出:保险金
综合案例
77/37/37
年龄范围 年龄系数 门限点数 安全驾驶折扣
16<= 年龄 <25 2.8 1 50
25 < = 年龄 < 35 1.8 3 50
35 < = 年龄 < 45 1.0 5 100
45 < = 年龄 < 60 0.8 7 150
60 < = 年龄 <= 100 1.5 5 200
年龄系数和安全驾驶折扣计算表
综合案例
88/37/37
变量 最小值 略大于最小值
正常值 略小于最大值
最大值
年龄 16 17 54 99 100
点数 0 1 6 11 12
输入变量年龄和点数的边界值条件 1
99/37/37
变量 最小值 略大于最小值 正常值 略小于最大值 最大值
年龄 16 17 20 24 -
年龄 25 26 30 34 -
年龄 35 36 40 44 -
年龄 45 46 53 59 -
年龄 60 61 75 99 100
点数 0 - - - 1
点数 2 - - - 3
点数 4 - - - 5
点数 6 - - - 7
点数 8 9 10 11 12
点数边界值共有 13个,年龄边界值共有 21个笛卡儿乘积(最坏情况边界值测试用例)共有 273 个元素,存在严重冗余
输入变量年龄和点数的边界值条件 2
1010/37/37
等价类划分方法年龄等价类集合
A1={16<= 年龄 <25} A2={25<= 年龄 <35} A3={35<= 年龄 <45} A4={45<= 年龄 <60} A5={60<= 年龄 <=100}
点数等价类集合 P1={ 点数 =0,1} P2={ 点数 =2,3} P3={ 点数 =4,5} P4={ 点数 =6,7} P5={ 点数 =8,9,10,11,12}
1111/37/37
用例 ID 年龄 点数
1 18 0
2 18 2
3 18 4
4 18 6
5 18 10
6 30 0
7 30 2
8 30 4
9 30 6
10 30 10
11 40 0
12 40 2
13 40 4
14 40 6
用例 ID 年龄 点数
15 40 10
16 50 0
17 50 2
18 50 4
19 50 6
20 50 10
21 80 0
22 80 2
23 80 4
24 80 6
25 80 10
等价类测试明显可以缓解冗余,但仍然有改进的余地
保险金程序的强等价类测试用例
1212/37/37
年龄 16-25 16-25 25-35 25-35 35-45 35-45
点数 0-1 2-12 0-3 4-12 0-5 6-12
年龄系数 2.8 2.8 1.8 1.8 1 1
安全驾驶折扣 50 0 50 0 100 0
年龄 45-60 45-60 60-100 60-100
点数 0-7 8-12 0-5 6-12
年龄系数 0.8 0.8 1.5 1.5
安全驾驶折扣 150 0 200 0
决策表方法
1313/37/37
用例 ID 年龄 点数1 18 0
2 18 2
3 30 0
4 30 4
5 40 5
6 40 6
7 50 7
8 50 8
9 80 5
10 80 6
该方案也存在一些问题 没有考虑边界的问题 没有考虑 16 岁以下和 10
0 岁以上的年龄 没有考虑点数大于 12 的情况
可将三种方法结合起来考虑以得到更好的测试方案
保险金程序的决策表测试用例
1414/37/37
测试方法的选择
通常,在确定测试方法时,应遵循以下原则: 根据程序的重要性和一旦发生故障将造成的损失来确定测试等级和测试重点。
认真选择测试策略,以便能尽可能少的使用测试用例,发现尽可能多的程序错误。因为一次完整的软件测试过后,如果程序中遗留的错误过多并且严重,则表明该次测试是不足的,而测试不足则意味着让用户承担隐藏错误带来的危险,但测试过度又会带来资源的浪费。因此测试需要找到一个平衡点。
1515/37/37
白盒测试基本概念1
逻辑覆盖测试2
基本路径测试3
循环测试4
白盒测试
第二章 测试设计技术
1616/37/37
白盒测试的基本概念什么是白盒测试
把程序看成装在一个透明的白盒子里,程序的结构和处理过程完全可见,按照程序的内部逻辑测试程序,以检查程序中的每条通路是否都能按照预先要求正确工作。
1717/37/37
白盒测试的常用方法白盒测试的常用方法
逻辑覆盖 基本路径测试
循环测试 ……
1818/37/37
逻辑覆盖是以程序的内部逻辑结构为基础的测试用例设计技术,属于白盒测试。它要求测试人员十分清楚程序的逻辑结构,考虑的是测试用例对程序内部逻辑覆盖的程度。
逻辑覆盖
语句覆盖判定覆盖条件覆盖判定/条件覆盖条件组合覆盖路径覆盖
1919/37/37
逻辑覆盖(续)
根据覆盖目标的不同,逻辑覆盖又可分为语句覆盖、判定覆盖、条件覆盖、判定 / 条件覆盖、组合覆盖和路径覆盖。
语句覆盖:选择足够多的测试用例,使得程序中的每个可执行语句至少执行一次。
判定覆盖:通过执行足够的测试用例,使得程序中的每个判定至少都获得一次“真”值和“假”值, 也就是使程序中的每个取“真”分支和取“假”分支至少均经历一次,也称为“分支覆盖”。
条件覆盖:设计足够多的测试用例,使得程序中每个判定包含的每个条件的可能取值(真 /假)都至少满足一次。
2020/37/37
逻辑覆盖(续)
判定 / 条件覆盖:设计足够多的测试用例,使得程序中每个判定包含的每个条件的所有情况(真 /假)至少出现一次,并且每个判定本身的判定结果(真 /假)也至少出现一次。
——满足判定 / 条件覆盖的测试用例一定同时满足判定覆盖和条件覆盖。
条件组合覆盖:通过执行足够的测试用例,使得程序中每个判定的所有可能的条件取值组合都至少出现一次。
——满足组合覆盖的测试用例一定满足判定覆盖、条件覆盖和判定 / 条件覆盖。
路径覆盖:设计足够多的测试用例,要求覆盖程序中所有可能的路径。
2121/37/37
逻辑覆盖(续)
void DoWork (int x,int y,int z){
int k=0, j=0;
if ( (x>3)&&(z<10) ){
k=x*y-1;
j=sqrt(k);
} // 语句块 1
if ( (x==4)||(y>5) ){
j=x*y+10;
} // 语句块 2
j=j%3; // 语句块 3
}
x>3 && z<10
执行语句块 1
执行语句块 2
x==4 || y>5
F
F
T
T
a
b
d
c
e
入口
执行语句块 3
2222/37/37
1 语句覆盖1 语句覆盖
设计足够的测试用例,使得程序中的每个语句至少执行一次。
2323/37/37
x y z
用例 1 4 5 5
用例 2
?第一个判断中的逻辑运算符“&&” 若错写成了“ ||”, 能否测试出来?
路径:P1 ( TT ) P2 ( FF ) P3 ( FT ) P4 ( TF )
程序执行的路径是: abd
x>3 && z<10
执行语句块 1
执行语句块 2
x==4 || y>5
F
F
T
T
a
b
d
c
e
入口
执行语句块 3
1 语句覆盖
2424/37/37
2 判定覆盖2 判定覆盖
设计足够的测试用例,使得在语句覆盖的基础上 ,程序中每个判定的取“真”分支和取“假”分支至少都执行一次,判定覆盖又称分支覆盖。
2525/37/37
? 判定覆盖比语句覆盖强,但是仍不能保证判断条件的正确性。例如:第二个判断条件中的 y > 5 若错写成了 y< 5,能否测试出来?
x y z
用例 1 4 5 5
用例 2 2 5 5
程序执行的路径是: abd , ace
x>3 && z<10
执行语句块 1
执行语句块 2
x==4 || y>5
F
F
T
T
a
b
d
c
e
入口
执行语句块 3
2 判定覆盖 ( 分支覆盖 )
2626/37/37
3 条件覆盖3 条件覆盖
设计足够的测试用例,在语句覆盖的基础上使得程序判定中的每个条件能获得各种可能的结果。
2727/37/37
?是否满足判定覆
盖 ?
x y z
用例 1 2 6 5
用例 2 4 5 15
程序执行的路径是: ace
x>3 && z<10
执行语句块 1
执行语句块 2
x==4 || y>5
F
F
T
T
a
b
d
c
e
入口
执行语句块 3
3 条件覆盖
2828/37/37
4 判定/条件覆盖4 判定/条件覆盖
设计足够的测试用例,使得判定中的每个条件都取到各种可能的值,而且每个判定表达式也都取到各种可能的结果。
2929/37/37
判定/条件覆盖仍有缺陷。从表面上看,它测试了所有条件的所有可能结果,但事实上并不是这样。因为某些条件掩盖了另一些条件。例如,在逻辑表达式中,如果“与”表达式中某一条件为“假”,则整个表达式的值为“假”,这个表达式中另外的几个条件就不起作用了。同样地,如果在“或”表达式中,某一条件为“真”,则整个表达式的值为“真”,其它条件也就不起作用了。因此,采用判定/条件覆盖时,逻辑表达式中的错误不一定能测试出来。
x y z
用例 1 4 6 5
用例 2 2 5 15
程序执行的路径是: abd , ace
x>3 && z<10
执行语句块 1
执行语句块 2
x==4 || y>5
F
F
T
T
a
b
d
c
e
入口
执行语句块 3
4 判定 / 条件覆盖
3030/37/37
5 条件组合覆盖5 条件组合覆盖
设计足够的测试用例,使得每个判定中的条件的各种可能组合都至少出现一次。
3131/37/37
可能的条件组合:1、 x>3, z<10 记做 T1 T22、 x>3, z>=10 记做 T1 -T23、 x<=3, z<10 记做 -T1 T24、 x<=3, z>=10 记做 -T1 -T
25、 x= =4, y>5 记做 T3 T46、 x= =4, y<=5 记做 T3 -T47、 x!=4, y>5 记做 -T3 T4
8、 x!=4, y<=5 记做 -T3 -T4
相应的输入数据:x=4 、 y=6 、 z=5
满足( 1 )和( 5 )x=4 、 y=5 、 z=15
满足( 2 )和( 6 )x=2 、 y=6 、 z=5
满足( 3 )和( 7 )x=2 、 y=5 、 z=15
满足( 4 )和( 8 )
显然,满足条件组合覆盖的测试数据,也一定满足判定覆盖、条件覆盖和判定/条件覆盖标准。
5 条件组合覆盖
3232/37/37
TEST CASES :x=4 、 y=6 、 z=5x=4 、 y=5 、 z=15x=2 、 y=6 、 z=5x=2 、 y=5 、 z=15
? 请写出各测试用例的执行路径。然后考察是否覆盖了 (abe) 路径。
x>3 && z<10
执行语句块 1
执行语句块 2
x==4 || y>5
F
F
T
T
a
b
d
c
e
入口
执行语句块 3
5 条件组合覆盖
3333/37/37
条件组合覆盖
判断 / 条件覆盖
判断覆盖 条件覆盖
语句覆盖
3434/37/37
每条可能的路径都至少执行一次。
Test cases: 覆盖条件 ① x=4 、 y=6 、 z=5 T1 T2 T3 T4
② x=4 、 y=5 、 z=15 T1 -T2 T3 -
T4 ③ x=2 、 y=5 、 z=15 -T1 -T2 -T3 -
T4 ④ x=5 、 y=5 、 z=5 T1 T2 -T3 -
T4
x>3 && z<10
执行语句块 1
执行语句块 2
x==4 || y>5
F
F
T
T
a
b
d
c
e
入口
执行语句块 3
程序执行的路径是: abd 、 acd、 ace 、 abe
6 路径覆盖
3535/37/37
练习
在下面所列举的逻辑测试覆盖中,测试覆盖最强的是 ,最弱的 是 。
A. 条件覆盖 B. 条件组合覆盖 C. 语句覆盖 D. 条件 / 判定覆盖
补充
B C
一个多用户的应用系统通常有用户管理功能,允许增加新的用户。用户信息中的用户名假设规定必须是以字母开头的、不超过 8 个字符的字母数字串,那么,下面哪一组值均属于用户名的有效等价类? ( ) A. L, linyifen, A1111111, glenford1 B. a1111111, L1, Lin-Yie, Lin-feng C. linyifen, A1111111, glenford1, 123B123 D. linyifen, A1111111, glenford1, G.Myers E. linyifen, A1111111, glenford1, Myers
E
3636/37/37
请阅读程序:(1) 现在需要使用逻辑覆盖法测试,请问使
用下面哪一组关于 (a, b,c) 的输入值,组合就可以达到条件覆盖? ( ) A. (a, b,c) = (1,1,1) 、 (-1,1,1) B. (a, b,c) = (1,1,1) 、 (-1,-1,-1) C. (a, b,c) = (1,1,-1) 、 (1,1,1) D. (a, b,c) = (1,1,-1) 、 (-1,1,1)
练习补充
int func(int a, int b,int c)
{ int k = 1;
if ((a>0)||(b<0)||(a+c>0))
k = k+a;
else k = k+b;
if (c>0) k = k+c;
return k ;
}
B
(2) 如果测试时采用这组输入值组合 : (a, b,c) = (1,1,-1) 、 (1,1,1) 、 (-1,1,1) 、 (0,1,1) ,那么可以实现哪种覆盖? ( )
A. 条件覆盖 B. 分支覆盖 C. 路径覆盖 D. 条件组合覆盖 B
3737/37/37
习题
X>8 AND Y>5
X>0 OR Y>0
引用语句 1 引用语句 2
N Y
N Y X>16 OR Y>10
引用语句 3
N Y
为以下流程图所示的程序段设计一组测试用例,要求分别满足语句覆盖、判定覆盖、条件覆盖、判定 / 条件覆盖、组合覆盖和路径覆盖。