测试用例的设计.docx
《测试用例的设计.docx》由会员分享,可在线阅读,更多相关《测试用例的设计.docx(20页珍藏版)》请在冰豆网上搜索。
测试用例的设计
测试用例的设计
1、.等价类划分
等价类划分是一种典型的黑盒测试方法。
这一测试方法完全不考虑程序的内部结构,只依据程序的规格说明来设计测试用例。
等价类合理地假设:
某个等价类的代表值,与该等价类的其他值,对于测试来说是等价的。
因此,可以把全部的输入数据划分为若干的等价类,在每个等价类中取一个数据来进行测试。
这样就能以较少的具有代表性的数据进行测试,而取得比较好的测试效果。
等价类划分是把所有可能地输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。
该方法是一种重要的,常用的黑盒测试用例设计方法。
1.分类:
划分等价类:
等价类是指某个输入域的子集合。
在该子集合众,各个输入数据对于揭露程序中的错误都是等效的。
并合理的假定:
测试某等价类的代表值就等于对这一类其它值的测试。
因此,可以把全部输入数据合理划分为若干等价类,在每个等价类中取一个数据作为测试的条件,就可以用少量代表性的测试数据,取得较好的测试结果。
等价类划分有两种不同情况:
有效等价类、无效等价类
有效等价类:
是指对于程序的规格说明来说是合理的,有意义的输入数据构成的集合。
利用有效等价类可检验程序是否实现了规格说明中所规定的功能和性能。
无效等价类:
与有效等价类的定义恰好相反
设计测试用力时,要同时考虑这两种等价类。
因为,软件不仅仅要能接收合理的数据,也要能经受意外的考验,这样的测试才能确保软件具有更高的可靠性。
2.划分等价类的方法
先给出六条确定等价类的原则:
1)在输入条件规定了取值范围或值的个数的情况下,则可以确立一个有效等价类和两个无效等价类
2)在输入条件规定了输入值的集合或者规定了“必须如何”的条件的情况下,可确立一个有效等价类和一个无效等价类
3)在输入条件是一个布尔量的情况下,可确定一个有效等价类和一个无效等价类
4)在规定了输入数据的一组值(假定n个),并且程序要对每一个输入值分别处理的情况下,可设立N个有效等价类和一个无效等价类
5)在规定了输入数据必须遵守的规则的情况下,可确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。
6)在确知已划分的等价类中各元素在程序处理中的方式不同的情况下,则应再将该等价类进一步划分为更小的等价类。
3.原则
设计测试用例:
在确立了等价类后,可建立等价类表,列出所有划分出的等价类
输入条件有效等价类无效等价类
。
。
。
。
。
。
然后从划分出的等价类中按以下三个原则设计测试用例:
1)为每一个等价类规定一个唯一的编号
2)设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖地有效等价类,重复这一步,直到所有的有效等价类都被覆盖为止。
3)设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步骤。
直到所有的无效等价类都被覆盖为止。
之所以这么做,是因为程序中对于某一个错误输入的检查,往往会屏蔽对于其他错误输入的检查。
因此,必须针对每一个无效等价类分别设计测试用例。
4.实例
(1)保险费率计算
人人保险公司承担人寿保险已有多年历史,该公司保费计算方式为投保额*保险率,保险率又依点数不同而有别,10点以上费率为0.6%,10点以下费率为0.1%:
输入数据说明:
1)分析输入数据型式
年龄:
一或两位数字
性别:
以英文[Male]、[Female]、[M]、[F]表示。
婚姻:
[已婚]、[未婚]
扶养人数:
空白或一位数字
保险费率:
10点以上,10点以下
2)划分输入数据
1.年龄
数字范围
1~99
等价类
20~39
40~59
60岁以上20岁以下
2.性别
类型
英文字集合
等价类
类型:
英文字
集合:
[Male]、[M]
集合:
[Female]、[F]
3.婚姻
类型
等价类
已婚
未婚
4.扶养人数
选择项
扶养人数可以有,也可以没有
范围
1~9
等价类
空白
1~6人
6人以上
5.保险费率
等价类
10点以上
10点以下
3)设计输入数据
有效等价类
无效等价类
无效等价类
1.年龄
20~39任选一个数字
2.年龄
40~59任选一个数字
3.年龄
62岁以上20岁以下任选一个数字
小于1,选一个
大于99选一个
4.性别
[Male]、[M]、[Female]、[F]任选一个
非英文字如[男]
5.性别
[Female]、[F]任选一个
非[Male]、[M]、[Female]、[F]之任意字符,如[Child]
6.性别
[Male]、[M]任选一个
非[Male]、[M]、[Female]、[F]之任意字符,如[Child]
7.婚姻
[已婚]
非[已婚]或[未婚]之任意字符,如[离婚
8.婚姻
[未婚]
非[已婚]或[未婚]之任意字符,如[离婚
9.扶养人数
空白
10.扶养人数
1~6人任选一个数字
小于1任选一个数字
11.扶养人数
6人以上任选一个数字
大于9任选一个数字
12.保险费率
10点以上(0.6%)
13.保险费率
10点以下(0.1%)
4)根据以上分析设计测试用例
用例编号
年龄
性别
婚姻
扶养人数
保险费率
备注
1
22
Male
未婚
空白
10点以上(0.6%)
有效
年龄:
20~39岁
性别:
集合[Male,M]
婚姻:
集合[未婚]
扶养人数:
空白
保险费率:
0.6%
2
45
Female
已婚
2
10点以下
(0.1%)
有效
年龄:
40~59
性别:
集合[Female,F]
婚姻:
集合[已婚]
扶养人数:
1~6人
保险费率:
0.1%
3
70
M
未婚
7
0.1%
有效
年龄:
60岁以上
性别:
集合[Male,M]
扶养人数:
6人以上
保险费率:
0.6%
4
15
F
已婚
空白
0.1%
有效
年龄:
20岁以下
性别:
集合[Female,F]
扶养人数:
空白
保险费率:
0.1%
5
0
F
已婚
空白
无法推算
年龄类无效,因此无法推算保险费率
6
100
M
未婚
7
无法推算
年龄类无效,因此无法推算保险费率
7
1
男
未婚
空白
无法推算
性别类无效,因此无法推算保险费率
8
99
Child
未婚
6
无法推算
性别类无效,因此无法推算保险费率
9
30
Male
离婚
3
无法推算
婚姻类无效,因此无法推算保险费率
10
22
Male
未婚
0
无法推算
扶养人类无效,因此无法推算保险费率
11
22
Male
未婚
10
无法推算
扶养人类无效,因此无法推算保险费率
2、边界值分析法
边界值分析法是对等价类划分方法的补充,也是一种黑盒测试方法,由于长期的测试经验得知,大量的错误是发生在输入或输出的边界上。
因此针对各种边界条件设计测试用例,可以查出更多的错误。
1.边界值分析方法的考虑:
长期的测试工作经验告诉我们,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围内部,因此针对各种边界情况设计测试用例,可以查出更多的错误。
使用边界值分析方法设计测试用例,首先应确定边界情况。
通常输入和输出等价类的边界,就是应着重测试的边界情况。
应当选取正好等于,刚刚大于或刚刚小于边界的值作为测试数据,而不是选取等价类中的典型值或任意值作为测试数据。
2.基于边界值分析方法选择测试用例的原则:
(1)如果输入条件规定了值的范围,则应取刚达到这个范围的边界的值,以及刚刚超过这个范围边界的值作为测试输入数据。
(2)输入条件规定了值的个数,则用最大个数、最小个数、比最小个数少一、比最大个数多一的数作为测试数据。
(3)根据规格说明的每个输出条件,使用前面的原则
(1)
(4)根据规格说明的每个输出条件,应用前面的原则
(2)
(5)如果程序的规格说明给出的输入域或输出域是有序集合,则应选取集合的第一个元素和最后一个元素作为测试用例。
(6)如果程序中使用了一个内部数据结构,则应当选取这个内部数据结构的边界上的值作为测试用例。
(7)分析规格说明,找出其它可能地边界条件。
3.实例---找零钱最佳组合
假设商店货品价格(R)皆不大于100元(且为整数),若顾客付款在100元内(P),求找给顾客之最少货币个(张)数?
(货币面值50元(N50),10元(N10),5元(N5),1元(N1)四种)
(1)分析输入情况
输入
输出
R(货品价格)
R>100货品价格大于100
无效
无效R=101
0有效
R=100
R=99
R=1
R<=0
无效
无效R=0、R=-1
P顾客付款
P>100
无效
R<=P<=100
有效
P=100
P=99
P=R
P有效
(2)分析输出情况
R<=P<=100
R=100
P=100
0
R=99
P=N50(*2)100
N1=1
P=N50(*1)+N10(*5)100
N1=1
P=N50(*1)+N10(*4)+N5(*1)+N1(*4)
0N1=0
R=1
P=N1
0
P=N5
4=N1(*4)
P=N10
9=N5(*1)+N1(*4)
P=N50
49=N10(*4)+N5+N1(*4)
N50=1N50=0
1<=N10<4N10=0
N5=1N5=0
1<=N1<4N1=0
(3)分析规格中每一决策点之情形,以RR1,RR2,RR3表示计算要找50,10,5元货币数时之剩余金额。
R>100
R<=0
P>100
PRR1>=50
RR2>=10
RR3>=5
(4)由上述之输入/输出条件组合可能地情况
编号
条件
输出
1
R>100
2
R<=0
3
0100
4
05
0RR=50
6
0RR=49
7
0RR=10
8
0RR=9
9
0RR=5
10
0RR=4
11
0RR=1
12
0RR=0
(5)为满足以上之各种情形,测试资料设计如下:
编号
条件
输入
输出
1
R>100
货品价格R=101
2
R<=0
货品价格R=0
货品价格R=-1
3
0100
货品价格R=100,付款P=101
4
0货品价格R=100,付款P=101
5
0货品价格R=50,付款P=100
RR=50
6
0货品价格R=1,付款P=50
RR=49
7
0货品价格R=40,付款P=50
RR=10
8
0货品价格R=1,付款P=10
RR=9
9
0货品价格R=5,付款P=10
RR=5
10
0货品价格R=1,付款P=5
RR=4
11
0货品价格R=9,付款P=10
RR=1
12
0货品价格R=100,付款P=100
RR=0
3、错误推测法
1.定义:
基于经验和直觉测试程序中所有可能存在的各种错误,从而有针对性的设计测试用例的方法。
2.错误推测法的基本思想:
列举出程序中所有可能地错误和容易发生错误的特殊情况,根据它们选择测试用例。
选择测试用例:
(1)例如,输入数据和输出数据为0的情况;输入表格为空或输入表格只有一行。
这些都是容易发生错误的情况。
可选择这些情况下的例子作为测试用例。
(2)例如,前面例子中成绩报告的程序,采用错误推测法还可以补充一些测试用例:
1)程序是否把空格作为回答
2)在回答记录中混有标准答案记录
3)除了标题记录外,还有一些记录最后一个字符既不是2也不是3
4)有两个学生的学号相同
5)试题数是负数
(3)再如,测试一个线性表(比如数组)进行排序的程序,可推测出以下几项需要特别测试的情况:
1)输入线性表为空表
2)表中只含一个元素
3)输入表中所有元素已排好序
4)输入表已按逆序排好
5)输入表中部分和全部元素相同
4、因果图方法
考虑条件之间的相互组合,可能会产生一些新的情况。
但要检查输入条件的组合不是一件容易的事情,即使把所有输入条件划分成等价类,他们之间的组合情况也相当多。
因此必须采用一种适合于描述对于多种条件的组合,相应产生多个动作的形式来考虑设计测试用例。
这就需要利用因果图(逻辑模型)。
因果图方法最终生成的就是判定表。
它适合于检查程序输入条件的各种组合情况。
利用因果图生成测试用例的基本步骤:
(1)分析软件规格说明描述中,哪些是原因(即输入条件或输入条件的等价类),哪些是结果(即输出条件),并给每个原因和结果赋予一个标识符。
(2)分析软件规格说明描述中的语义,找出原因与结果之间,原因与原因之间对应的关系。
根据这些关系,画出因果图。
(3)由于语法或环境限制,有些原因与原因之间,原因与结果之间的组合情况不可能出现。
为表明这些特殊情况,在因果图上用一些记号表明约束或限制条件
(4)把因果图转换成判定表
(5)把判定表的每一列拿出来作为依据,设计测试用例
从因果图生成测试用例(局部,组合关系下的)包括了所有输入数据的取TRUE与FALSE的情况,构成的测试用例数目达到最少,且测试用例数目随输入数据数目的增加而线性地增加。
前面因果图方法中已经用到了判定表。
判定表(DecisionTable)是分析和表达多逻辑条件下执行不同操作的工具。
在程序设计发展的初期,判定表就已经被当作编写程序的辅助工具了。
由于它可以把复杂的逻辑关系和多种条件组合的情况表达得既具体又明确。
判定表通常由四部分组成:
(1)条件桩(ConditionStub):
列出了问题的所有条件。
(2)动作桩(ActionStub):
列出了问题规定可能采取的操作。
(3)条件项(ConditionEntry):
列出针对它左列条件的取值。
在所有可能情况下的真价值
(4)动作项(ActionEntry):
列出在条件项的各种取值情况下应采取的动作。
规则:
任何一个条件组合的特定取值及其相应要执行的操作。
在判定表中贯穿条件项与动作项的一列就是一条规则。
显然,判定表中列出多少组条件取值,也就有多少条规则,即条件项和动作项有多少列。
判定表的建立步骤:
(1)确定规则的个数。
假如有n个条件。
每个条件有两个取值(0,1),故有2^n种规则。
(2)列出所有的条件桩和动作桩
(3)填入条件项
(4)填入动作项。
等到初始判定表
(5)简化。
合并相似规则(相同动作)
Beizer指出了适合使用判定表设计测试用例的条件:
(1)规格说明以判定表形式给出,或很容易转换成判定表
(2)条件的排列顺序不会也不影响执行哪些操作
(3)规则的排列顺序不会影响执行哪些操作
(4)每当某一规则的条件已经满足,并确定要执行的操作后,不必检验别的规则。
(5)如果某一规则得到满足要执行多个操作,这些操作的执行顺序无关紧要。
2、因果图的基本符号
3.实例
某软件规格说明中包含这样的要求:
第一列字符必须是A或B,第二列字符必须是一个数字,在此情况下进行文件的修改。
但如果第一列字符不正确,则给出信息L;如果第二列字符不是数字,则给出信息M。
(1)分开原因和结果:
原因:
1----第一列字符是A;2---第二列字符是B;3---第一列字符是一数字
结果:
21---修改文件;22--给出信息L;23---给出信息M
(2)因果图(22第一列字符不正确;23第二列不是数字)
4、实例二
此例子是讲解利用因果图设计测试用例的一个小例子。
以中国象棋走马的测试用例设计为例学习因果图的使用方法。
(1)分析中国象棋走马的实际情况(下面未注明的均指对马的说明)
a.如果落点在棋盘外,则不移动棋子;b.如果落点与起点不构成日子型,则不移动棋子;
b.如果落点处有自己方棋子,则不移动棋子;d.如果落点方向的邻近交叉点有棋子(绊马腿),则不移动棋子;e.如果不属于1-4条,且落点无棋子,则移动棋子;f.如果不属于1-4条,且落点处为对方棋子(非老将),则移动棋子并除去对方棋子;g.如果不属于1-4条,且落点处为对方老将,则移动棋子,并提示战胜对方,游戏结束。
(2)根据分析明确原因和结果
原因:
1.落点在棋盘上;
2.落点与起点构成日字
3.落点处不是自己方棋子;
4.落点方向的邻近交叉点有棋子;
5.落点处无棋子;
6.落点处为对方棋子(非老将);
7.落点处为对方老将
结果:
21.不移动棋子;
22.移动棋子
23.移动棋子,并除去对方棋子;
24.移动棋子,并提示战胜对方,结束游戏
添加中间节点11,目的是作为导出结果的进一步原因,简化因果图导出判定表。
考虑结果不能同时发生,所以对其施加唯一约束O。
原因5,6,7不能同时发生,所以对其施加异或约束E。
(3)根据因果图建立判定表
注:
a.以上判定表中由于表格大小限制没有列出最后所选的测试用例;b.第2表中部分列被合并表示不可能发生的现象c.通过中间节点将用力地判定表简化为两个小表。
减少工作量。
(4)根据判定表写测试用例表(略)
5、场景设计方法
现在的软件几乎都是用事件触发来控制流程的,事件触发时的情景便形成了场景,而同一事件不同的触发顺序和处理结果就形成了事件流。
基本流和备选流:
如下图所示,图中经过用例的每条路径都用基本流和备选流来表示,直黑线表示基本流,是经过用例的最简单的路径。
备选流用不同的彩色表示,一个备选流可能从基本流开始,在某个特定条件下执行,然后重新加入基本流中(如备选流1和3);也可能起源于另一个备选流(如备选流2),或者终止用例而不再重新加入到某个流(如备选流2和4)
1.实例
下图所示是ATM例子的流程示意图。
2.场景设计:
下表所示是生成的场景
场景1--成功提款
基本流
场景2--ATM内没有现金
基本流
备选流2
场景3--ATM内现金不足
基本流
备选流3
场景4--PIN有误(还有输入机会)
基本流
备选流4
场景5--PIN有误(不再有输入机会)
基本流
备选流4
场景6--账户不存在或账号类型有误
基本流
备选流5
场景7--账号余额不足
基本流
备选流6
3.用例设计
对于这7个场景中的每一个场景都需要确定测试用例。
可以采用矩阵或决策表来确定和管理测试用例。
下面显示了一种通用格式,其中各行代表各个测试用例,而各列则代表测试用例的信息。
本示例中,对于每个测试用例,存在一个测试用例ID、条件、测试用例中涉及的所有数据元素(作为输入或已经存在于数据库中)以及期望结果。
4.