等价划分的例子.pdf
更新时间:2022-09-28 00:15:17 阅读: 评论:0
等价划分的例子
例1:某城市的电话号码由三部分组成。这三部分的名称和内容分别是地区码:
空白或三位数字;前缀:非’0’或’1’开头的三位数;后缀:四位
数字。假定被调试的程序能接受一切符合上述规定的电话号码,拒绝所有不符
合规定的号码,就可用等价分类法来设计它的调试用例。
解:第一步:划分等价类,包括4个有效等价类,11个无效等价类。表7-2
-1列出了划分的结果。在每一等价类之后加有编号,以便识别。
表7-2-1电话号码程序的等价划分
输入条件有效等价类无效等价类
空白(1),3位数字有非数字字符(5),少于3位数字(6),多于三
地区码
(2)位数字(7)
从200到999之间的
有非数字字符(8),起始位为"0"(9),起始位为
3位数字(3)
前缀"1"(10),少于3位数字(11),多于3位数字
(12)
4位数字(4)
有非数字字符(13),少于4位数字(14),多于4
后缀
位数字(15)
第二步:确定调试用例。表7-2-1中有4个有效等价类,可以公用以下两
个次数用例:(1)、(2)中各取一个对应合法的(3)、(4)即可。
对11个无效等价类,要选择11个调试用例,如下所示:
调试数据范围期望结果
(20A)-4567123无效等价类(5)无效
(33)-5678234无效等价类(6)无效
(7777)-6789345无效等价类(7)无效
(777)-678934A无效等价类(8)无效
(234)-6789045无效等价类(9)无效
(777)-6789145无效等价类(10)无效
(777)-678934无效等价类(11)无效
(777)-23456789无效等价类(12)无效
无效等价类(13)
(777)-345678A无效
(777)-345678无效等价类(14)无效
无效等价类(15)
(777)-34556789无效
选取的调试数据可以不同,关键是与调试内容相符。
例2.NextDate函数包含三个变量:month、day和year,函数
的输出为输入日期后一天的日期。
例如,输入为2006年3月7日,则函数的输出为2006年3月8日。要求输
入变量month、day和year均为整数值,并且满足下列条件:
①1≤month≤12
②1≤day≤31
③1920≤year≤2050
1)有效等价类为:
M1={月份:1≤月份≤12}
D1={日期:1≤日期≤31}
Y1={年:1812≤年≤2012}
2)若条件①~③中任何一个条件失效,则NextDate函数都会产生一
个输出,指明相应的变量超出取值范围,比如"month的值不在1-12范围当中
"。显然还存在着大量的year、month、day的无效组合,NextDate函数
将这些组合作统一的输出:"无效输入日期"。其无效等价类为:
M2={月份:月份<1}
M3={月份:月份>12}
D2={日期:日期<1}
D3={日期:日期>31}
Y2={年:年<1812}
Y3={年:年>2012}
一般等价类测试用例
月份日期年预期输出
61519121912年6月16日
注:弱--有单缺陷假设;健壮--考虑了无效值
(一)弱健壮等价类测试
用例ID月份日期年预期输出
WR1615年6月16日19121912
WR2-1月份不在151~12中1912
WR313月份不在151~121912中
WR46日期不在-11~311912中
WR56日期不在321~311912中
WR66年份不在151812~18112012中
WR7615年份不在18122013~2012中
(二)强健壮等价类测试
用例ID月份日期年预期输出
SR1-115月份不在1~121912中
SR26日期不在-11~31中1912
SR36年份不在151812~20121811中
SR4-1-1两个无效一个有效1912
SR56-1两个无效一个有效1811
SR6-115两个无效一个有效1811
SR7-1-1三个无效1811
例3.佣金问题等价类测试用例,它是根据佣金函数的输出值域定
义等价类,来改进测试用例集合。
输出销售额≤1000元佣金10%
1000<销售额≤1800佣金=100+(销售额-1000)*15%
销售额>1800佣金=220+(销售额-1800)*20%
测试用例枪机(45)枪托(30)枪管(25)销售额佣金
155550050
215**********
32525252500360
根据输出域选择输入值,使落在输出域等价类内,可以结合弱健壮测试用例
结合。(考虑无效值)
我举个例子:比如说腾讯公司的即时聊天工具QQ:
关于QQ用户登录框,你该怎么去考虑测试用例的设计呢?当然,我们要从两个方面去考虑:一是
QQ帐号,二是QQ密码。就拿QQ帐号一个输入框,你怎么去考虑进这行测试用例的设计?
目前,一个QQ服务器就允许有10万以上个用户同时登录进行即时聊天,有多少个QQ帐号啊?现
在一个人还不只一个QQ号呢,呵呵。
如果有很多QQ帐号的话,怎么进行测试呢?如果只测试几个,覆盖率不足;全部都测试一遍,不可
能有那么长时间,而且太多了也不好实施。
所以,QQ帐号的测试就陷入了僵局?我们先分析一下QQ帐号:由6-10位自然数构成。一是位数
长度有一定的限制,二是类型是固定的,由0-9自然数构成。要想测试覆盖全面,又要节省时间,最好的
办法是尽量简化测试用例的设计。通过对以上QQ帐号的分析,可以看到有效的帐号有它自己的特点:长
度与类型要符合要求,这样只要在腾讯公司的服务器上申请了帐号,就可以进行即时通信了。
那么,这样就有一个解决问题的方法了:进行类的别划分。我们知道软件的功能测试要进行两个方面
的测试:通过测试和失败测试。要进行通过测试的话,帐号要符合规范,要进行失败测试的话,就要破坏
帐号的规范。好,这样的话,QQ帐号的测试我们就可以进行了。
把QQ帐号进行分类:有效的和无效的。
有效的:(1)长度在6-10位之间
(2)类型是0-9自然数
无效的:(1)长度小于6
(2)长度大于10
(3)负数
(4)小数
(5)英文字母
(6)字符
(7)特殊字符
(8)中文
(9)编程语言中的转义字符
(10)空
假设有一个把数字串转变为整数的函数。运行程序的计算机字长16位,用二进
制补码表示整数。这个函数是用C语言编写的,它的说明如下:
intstrtoint(charshortstr[])
其中参数shortstr[]的定义如下:
charshortstr[6];
被处理的数字串是右对齐的,也就是说,如果数字串比6个字符短,则在它的左
边补空格。如果字符串是负的,则负号和最高位数字紧相邻。因为编译程序固有
的检错功能,测试时不需要使用长度不等于6的数组做实在参数,更不需要使用
任何非字符数组类型的实在参数。
分析这个程序的规格说明,可以划分出如下等价类:
有效输入的等价类:
1361~6个数字字符组成的数字串(最高位数字不是零)。
137最高位数字是零的数字串;
138最高位数字左邻是负号的数字串;
无效输入的等价类:
139空字符串(全是空格)。
140左部填充的字符既不是零也不是空格。
141最高位数字右面由数字和空格混合组成。
142最高位数字右面由数字和其他字符混合组成。
143负号与最高位数字之间有空格。
合法输出的等价类:
144在计算机能表示的最小负整数和零之间的负整数。
145零。
146在零和计算机能表示的最大正整数之间的正整数。
非法输出的等价类:
147比计算机能表示的最小负整数还小的负整数。
148比计算机能表示的最大正整数还大的正整数。
根据上面划分出的等价类,可以设计出如下测试用例:
测试用例①1~6个数字组成的数字串,输出是合法的正整数。
输入:‘1’;预期的输出:1;
测试用例②最高位数字是零的数字串,输出是合法的正整数。
输入:‘000001’;预期的输出:1;
测试用例③负号与最高位数字紧相邻,输出合法的负整数。
输入:‘-00001’;预期的输出:–1;
测试用例④最高位数字是零,输出是零。
输入:‘000000’;预期的输出:0;
测试用例⑤太小的负整数。
输入:‘–47561’;预期的输出:“错误——无效输入”。
测试用例⑥太大的正整数。
输入:“134567”;预期的输出:“错误——无效输入”。
测试用例⑦空字符串。
输入:‘’;预期的输出:“错误——没有数字”。
测试用例⑧字符串左部字符既不是零也不是空格。
输入:‘#####1’;预期的输出:“错误——填充错误”。
测试用例⑨最高位数字后有空格。
输入:‘12’;预期的输出:“错误——无效的填充”。
测试用例⑩最高位数字后面有其他字符。
输入:‘1##2’;预期的输出:“错误——无效输入”。
测试用例负号和最高位数字之间有空格。
输入:‘-23’;预期的输出:“错误——负号位置错误”。
表8-1数字串转变为整数的等价类表
输入条件有效等价类无效等价类
数字串个数1到6个数字0或大于6个数字
数字串个数不满6个左边补空格“123”左边是空格和字符混合
最高位与负号两者紧邻“-12345”最高位与负号之间有空格或字符