目录
2.黑盒测试
包含:等价类划分法、边界值法、决策表法、因果图法、场景图法、功能图法、正交试验法等。
2.1等价类划分法
把程序的输入域划分成若干部分然后从每个部分中选取少数代表性数据当做测试用例。每一类代表性的数据等价于这一类中的其他值。
划分等价类原则:
1)按区间划分
2)按数值划分
3)按数值集合划分
4)按限制条件或规则划分
等价类划分分两种情况:
1)有效等价类
是指对于程序的规格说明是合理的、有意的输入数据构成的集合。
2)无效等价类
与有效等价类定义相反。
等价类测试用例:
设计用例,尽可能多的覆盖等价类。
步骤:
- 识别所有的有效等价类和无效等价类,并规定一个唯一的编号
- 建等价类表
- 设计等价类划分测试用例
案例:
一个程序读入3个整数,把这3个数值看做一个三角形的3条边的长度值。这个程序要打印出信息,说明这个三角形是不等边、等腰还是等边的。
分析:构成三角形,则:A>0、B>0、C>0,且A+B>C、A+C>B、B+C>A
等腰:A=B或A=C或B=C
等边:A=B、B=C、A=C
1)2)三角形等价类表
输入条件 | 有效等价类编号 | 有效等价类 | 无效等价类编号 | 无效等价类 |
是否是三角形的三条边 | 1) 2) 3) 4) 5) 6) | A>0 B>0 C>0 A+B>C A+C>B B+C>A | 7) 8) 9) 10) 11) 12) | A<=0 B<=0 C<=0 A+B<=C A+C<=B B+C<=A |
是否是等腰三角形 | 13) 14) 15) | A=B B=C A=C | 16) | (A!=B)and(B!=C) and(A!=C) |
是否是等边三角形 | 17) | (A=B)and(B=C) and(A=C) | 18) 19) 20) | A!=B B!=C A!=C |
3)三角形等价类划分测试用例
序号 | 输入【A,B,C】 | 覆盖等价类 | 输出 |
1 | 3,4,5 | 1)-2)-3)-4)-5)-6) | 一般三角形 |
2 | 0,1,2 | 7) | 不能构成三角形 |
3 | 1,0,3 | 8) | |
4 | 1,2,0 | 9) | |
5 | 1,2,3 | 10) | |
6 | 1,3,2 | 11) | |
7 | 3,1,2 | 12) | |
8 | 3,3,4 | 1)-2)-3)-4)-5)-6)-13) | 非等边三角形 |
9 | 4,3,3 | 1)-2)-3)-4)-5)-6)-14) | |
10 | 3,4,3 | 1)-2)-3)-4)-5)-6)-15) | |
11 | 3,4,5 | 1)-2)-3)-4)-5)-6)-16) | 非等腰三角形 |
12 | 3,3,3 | 1)-2)-3)-4)-5)-6)-17) | 等边三角形 |
13 | 3,4,4 | 1)-2)-3)-4)-5)-6)-13)-18) | 非等边三角形 |
14 | 3,4,3 | 1)-2)-3)-4)-5)-6)-14)-19) | |
15 | 3,3,4 | 1)-2)-3)-4)-5)-6)-15)-20) |
2.2边界值法
边界值分析是一种补充等价类划分的测试技术,他不是选择等价类的任意元素,而是选择等价类边界的测试用例。
用例设计原则:
- 若输入规定了值的范围,则取刚达到这个范围的边界的值,以及刚刚超越这个范围的边界的值作为测试输入数据。
- 若确定了输入值的个数,则用最大个数、最小个数、最大个数多1、最小个数少1的一组数据作为测试数据。
- 若规定输入域和输出域是有序集合,则选取集合的第一个元素和最后一个元素作为测试用例。
- 若使用程序内部数据结构,则选取该内部数据结构的边界值作为测试用例。
标准边界值分析:
min min+1 nom max- max
健壮边界值分析:
min-1 (min min+1 nom max-1 max) max+1
步骤:
- 对每个输入或外部条件进行等价类划分,形成等价类表,并确定唯一编号。
- 找出每个有效等价类对应的边界值(一般使用健壮边界值)。
- 涉及测试用例
案例:加法器程序计算两个1~100之间整数的和。
对于加法器程序,根据输入要求可将输入空间划分为三个等价类,即1个有效等价类(1~100之间),两个无效等价类(<1,>100)。但这种等价类划分不是很完善,我们只考虑了输入数据的取值范围,而没有考虑输入数据的类型,我们认为输入应为整数,但用户输入什么都有可能。
为此,我们可综合考虑输入数据的取值范围和类型划分等价类,其结果如下表所示。
1)2)等价类表
编号 | 输入条件 | 所属类别 | 编号 | 输入条件 | 所属类别 |
1 | 1~100之间整数 | 有效等价类 | 5 | 非数值(字母) | 无效等价类 |
2 | <1整数 | 无效等价类 | 6 | 非数值(特殊字符) | 无效等价类 |
3 | >100整数 | 无效等价类 | 7 | 非数值(空格) | 无效等价类 |
4 | 小数 | 无效等价类 | 8 | 非数值(空白) | 无效等价类 |
3)用例设计
0、1、2、50、99、100、101、小数、字母、空格、空白
测试用例 | 输入数据 | 预期输出 | |
加数1 | 加数2 | 和 | |
1 | 1 | 50 | 51 |
2 | 2 | 50 | 52 |
3 | 99 | 50 | 149 |
4 | 100 | 50 | 150 |
5 | 50 | 1 | 51 |
6 | 50 | 2 | 52 |
7 | 50 | 99 | 149 |
8 | 50 | 100 | 150 |
9 | 0 | 50 | 提示“请输入1~100间的整数” |
10 | 50 | 0 | 提示“请输入1~100间的整数” |
11 | 101 | 50 | 提示“请输入1~100间的整数” |
12 | 50 | 101 | 提示“请输入1~100间的整数” |
13 | 0.2 | 50 | 提示“请输入1~100间的整数” |
14 | 50 | 0.2 | 提示“请输入1~100间的整数” |
15 | A | 50 | 提示“请输入1~100间的整数” |
16 | 50 | A | 提示“请输入1~100间的整数” |
17 | @ | 50 | 提示“请输入1~100间的整数” |
18 | 50 | @ | 提示“请输入1~100间的整数” |
19 | 空格 | 50 | 提示“请输入1~100间的整数” |
20 | 50 | 空格 | 提示“请输入1~100间的整数” |
21 | 50 | 提示“请输入1~100间的整数” | |
22 | 50 | 提示“请输入1~100间的整数” |
2.3决策表法(判定表)
4个部分组成:
条件桩:列出问题的所有条件,通常认为列出的条件的先后次序无关紧要。
条件项:针对条件桩给出的条件,列出所有可能的取值。
动作桩:列出了问题规定的可能采取的操作,这些操作的排列顺序没有约束。
动作项:与条件项紧密相连,列出在条件项的各组取值情况下应该采取的动作。
步骤:
确定规则的个数。假如有n个条件,每个条件有2个取值(0,1),故有2n种规则;
1)列出所有条件桩和动作桩;
2)填入条件项和动作项;
3)简化,合并相似规则(相同动作)。若表中有两条或多条规则具有相同的动作,并且 其条件项之间存在着极为相似的关系,我们便可设法将其合并。
判定表设计测试用例的适用范围:
①规格说明以判定表形式给出,或是很容易转换成判定表。
②条件的排列顺序不会也不应影响执行哪些操作。
③规则的排列顺序不会也不应影响执行哪些操作。
④每当某一规则的条件已经满足,并确定要执行的操作后,不必检验别的规则。
⑤如果某一规则得到满足要执行多个操作,这些操作的执行顺序无关紧要。
案例1:
对功率大于50马力的机器或(维修纪录不全且已运行10年以上的机器),应给予优先维修处理。
原始判定表如下:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ||
条件桩 | 功率大于50马力吗 | Y | Y | Y | Y | N | N | N | N |
维修记录不全? | Y | Y | N | N | Y | Y | N | N | |
运行超过10年吗? | Y | N | Y | N | Y | N | Y | N | |
动作桩 | 进行优先维修 | √ | √ | √ | √ | √ | |||
做其他处理 | √ | √ | √ |
简化判定表如下:
1 | 2 | 3 | 4 | ||
条件桩 | 功率大于50马力吗 | Y | N | N | N |
维修记录不全? | --- | Y | Y | N | |
运行超过10年吗? | --- | Y | N | --- | |
动作桩 | 进行优先维修 | √ | √ | ||
做其他处理 | √ | √ |
用例设计:
用例序号 | 输入操作 | 预期输出 |
1 | 无论维修记录是否齐全,是否运行超过10年,只要功率大于50马力的情况 | 进行优先维修 |
2 | 功率没有大于50马力,维修记录不全且已运行超过10年的情况 | 进行优先维修 |
3 | 当功率没有大于50马力和维修记录不全时,运行没有超过10年的情况 | 做其他处理 |
4 | 无论运行是否超过10年,当功率不大于50马力和维修记录不全的情况 | 做其他处理 |
案例2:
某图书发行公司采用下列政策优惠用户。书店订购20册以上优惠25%,否则不优惠;图书馆和个人订购6册以下则不优惠;6-19册优惠5%,20-49册则优惠10%,50册以上则优惠15%。请用判定表法设计有多少种优惠方案。
1 | 2 | 3 | 4 | 5 | 6 | |
是书店订购 | 1 | 1 | 0 | 0 | 0 | 0 |
是图书馆和个人订购 | 0 | 0 | 1 | 1 | 1 | 1 |
小于6册 | 0 | - | 1 | 0 | 0 | 0 |
6~19册 | 0 | - | 0 | 1 | 0 | 0 |
20~49册 | - | 0 | 0 | 0 | 1 | 0 |
大于50册 | - | 0 | 0 | 0 | 0 | 1 |
大于20册 | 1 | 0 | 0 | 0 | 1 | 1 |
5% | v | |||||
10% | v | |||||
15% | v | |||||
25% | v | |||||
不优惠 | v | v |
2.4因果图法
等价类划分法和边界值分析法着重考虑输入条件,不考虑输入条件的各种组合和之间的相互制约关系。而因果图法:用一种适合描述对于多种条件的组合,相应产生多个动作的形式来设计测试用例。
步骤:
- 首先从程序规格说明书中找到因(输入条件)和果(输出结果或者程序状态的改变)
- 然后通过因果图转换成判定表
- 最后为判定中的每一列设计一个测试用例
2.4.1因果图符号
通常在因果图中用Ci表示原因,用Ei表示结果,各节点表示状态,可取值0或1。0表示某状态不出现,1表示某状态出现。如图:
恒等:若C1为1,则E1也为1,否则E1为0。
非: 若C1是1,则E1为0,否则E1为1。
或: 若C1或C2或C3都是1,则E1为1;若三者都不为1,则E1为0。
与: 若C1和C2都是1,则E1为1;否则若有其中有个不为1,则E1为0。
E约束(异):a、b最多有一个可能为1,不能同时为1。
I约束(或):a、b、c中至少有一个必须为1,不能同时为0。
O约束(唯一):a和b必须有一个且仅有一个为1。
R约束(异):a是1时,b必须为1,即a是1时,b不能为0。
M约束(异):对暑促条件的约束,若结果a为1,则结果b必须为0。
案例:
某软件规格说明书包含这样的要求:第一列字符必须是A或B,第二列字符必须是一个数字,在此情况下进行文件的修改,但如果第一列字符不正确,则给出信息L;如果第二列字符不是数字,则给出信息M。
解答:
1) 根据题意,原因和结果如下:
原因:
1——第一列字符是A;
2——第一列字符是B;
3——第二列字符是一数字。
结果:
21——修改文件;
22 ——给出信息L;
23——给出信息M。
2)11为中间节点;考虑到原因1和原因2不可能同时为1,因此在因果图上施加E约束,如图所示。
3)通过因果图转成判定表
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ||
原因(条件) | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
2 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | |
3 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | |
11 | 1 | 1 | 1 | 1 | 0 | 0 | |||
动作(结果) | 22 | 0 | 0 | 0 | 0 | 1 | 1 | ||
21 | 1 | 0 | 1 | 0 | 0 | 0 | |||
23 | 0 | 1 | 0 | 1 | 0 | 1 |
4)设计测试用例
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ||
原因(条件) | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
2 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | |
3 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | |
11 | 1 | 1 | 1 | 1 | 0 | 0 | |||
动作(结果) | 22 | 0 | 0 | 0 | 0 | 1 | 1 | ||
21 | 1 | 0 | 1 | 0 | 0 | 0 | |||
23 | 0 | 1 | 0 | 1 | 0 | 1 | |||
测试用例 | A6 | Aa | B9 | BP | C5 | HY | |||
A0 | A@ | B1 | B* | H4 | E% | ||||
预期结果 | 修改文件 | 给出信息M | 修改文件 | 给出信息M | 给出信息L | 给出信息L和信息M |
2.5场景图法
场景:由一系列相关活动组成,且场景中的活动还能由一系列场景组成。
场景法一般包含基本流和备用流,从一个流程开始,通过描述经过的路径来确定的过程,经过遍历所有的基本流和备用流来完成整个场景。通过运用场景来对系统的功能点或业务流程进行描述,从而提高测试效果。
在图中,有一个基本流和四个备选流。
每个经过用例的可能路径,可以确定不同的用例场景。从基本流开始,再将基本流和备选流结合起来,可以确定以下用例场景:
场景 1 基本流
场景 2 基本流 备选流 1
场景 3 基本流 备选流 1 备选流 2
场景 4 基本流 备选流 3
场景 5 基本流 备选流 3 备选流 1
场景 6 基本流 备选流 3 备选流 1 备选流 2
场景 7 基本流 备选流 4
场景 8 基本流 备选流 3 备选流 4
从上面的实例我们就可以了解场景是如何利用基本流和备用流来确定的。
基本流:采用直黑线表示,是经过用例的最简单的路径(无任何差错,程序从开始直接执行到结束)
备选流:采用不同颜色表示,一个备选流可能从基本流开始,在某个特定条件下执行,然后重新加入基本流中,也可以起源于另一个备选流,或终止用例,不在加入到基本流中;(各种错误情况)
步骤:
1)根据说明,描述出程序的基本流及各项备选流;
2)根据基本流和各项备选流生成不同的场景;
3)对每一个场景生成相应的测试用例;
4)对生成的所有测试用例重新复审,去掉多余的测试用例,测试用例确定后,对每一个测试用例确定测试数据值。
案例:
分析ATM自动取款机的场景流程并设计测试用例和测试数据。
分析基本流和备选流:
基本流:1.插入磁卡
2.ATM机验证帐户正确
3.输入密码正确,通过验证
4.输入取款金额
5.判断金额
6.取款
备选流一:帐户不存在或受限制
备选流二:密码不正确,还有输入机会
备选流三:密码不正确,没有输入机会
备选流四:卡中余额不足
备选流五:机中余额不足
备选流六:超过每日最大提款限额
备选流七:输入金额非100倍数
注:为方便,备选流3和备选流6(场景3和场景7)内的循环以及循环组合忽略
场景图:
分析场景:
场景描述 | 基本流 | 备选流 |
场景1——成功的提款 | 基本流 | |
场景2——帐户不存在/帐户受限 | 基本流 | 备选流1 |
场景3——密码不正确(还有输入机会) | 基本流 | 备选流2 |
场景4——密码不正确(不再有输入机会) | 基本流 | 备选流3 |
场景5——卡中余额不足 | 基本流 | 备选流4 |
场景6——机中余额不足 | 基本流 | 备选流5 |
场景7——超过每日提款上限 | 基本流 | 备选流6 |
场景8——输入金额非100倍数 | 基本流 | 备选流7 |
设计测试用例:
TC(测试用例)ID号 | 场景/条件 | PIN | 帐号 | 输入的金额(或选择的金额) | 帐面金额(元) | ATM内的金额(元) | 预期结果 |
CW1 | 场景1:成功的提款 | 4987 | 809-498 | 100 | 500.00 | 2000 | 成功的提款。帐户余额被更新为400 |
CW2 | 场景2:帐户不存在/帐户受限 | n/a | 809-497 | n/a | 500.00 | 2000 | 提款选项不可用,用例结束 |
CW3 | 场景3:密码不正确(还有输入机会) | 4987 | 809-498 | n/a | 500.00 | 70.00 | 警告消息,返回基本流步骤3输入密码 |
CW4 | 场景4:密码不正确(不再有输入机会) | 4987 | 809-498 | n/a | 500.00 | 2000 | 警告消息,吞卡 |
CW5 | 场景5:卡中余额不足 | 4987 | 809-498 | 600 | 500.00 | 2000 | 警告消息,返回基本流步骤4,输入金额 |
CW6 | 场景6:机中余额不足 | 4987 | 809-498 | 400 | 500.00 | 300 | 提示消息,返回基本流步骤4,输入金额 |
CW7 | 场景7:超过每日提款上限 | 4987 | 809-498 | (24小时内已取款1900)200 | 2000 | 3000 | 警告消息,返回基本流步骤4,输入金额 |
CW8 | 场景8:输入金额非100倍数 | 4987 | 809-498 | 150 | 500.00 | 2000 | 警告消息,返回基本流步骤4,输入金额 |
2.6功能图法
一个程序的功能说明通常由动态说明和静态说明组成。
动态说明:描述输入数据的次序或转移的次序
静态说明:描述输入条件和输出条件之间的对应关系
功能图:由状态迁移图和布尔函数组成。
状态迁移图用状态和迁移来描述,一个状态指出数据输入的位置(或时间),而迁移则指明状态的改变。
功能图模型由状态迁移图和逻辑功能模型构成。
2.7正交试验法
从大量的试验中选择适量的有代表性的条件来合理安排试验。
步骤:
1)确定因素数和水平数
因素数:确定测试中有多少个相互独立的考察变量。
水平数:确定任何一个因素在试验中能够取得的最多值。
2)确定n值
单一水平正交表:
Ln(M^k),用n=k*(M-1)+1计算
混合水平正交表:
Ln(M1^K1 M2^K2 ... Mx^Kx ),用n=k1*(M1-1)+k2*(M2-1)+...+Kx*(Mx-1)+1计算