等价类
定义:1、等价:如果多个输入在程序中处理方式(路径)相同,则认为这些输入是等价的,测试一个即可。(前提:测试不能穷举)
2、输入:分为两类,有效输入(可以保存)、无效输入(不可保存)
3、结合:有效等价类、无效等价类
满足规则:只需寻找一个全部满足规则的(有效等价类)
不满足规则:需分开,每条不满足条件的举出一个,方便定位错误(无效等价类)
规则的几种情况:
1 若规则是布尔式的
有效、无效分别取一个 一个真,一个假
2. 若规则是区
有效的取一个 无效的,在小于区间的取一个,大于区间的取一个,空或零取一个
3. 规则是集合:
有效取一个 无效的在集合外取一个
4. 规则是必须满足的一个条件:
对无效,要细分无效(先试试其他有效等价类,再试试全部等价类全都不满足)
例:邮箱注册,注册名只能以小写字母开头,设计无效等价类时,先试试其他有效等价类,如大写字母、数字等,再试试其他有效全部都不满足的情况
有效等价类:程序规格说明有意义,合理的输入数据
无效等价类:程序规格说明无意义,不合理的输入数据
ASCII码
7位 表示27=128个字符 每个字符存储占用1个字节
分类:不可见字符
控制字符:LF(换行)、CR(回车)
通信字符
NULL(空)
可见字符
空格
数字
字母(大写、小写)
符号
练习
1.1年龄注册
注册页面要求输入年龄,限制:1到150期间的正整数
1、需求分析—找出全部的输入条件
1)、正整数
2)、[1,150]
注意:分解的过程中,条件之间不用组合(完全独立),在设计有效用例输入的时候再考虑组合(一对多)
2、绘制等价类表格
条件 |
有效等价类 |
有效编号 |
无效等价类 |
无效编号 |
|
正整数 |
>1 |
A01 |
数字 |
小数 |
B01 |
负数 |
B02 |
||||
0 |
B03 |
||||
非数字 |
空(NULL) |
B04 |
|||
空格 |
B05 |
||||
字母 |
B06 |
||||
符号 |
B07 |
||||
[1,150] |
[1,150] |
A02 |
<1 |
B08 |
|
>150 |
B09 |
3、设计测试用例输入
原则:有效输入—尽可能多去覆盖有效等价类 (一对多)
无效输入---只能覆盖一个无效等价类 (一对一)
目的:A、出现问题可以更好的去定位
B、有可能第一个无效处理后,后续无效值被漏测
输入序号 |
有效输入值 |
覆盖有效等价类 |
输入序号 |
无效输入值 |
覆盖无效等价类 |
1 |
100 |
A01、A02 |
2 |
1.8 |
B01 |
3 |
-9 |
B02 |
|||
4 |
0 |
B03、B08 |
|||
5 |
空(NULL) |
B04 |
|||
6 |
空格 |
B05 |
|||
7 |
W |
B06 |
|||
8 |
@ |
B07 |
|||
9 |
200 |
B09 |
1.2.年龄注册
某保险公司注册页面要求输入年龄,限制:1到150期间的正整数,其中:
[1,10] 适用的费率 10%
[11,50] 适用的费率 30%
[51,150] 适用的费率 80%
条件 |
有效等价类 |
有效编号 |
无效等价类 |
无效编号 |
|
正整数 |
>1 |
A01 |
数字 |
小数 |
B01 |
负数 |
B02 |
||||
0 |
B03 |
||||
非数字 |
空(NULL) |
B04 |
|||
空格 |
B05 |
||||
字母 |
B06 |
||||
符号 |
B07 |
||||
[1,150] |
[1,10] |
A02 |
<1 |
B08 |
|
[11,50] |
A03 |
>150 |
|||
[51,150] |
A04 |
输入序号 |
有效输入值 |
覆盖有效等价类 |
输入序号 |
无效输入值 |
覆盖无效等价类 |
1 |
5 |
A01、A02 |
4 |
1.8 |
B01 |
2 |
30 |
A01、A03 |
5 |
-9 |
B02 |
3 |
100 |
A01、A04 |
6 |
0 |
B03、B08 |
7 |
空(NULL) |
B04 |
|||
8 |
空格 |
B05 |
|||
9 |
W |
B06 |
|||
10 |
@ |
B07 |
|||
11 |
200 |
B09 |
1.3.扩充
考虑全角和半角问题(GB231)
其中,半角占1个字节
全角占2个字节
字符集
1、ASCII
2、GB2312 -> GB18030 一个汉字占2个字节
BIG5(繁体)
3、ISO Unicode (UTF-16) -> UTF-8(变长存储) 一个汉字可能占3个字节
条件 |
有效等价类 |
有效编号 |
无效等价类 |
无效编号 |
|
正整数 |
>1(半角) |
A01 |
|||
0 |
B03 |
||||
>1(全角) |
A02 |
半角字符 |
空(NULL) |
B04 |
|
空格 |
B05 |
||||
字母 |
B06 |
||||
符号 |
B07 |
||||
全角字符 |
空格 |
B08 |
|||
字母 |
B09 |
||||
符号 |
B10 |
||||
汉字 (字符集) |
GB-2312 |
B11 |
|||
BIG-5 |
B12 |
||||
[1,150] |
[1,150] |
A03 |
<1 |
B13 |
|
>150 |
B14 |
分解粒度:根据功能的重要性决定(用例图----执行者角色,考虑用户的关注功能)
根据成本、时间决定
取消负数、小数的原因:
1、前提:在编辑框内输入年龄,程序在接收编辑框的内容时,一般以字符(或字符串)的形式接收,再根据需要进行类型转换,如年龄,需要转换为整型
2、小数中的“小数点”和负数中的“负号”都认为是符号,不允许保存
边界值
取值(5个):上点、内点、离点
1、上点、内点取值与区间的开闭无关
2、离点和上点互为有效
作用:(有序、有范围)等价类的补充
补充:考虑数据类型的边界
如 int 类型 占4个字节 即 32bit 取值范围[-231, 231-1]
上点:边界上的点
内点:区间内的点
离点:离边界值最近且与上点不属于同一等价类的点(对于小数,没有离点,不用取)
规则的几种情况:
1. 规则是区间:
按上点、内点、离点取
2. 规则是取值的个数:
取最小、最大、中间个数
3.规则是a~z序列:
取a、z
4.规则是集合:
取一个集合内的,取一个集合外的
(0,20)上点是0,20 离点是1,19 [0,20]上点是0,20 离点是-1,21
若规则是下拉菜单:建议每个下拉值都选择一个
2.1.年龄
条件 |
有效等价类 |
有效边界值 |
有效编号 |
无效等价类 |
无效边界值 |
无效编号 |
|
正整数 |
>=1 |
上点:1 |
A01 |
数字 |
小数 |
B01 |
|
内点:100 |
A02 |
负数 |
B02 |
||||
离点:0 |
0 |
B03 |
|||||
非数字 |
空(NULL) |
B04 |
|||||
空格 |
B05 |
||||||
大写字母 |
上点:A |
B06 |
|||||
上点:Z |
|||||||
内点:M |
|||||||
符号 |
离点:@ |
B07 |
|||||
离点:[ |
|||||||
[1,150] |
[1,150] |
上点:1 |
A03 |
离点: |
0 |
B08 |
|
上点:150 |
A04 |
离点: |
151 |
B09 |
|||
内点:100 |
A05 |
有效用例输入:1 、100、150
2.2.用户名注册
1、测试需求分析
1、内容:字母、数字、
2、长度:[6,18]
3、约束:字母开头
字母或数字结尾
不允许重名
不允许使用保留字
自动去除首尾空格
2、等价类划分
条件 |
有效等价类 |
有效编号 |
无效等价类 |
无效编号 |
|
内容 |
字母 |
大写字母 |
A01 |
符号(除下划线) |
B01 |
小写字母 |
A02 |
NULL(空) |
B02 |
||
数字 |
[0,9] |
A03 |
空格 |
B03 |
|
下划线 |
下划线 |
A04 |
GB2312 |
B04 |
|
BIG5 |
B05 |
||||
长度 |
[6,18] |
[6,18] |
A05 |
<6 |
B06 |
>18 |
B07 |
||||
约束 |
字母开头 |
大写字母开头 |
A06 |
数字开头 |
B08 |
小写字母开头 |
A07 |
下划线开头 |
B09 |
||
符号(非下划线)开头 |
B10 |
||||
汉字开头 |
B11 |
||||
字母或数字结尾 |
大写字母结尾 |
A08 |
下划线结尾 |
B12 |
|
小写字母结尾 |
A09 |
符号(非下划线)结尾 |
B13 |
||
数字结尾 |
A10 |
汉字结尾 |
B13 |
||
不允许重名 |
不重名 |
A11 |
重名 |
B15 |
|
去除首尾空格 |
A12 |
||||
不允许使用保留字 |
不使用 |
A13 |
使用保留字 |
B16 |
3、用例设计
序号 |
有效输入 |
有效边界值 |
序号 |
无效输入 |
无效边界值 |
1 |
(当前系统无AAb_4) AAbb_4 |
A01、A02、A04、A03 A05、A06、A10 A11、A13 |
5 |
abc@a |
B01 |
2 |
(当前系统无AAb_4) aAbcvb_A |
A01、A02、A04、A03 A05、A07、A08 A11、A13 |
……….. |
||
3 |
(当前系统无AAb_4) aA555b_b |
A01、A02、A04、A03 A05、A07、A09 A11、A13 |
(当前系统存在aaf5bc) (空格)aaf5bc(空格) |
B15 |
|
4 |
(当前系统无aaf5bc) (空格)aaf5bc(空格) |
A12 |
Administrator |
B16 |
2.3.变量命名
在某一版的编程语言中对变量名称规格作如下规定:变量名称是由字母开头的,后跟字母或者数字的任意组合构成,并且区分字母大小写。编译器能够区分的有效字符数为8个,并且变量名称必须先声明,后使用,在同一声明语句中,变量名称至少必须有一个。
1、测试需求分析
内容:字母、数字
长度:[1,8]
约束:字母开头
大小写敏感
先声明后使用
变量的个数[1,?] (需要和需求人员沟通)
在同一作用域中不允许重名
不能使用关键字
2、等价类划分
3、确定边界值
4、设计用例输入
2.4.进销存价格
代码实现:
if (isNumberString(document.form2.tichen.value,"1234567890.")!=1)
{
alert("价格只能为数字!");
return false;
}
根据代码的实现,价格编辑框只接受键盘的“数字键”和“小数点”共11个字符
等价类
条件 |
有效等价类 |
无效等价类 |
内容 |
数字 |
字母 字母、符号处理方式(路径)相同,认为都是等价的 |
小数点 |
||
约束 |
小数点最多有1个 |
>1个小数点 |
2.5.Windows文件命名
目录 目录长度 文件最大长度 目录+文件最大长度
C: 3 255个 = 258
C:ABCD 7 251个 =258
C:ABCDAAAA 12 246个 =258
根目录: 255
非根目录: 254 (文件夹最小长度为1)
1、测试需求分析
内容:非“/:*?"<>|”的字符
长度: 根目录: 255
非根目录: 254 (文件夹最小长度为1)
约束:同目录下不能重名(去除首尾空格)
不同扩展名使用不同的图标
不能为空
总结
1、适用范围:针对程序的输入
2、使用步骤
1)、测试需求分析,找出全部条件(显示、隐士)(条件之间不能交叉或者组合,到设计用例的时候再考虑多条件的组合)
2)、划分等价类
划分依据:相同的处理方式(路径)
分类:有效等价类、无效等价类
3)、使用边界值补充(有序、有范围的)等价类
内容:上点、离点、内点
要求:上点、内点与区间开闭无关,离点和上点互为有效
分类:将边界值分为有效边界和无效边界,填入等价类表格
4)、对每个等价类进行唯一的编号
5)、设计用例的输入
原则:有效等价类,一对多
无效等价类,一对一
3、优点:对输入的考虑充分
4、缺点:如果不清楚系统的实现方式,造成大量的冗余用例(黑盒方法共有)
对于多输入的组合不太适宜
规则的几种情况:
1 .若规则是布尔式的
有效、无效分别取一个 一个真,一个假
2. 若规则是区间
有效的取一个 无效的,在小于区间的取一个,大于区间的取一个,空或零取一个
3. 规则是集合:
有效取一个 无效的在集合外取一个
4. 规则是必须满足的一个条件:
对无效,要细分无效(先试试其他有效等价类,再试试全部等价类全都不满足)
例:邮箱注册,注册名只能以小写字母开头,设计无效等价类时,先试试其他有效等价类,如大写字母、数字等,再试试其他有效全部都不满足的情况
有效等价类:程序规格说明有意义,合理的输入数据
无效等价类:程序规格说明无意义,不合理的输入数据
边界值
上点:边界上的点
内点:区间内的点
离点:离边界值最近且与上点不属于同一等价类的点(对于小数,没有离点,不用取)
规则的几种情况:
1. 规则是区间:
按上点、内点、离点取
2. 规则是取值的个数:
取最小、最大、中间个数
3.规则是a~z序列:
取a、z
4.规则是集合:
取一个集合内的,取一个集合外的
(0,20)上点是0,20 离点是1,19 [0,20]上点是0,20 离点是-1,21
若规则是下拉菜单:建议每个下拉值都选择一个