等价划分的例子
例1:某城市的电话号码由三部分组成。这三部分的名称和内容分别是地区码:空白或三位数字; 前 缀:非’0’或’1’开头的三位数;后 缀:四位数字。假定被调试的程序能接受一切符合上述规定的电话号码,拒绝所有不符合规定的号码,就可用等价分类法来设计它的调试用例。
解:第一步:划分等价类,包括4个有效等价类,11个无效等价类。表7-2-1列出了划分的结果。在每一等价类之后加有编号,以便识别。 表7-2-1 电话号码程序的等价划分 输入条件 地区码 有效等价类 空白(1),3位数字(2) 从200到999之间的前缀 3位数字(3) 4位数字(4) 后缀 有非数字字符(13),少于4位数字(14),多于4位数字(15) 无效等价类 有非数字字符(5),少于3位数字(6),多于三位数字(7) 有非数字字符(8),起始位为\"0\"(9),起始位为\"1\"(10),少于3位数字(11),多于3位数字(12) 第二步:确定调试用例。表7-2-1中有4个有效等价类,可以公用以下两个次数用例:(1)、(2)中各取一个对应合法的(3)、(4)即可。 对11个无效等价类,要选择11个调试用例,如下所示:
调试数据
(20A) 123-4567 (33 ) 234-5678 (7777) 345-6789 (777) 34A-6789 (234) 045-6789 (777) 145-6789 (777) 34-6789
范围
无效等价类(5) 无效等价类(6) 无效等价类(7) 无效等价类(8) 无效等价类(9) 无效等价类(10)
无效等价类(11)
期望结果 无效 无效 无效 无效 无效 无效 无效 无效 无效 无效 无效
(777) 2345-6789 无效等价类(12) (777) 345-678A (777) 345-678 (777) 345-56789
无效等价类(13)
无效等价类(14) 无效等价类(15)
选取的调试数据可以不同,关键是与调试内容相符。
例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} 一般等价类测试用例 月份 日
期 年 预期输出
6 15 1912 2年6月16日
注:弱--有单缺陷假设;健壮--考虑了无效值
(一)弱健壮等价类测试
用例ID 月份 日期 年 输出
WR1 6 15 1912 年6月16日
WR2 -1 15 1912 1~12中
WR3 13 15 1912 1~12中
WR4 6 -1 1912 不在1~31中
WR5 6 32 1912 不在1~31中
WR6 6 15 1811 在1812~2012中
WR7 6 15 2013 不在1812~2012中
(二)强健壮等价类测试 用例ID 月份 日
期 年 预期输出
SR1 -1 15 1912 份不在1~12中
SR2 6 -1 1912 日期不在1~31中
SR3 6 15 1811 年份不在1812~2012中
SR4 -1 -1 1912 191 预期 1912月份不在 月份不在 日期 日期 年份不 年份 月
两个无效一个有效
SR5 6 -1 1811 两个无效一个有效
SR6 -1 15 1811 两个无效一个有效
SR7 -1 -1 1811 三个无效
例3.佣金问题等价类测试用例,它是根据佣金函数的输出值域定
义等价类,来改进测试用例集合。
输出销售额≤1000元 佣金10%
1000<销售额≤1800 佣金=100+(销售额-1000)*15%
销售额>1800 佣金=220+(销售额-1800)*20% 测试用例 枪机(45) 枪托(30) 枪管(25) 销售额 佣金
1 5 5 5 500 50
2 15 15 15 1500 175
3 25 25 25 2500 360 根据输出域选择输入值,使落在输出域等价类内,可以结合弱健壮测试用例结合。(考虑无效值)
我举个例子:比如说腾讯公司的即时聊天工具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语言编写的,它的说明如下:
int strtoint(char shortstr[])
其中 参数shortstr[]的定义如下:
char shortstr[6];
被处理的数字串是右对齐的,也就是说,如果数字串比6个字符短,则在它的左边补空格。如果字符串是负的,则负号和最高位数字紧相邻。因为编译程序固有的检错功能,测试时不需要使用长度不等于6的数组做实在参数,更不需要使用任何非字符数组类型的实在参数。
分析这个程序的规格说明,可以划分出如下等价类:
有效输入的等价类:
136 1~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’;预期的输出:“错误—— 填充错误”。 测试用例⑨ 最高位数字后有空格。 输入:‘ 1 2’;预期的输出:“错误—— 无效的填充”。 测试用例⑩ 最高位数字后面有其他字符。 输入:‘ 1##2’;预期的输出:“错误—— 无效输入”。 测试用例格。 负号和最高位数字之间有空 输入:‘ - 23’;预期的输出:“错误—— 负号位置错误”。 表8-1 数字串转变为整数的等价类表 输 入 条 件 数字串个数 数字串个数不满6个 最高位与负号 有效等价类 1 到 6 个数字 左边补空格“ 123” 两者紧邻 “-12345” 无效等价类 0 或大于6个数字 左边是空格和字符混合 最高位与负号之间有空格或字符
因篇幅问题不能全部显示,请点此查看更多更全内容