测试用例包含测试输入、执行条件、预期结果,对每一个测试点进行数据设计和步骤设计。
测试用例八大要素:
- 用例编号:一般格式:产品名-测试阶段(it/st/uat)-测试项-xxx(使用英文,编号唯一)
- 测试项目:相关功能模块
- 测试标题:描述目的,言简意赅(输入+动作)
- 重要级别:优先级分为高(核心功能,冒烟测试)、中(异常)、低(界面,兼容性)
- 预置条件:环境、网络等
- 测试步骤:数据+动作(路径->输入->动作)
- 预期结果:一对一、多对一
- 实际结果:通过(pass)、不通过(failed)、阻塞(无法执行)
- 其他要素:备注(bug id/原因等)、版本、设计者、时间等
等价类划分、边界值法
等价类划分法:把所有可能的输入划分为N个子集,在每个子集中抽取具代表性的数据作为测试数据。等价类分为有效等价类和无效等价类。设计用例时,要同时考虑这两种等价类,软件不仅要能接收合理的数据,也要能经受意外的考验,这样才能确保软件具有更高的可靠性。
边界值分析法:该方法是对等价类的补充,关注等于、刚刚大于、刚刚小于的值、0、负值等。
划分等价类
标准:完备测试、避免冗余。将集合划分为互不相交的一组子集,而子集的并是整个集合,每个子集中选择一个测试用例。
有效等价类:对程序来说是合理的、有意义的输入数据构成的集合。利用有效等价类可检验程序是否实现了规格说明中所规定的功能和性能。
无效等价类:对程序来说是不合理的或无意义的输入数据所构成的集合。针对具体的问题,无效等价类至少应有一个,也可能有多个。
不同场景划分:
等价类方法一般用在输入项存在无穷尽的情况,通过等价类方法把穷尽测试转化为有效测试。
输入条件 | 确立有效等价类个数 | 确立无效等价类个数 |
规定了取值范围或值的个数 | 1 | 2 |
规定了输入值的集合 或规定了 "必须如何 " | 1 | 1 |
输入条件是一个 布尔量 | 1 | 1 |
规定了输入数据的一组值(假定n个) 并且程序要对每一个输入值分别处理 | 1 | 1 |
规定了输入数据必须遵守的规则 | 1(符合规则) | 若干(从不同角度违反规则) |
若已划分的等价类中各元素在程序处理中的方式不同|则应再将该等价类进一步划分为更小的等价类。
等价类分析步骤:
-
根据需求—>划分条件—>找有效、无效等价类
- 对等价类分别编号(例:A有效,B无效)
- 选择测试用例(正例、反例):用最少的用例覆盖最多的有效等价类;用最多的用例一一覆盖无效等价类,每个等价类单独测试。
例1:三角形问题
"输入三个整数 a 、 b 、 c 分别作为三边的边长构成三角形。通过程序判定所构成的三角形的类型,当此三角形为一般三角形、等腰三角形及等边三角形时,分别作计算 … "。用等价类划分方法为该程序进行测试用例设计。(三角形问题的复杂之处在于输入与输出之间的关系比较复杂。)
1. 划分等价类并编号
2. 为每一个有效等价类设计测试用例:
3. 为每一个无效等价类设计测试用例:
例2:日期问题
设有一个档案管理系统,要求用户输入以年月表示的日期。假设日期限定在1990年1月~2049年12月,并规定日期由6位数字字符组成,前4位表示年,后2位表示月。现用等价类划分法设计测试用例,来测试程序的"日期检查功能"。
1. 划分等价类并编号:
输入等价类 | 有效等价类 | 无效等价类 |
日期的类型及长度 | ① 6位数字字符 | ② 有非数字字符 ③ 少于6位数字字符 ④多于6位数字字符 |
年份范围 | ⑤在1990~2049之间 | ⑥小于1990 ⑦大于2049 |
月份范围 | ⑧在01~12之间 | ⑨等于00 ⑩大于12 |
2. 设计测试用例,上表中列出了3个有效等价类,编号分别为①、⑤、⑧,设计的测试用例如下:
测试数据 | 期望结果 | 覆盖的有效等价类 |
---|---|---|
200211 | 输入有效 | ①、⑤、⑧ |
3. 为每一个无效等价类设计一个测试用例,设计结果如下:
测试数据 | 期望结果 | 覆盖的无效等价类 |
---|---|---|
95June | 无效输入 | ② |
20036 | 无效输入 | ③ |
2001006 | 无效输入 | ④ |
198912 | 无效输入 | ⑥ |
200401 | 无效输入 | ⑦ |
200100 | 无效输入 | ⑨ |
200113 | 无效输入 | ⑩ |
例3:NextDate问题
NextDate 函数包含三个变量:month、 day 和 year ,函数的输出为输入日期后一天的日期。 例如,输入为 2006年3月 7日,则函数的输出为 2006年3月8日。要求输入变量 month 、 day 和 year 均为整数值,并且满足下列条件:
① 1 ≤ month ≤ 12
② 1 ≤ day ≤ 31
③ 1920 ≤ year ≤ 2050
1、划分等价类
2、设计测试用例
测试用例的完整性从弱到强排序:
(1)弱一般等价类测试:单缺陷原则,要求用例覆盖每一个变量的一种取值即可,取值为有效值。
月份 | 日期 | 年 | 预期输出 |
---|---|---|---|
6 | 15 | 1912 | 1912年6月16日 |
(2)弱健壮等价类测试:在弱一般的基础上,增加取值为无效值的情况。
用例ID | 月份 | 日期 | 年 | 预期输出 |
WR1 | 6 | 15 | 1912 | 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中 |
(3)强一般等价类测试:多缺陷原则,要求用例覆盖所有变量所有取值的所有组合,取值为有效值。(例如变量X有3个等价类,变量Y有2个等价类,那么应设计3*2共6个用例。要覆盖所有的有效等价类组合。)
(4)强健壮等价类测试:在强一般的基础上,增加取值为无效值的情况。(不仅取单个无效值,也要取多个无效值。)
用例ID | 月份 | 日期 | 年 | 预期输出 |
SR1 | -1 | 15 | 1912 | 月份不在1~12中 |
SR2 | 6 | -1 | 1912 | 日期不在1~31中 |
SR3 | 6 | 15 | 1811 | 年份不在1812~2012中 |
SR4 | -1 | -1 | 1912 | 两个无效一个有效 |
SR5 | 6 | -1 | 1811 | 两个无效一个有效 |
SR6 | -1 | 15 | 1811 | 两个无效一个有效 |
SR7 | -1 | -1 | 1811 | 三个无效 |
例4:佣金问题
佣金问题等价类测试用例,它是根据佣金函数的输出值域定义等价类,来改进测试用例集合。
- 步枪销售商在亚利桑那州境内销售制造商制造的枪机、枪托和枪管。枪机卖45美元,枪托卖30美元,枪管卖25美元
- 销售商每月至少要售出一枝完整的步枪,生产限额考虑到大多数销售商在一个月内可销售70个枪机、80个枪托和90个枪管
- 销售商在每访问一个镇子之后,给制造商发出电报,说明在那个镇子中售出的枪机枪托和枪管数量。到1月末,销售商要发出一封很短的电报,通知-1个枪机被售出
- 销售商的佣金为:
输出销售额 ≤1000元 佣金10%
1000 < 销售额 ≤1800 佣金=100+(销售额-1000)*15%
销售额 >1800 佣金=220+(销售额-1800)*20%
- 佣金程序生成月份销售报告,汇总售出的枪和枪管总数,销售商的总销售额,以及佣金
1. 按输入划分等价类
2. 按佣金值域划分等价类
输入 | 销售额 | 等价类 |
---|---|---|
枪机、枪托、枪管 | 销售额 ≤1000元 | 1 |
枪机、枪托、枪管 | 1000 < 销售额 ≤1800 | 2 |
枪机、枪托、枪管 | 销售额 >1800 | 3 |
测试用例 | 枪机(45) | 枪托(30) | 枪管(25) | 销售额 | 佣金 |
---|---|---|---|---|---|
1 | 5 | 5 | 5 | 500 | 50 |
2 | 15 | 15 | 15 | 1500 | 175 |
3 | 25 | 25 | 25 | 2500 | 360 |
根据输出域选择输入值,使落在输出域等价类内,可以结合弱健壮测试用例。
场景法
通过场景描述的业务流程,包括代码实现逻辑,设计用例来便利场景(路径),验证软件系统功能的正确性。(流程图:设计用例的依据)
使用场景:对项目的业务流程功能用例的设计
除了流程验证,要针对单步的功能进行测试(单个功能 + 流程 => 充分测试)
测试用例设计思路:
- 正例(正常流程):根据流程图列出从起点—>结束每个节点,作为表头(Vaild:有效V)
- 反例(异常流程):从起点开始,可能在某个节点结束或返回上一节点(Invaid:无效I)
场景 | 节点1 | 节点2 | 节点3 | 节4 | ...... | 预期结果 |
场景1 | V | V | V | V | ...... | 成功 |
场景2 | I | V | V | V | ...... | 结束流程 |
场景3 | V | I1 | V | V | ...... | 异常... |
场景4 | V | I2(不同异常) | V | V | ...... | 异常... |
场景5 | V | V | I | V | ...... | ...... |
场景6 | V | V | V | I | ...... | ...... |
...... | ...... | ...... | ...... | ............ | ...... | ...... |
因果图、判定表法
因果图和判定表一般配合使用,适用于“如果......则......”,即需求中存在多个条件,不同条件中存在不同结果的场景。
因(条件):
条件1:A、非A(分别存在Yes/No的场景,用Y,N表示)
条件2:B、非B(分别存在Yes/No的场景,用Y,N表示)
条件3:C、非C(分别存在Yes/No的场景,用Y,N表示)
果(结果):a、b、c、d(只存在4中结果)
判定表(初版):不同因子(纵列)组合起来对应不同结果
条件桩(因) | 条件项 | 条件项 | 条件项 | 条件项 | 条件项 | ...... |
A | Y | Y | Y | N | N | ...... |
B | Y | Y | N | N | Y | ...... |
C | Y | ...... | ||||
动作桩(果) | 动作项 | 动作项 | 动作项 | 动作项 | 动作项 | ...... |
a | √ | √ | √ | ...... | ||
b | ...... | |||||
c | √ | ...... | ||||
d | √ |
上表中前3组条件项对应的动作项一致,可合并条件项和动作项,得到简化判定表:
条件桩 | 条件项 | 条件项 | 条件项 | 条件项 |
A | Y | N | N | N |
B | Y | Y | N | |
C | Y | N | ||
动作桩 | 动作项 | 动作项 | 动作项 | 动作项 |
a | √ | |||
b | √ | |||
c | √ | |||
d | √ |
分析步骤
- 找出需求中的因子及结果
- 确定判定表的条件状和动作桩
- 列出所有条件项
- 根据条件项,画出对应的动作项,得到判定表
- 简化判定表(合并条件项、动作项):① 合并的项,动作项相同;② 合并的因子,在不同值的情况下,动作项的值不变
- 根据简化的判定表,针对每种条件项、动作项设计测试用例。
例:行李托运
航天公司规定,乘客可以免费托运30公斤的行李;
当重量超过30公斤时,对头等舱的国内乘客超重部分每公斤收费4元;
对其他舱的国内乘客超重部分6元每公斤;
对国外乘客收费多一倍;
对残疾乘客收费减半。
因:托运行李是否超过30公斤(Y,N)
是否头等舱(Y,N)
是否国内乘客(Y,N)
是否残疾乘客(Y,N)
果:免费托运(A)
超出部分每公斤收费4元(B)
超出部分每公斤收费6元(C)
头等舱国外非残疾乘客:4 * 2 = 8元,超出部分每公斤收费8元(D)
其他舱国外非残疾乘客:6 * 2 = 12元,超出部分每公斤收费12元(E)
头等舱国内残疾乘客:4 / 2 = 2元,超出部分每公斤收费2元(F)
其他舱国内残疾乘客:6 / 2 = 3元,超出部分每公斤收费3元(G)
头等舱残疾国外乘客:同B
其他舱残疾国外乘客:同C
判定表:
条件桩 | 条件项 | 条件项 | 条件项 | 条件项 | 条件项 | 条件项 | 条件项 | 条件项 | 条件项 |
托运行李是否超过30斤 | N(合并8种) | Y | Y | Y | Y | Y | Y | Y | Y |
是否头等舱 | Y | Y | Y | Y | N | N | N | N | |
是否国内乘客 | Y | Y | N | N | Y | Y | N | N | |
是否残疾乘客 | Y | N | Y | N | Y | N | Y | N | |
动作桩 | 动作项 | 动作项 | 动作项 | 动作项 | 动作项 | 动作项 | 动作项 | 动作项 | 动作项 |
A(免费) | √ | ||||||||
B(4元) | √ | √ | |||||||
C(6元) | √ | √ | |||||||
D(8元) | √ | ||||||||
E(12元) | √ | ||||||||
F(2元) | √ | ||||||||
G(3元) | √ |
正交试验法
因果关系比较庞大的情况下,不太适合用因果图判定表法设计测试用例,此时采用正交试验法(条件多、动作多、结果多),测试时可以网上搜索已有正交表。
例:字符属性设置,字体、字符样式、字体颜色、字号都有多种
正交表:
n:行数(组合次数),k:列数(因子个数),m:每个因子的取值个数(因子的状态数)
例:,有4个因子,每个因子取3种状态(并非只有3种),需要测试的组合数为9