思考: 任意输入三角形三边,判断能够构成三角形?
输入3个整数a、b、c构成三角形,设计测试用例数量。
假设在16位计算机上运行,则整数可能的取值是216,那么a、b、c三条边的各种可能组合大约有3*1013种,假设执行1次需要1ms,执行完所有的测试数据也需要1万年。
一、常用测试用例设计分析法
- 等价类分析法
- 边界值分析法
- 判定表分析法
- 因果图分析法
- 正交试验法
- 流程分析法(场景分析法)
- 状态迁移法
- 错误推测法
- 异常处理法
二、等价分析法
某个输入域的集合,在这个集合中每个输入条件都是等效的,如果其中一个的输入不能导致问题发生,那么集合中其他输入条件进行测试也不可能发现错误。
- 通常等价类划分为2种情况:
- 有效等价类:对程序规格说明有意义的、合理的输入数据;
- 无效等价类:对程序规格说明无意义的、不合理的输入数据;
- 划分的原则:
- 规定了输入值的范围或值的个数,可以定义一个有效等价类和两个无效等价类(如: 0<a<33或输入6~8个字符);
- 输入值为布尔值(如:真/假);
- 规定了输入数据的一组值(文化程度:初中、高中、大学);
- 规定了输入规则时,可以划分出一个有效的等价类(符合规则)和若干个无效等价类(从不同角度违反规则);
- 如果输入数据是一组值,且程序对不同的输入做不同处理,则每个允许的输入值是一个有效等价类,并有一个无效等价类;
- 等价类划分的步骤:
- 找输入条件;
- 为每个输入条件找有效、无效等价类;
- 为每个等价类编号;
- 用最少的用例覆盖最多的有效等价类,重复这一步骤直到覆盖完全;
- 每一个无效等价类都有一个用例;
- 并非所有有效等价类都有无效;
- 等价类的覆盖可以重复覆盖;
- 常见的能够划分等价类场景
- 数值范围
- 重复次数
- 字符串长度
- 字符串组中字符的个数
- 文件命名
- 文件大小
- 屏幕的颜色种类
- 超时时间;
- 等价类的优缺点
- 优点: 是考虑了单个输入域的各种情况,避免了盲目或随机选取输入数据的不完整性和覆盖的不稳定性;
- 缺点: 分法虽简单易用,但没有对组合情况进行充分的考虑。需要结合其他测试用例设计的方法进行补充;
案例1: QQ注册,密码输入框
案例2: 根据内容提炼需求写用例
现有一个档案管理系统,容许用户输入年月对档案文件进行检索,系统对查询条件年月的输入限定为1990年1月~2049年12月,并规定由6位数字字符组成,前4位表示年,后2位表示月;
案例3: 根据要求写用例
a、验证长度6~16个
b、不能包含空格
c、不能是9位以下纯数字
d、密码不能与名字相同
三、边界值分析法
边界值分析法是对等价类分析方法的一种补充, 所以边界值的条件落在等价类的边界上。
- 边界条件分析:
- 输入条件明确了一个值的取值范围,或规定了值的个数;
- 输入条件明确了一个有序集合;
- 边界点定义
- 上点: 边界上的点;
- 离点: 离上点最近的点,如果域的边界是封闭的,离点就在域范围外,如果域的边界值是开发的,离点就在域范围内;
- 内点: 顾名思义,就是在域范围内的任意一个点;
闭区间: [10,20] 即 10<=i<=20;
开区间: (5,8) 即 5<i<8;
- 边界值分析原则:
- 如果输入(输出)条件规定了取值范围,或是规定了值的个数,则应该以该范围的边界内及边界附近的值作为测试用例;
- 如果输入(输出)条件规定了值的个数,则用最大个数,最小个数,比最小个数少一,比最大个数多一的数作为测试数据;
- 如果程序规格说明中提到的输入或输出是一个有序的集合,应该注意选取有序集合的第一个或最后一个元素作为测试数据;
- 如果程序中使用了一个内部数据结构,则应当选择这个内部数据结构的边界上的值作为测试数据;
- 设计用例的步骤:
- 分析输入参数的类型: 从测试规格中分析得到输入参数类型;
- 等价类划分(可选): 对于输入等价类划分方法进行等价类的划分;
- 确定边界: 运用域测试分析方法确定域范围的边界(上点、离点、内点);
- 相关性分析(可选): 如果存在多个输入域,则需要运用因果图、判定表方法对这些输入域边界值的组合情况进行进一步分析;
- 形成测试项: 选择这些上点、离点、内点或者这些点的组合形成测试项;
- 边界值的优缺点
- 优点: 通用的测试设计方法,测试比较充分;
- 缺点: 效果换效率,用例多,细分程度取决于测试的人力和进度;
- 使用范围: 把输入条件划分成多个子条件,各个子条件之间相对是独立的,没有制约关系;
- 关键: 将输入背后的隐藏信息和条件挖掘出来;
案例:
万年历查询软件,要求用户输入以年月日表示的日期,然后系统会换算出该日期的农历表示法及相关黄历信息。假设日期限定在1900年1月1日~2049年12月31日,并规定日期由8位数字字符组成,前4位表示年,中间2位表示月,最后2位表示日期。其中4、6、9、11月只有30天,平年的2月份只有28天,闰年的2月份有29天。
四、判定表分析法
判定表分析法是分析和表达多种输入条件下系统执行不同动作的工具,它可以把复杂的逻辑关系和多种条件组合的情况表达的既具体又明确;
- 判定表的组成
- 条件桩: 列出了系统的所有输入,列出的输入次序无关紧要;
- 动作桩: 列出了系统可能采取的操作,这些操作的排序顺序没有约束;
- 条件项: 列出针对左列输入的取值,在所有可能情况下的真假值;
- 动作项: 列出输入项的各种取值情况下应该采取的动作;
-
判定表的合并
化简工作是以合并相似规则为目标的,如果表中有两条或多条规则具有相同的动作,并且其条件项之间存在极为相似的关系,我们便可以将其合并;
判定表设计步骤
- 找出条件桩与动作桩
- 找出每个条件计算规则格式
- 填入条件项、动作项(规则: 全组合)
- 合并简化(合并原则: 动作一致,条件项N-1个项目可以合并)
- 每一列为一个用例
- 判定表的适用场景
- 规格说明以判定表形式给出,或很容易装换成判定表;
- 条件的排列顺序不会也不影响执行哪些操作;
- 规则的排列顺序不会也不影响执行那些操作;
- 每当某一规则的条件已经满足,并确定要执行的操作后,不必检验别的规则;
- 如果某一规则得到满足要执行多个操作,这些操作的执行顺序无关紧要;
- 判定表的优缺点
- 优点: 它能把复杂的问题按各种可能的情况一一列举出来,简明而易于理解,也可避免遗漏;
- 缺点: 合并存在遗漏的风险。一个显然易见的原因是,虽然某个输入条件在输出接口上是无关的,但在软件设计上,内部针对这个条件走了不同的程序分支;
- 案例
案例1:若用户欠费或停机,则不允许主被叫
第一步:找出条件桩和动作桩
条件桩:用户欠费、用户停机
动作桩:可以主被叫
第二步:计算规则个数
2×2=4
第三步: 设计表将条件项、动作项填入
第四步: 简化合并
第五步: 生成用例(略)
案例2:
a. 如果觉得疲倦并且对书的内容感兴趣,同时书中的内容让你糊涂的话,回到本章重读;
b. 如果觉得疲倦并且对书的内容感兴趣,同时书中的内容不让你糊涂,继续读下去;
c. 不觉得疲倦并且对书的内容感兴趣,但是书中的内容让你糊涂的话,回到本章重读;
d. 如果觉得疲倦并且对书中的内容不感兴趣,同时书中的内容不让你糊涂,停止阅读,请休息;
e. 如果觉得疲倦并且对书的内容不感兴趣,并且书中的内容让你糊涂,请停止阅读,休息;
f. 不疲倦,对书的内容感兴趣,书中的内容不糊涂,继续读下去;
g. 不疲倦,不感兴趣,书中内容糊涂,跳到下一章去读;
h. 不疲倦,不感兴趣,书中内容不糊涂,跳到下一章去读;
案例3:
问题要求:"对功率大于50马力的机器,维修记录不全或已运行10年以上的机器,应给予优先的维修处理"这里假定“维修记录不全”和"优先维修处理"均已在别处有更严格的定义。请建立判定表。
案例4:
航空行李托运费的计算:按规定重量不超过30公斤的行李可免费托运,重量超过30公斤时,对超运部分进行收费,标准是头等舱国内乘客收取4元/公斤;其它舱位国内乘客收取6元/公斤;国外乘客收费为国内乘客的2倍;残疾乘客的收费为正常乘客的一半。
五、流程分析法(场景分析法)
流程分析主要是针对测试场景类型的,流程分析是将软件系统的某个流程看成路径,用路径分析的方法来设计测试用例。根据流程的顺序依次进行组合,使得流程的各个分支都能走到。这是从白盒测试中路径覆盖分析法中推广到黑盒测试中来的测试分析方法。
- 场景分析法步骤
- 画出业务流程图(描述正常流程和异常流程)
- 确定条件分支(设计路径的优先级)
- 确定测试路径(考虑路径覆盖率)
- 选择数据构造用例(选数据要结合等价类、边界值分析)
- 案例
1、用户登录网站进行文献检索
2、查找到自己需要的文献后就对文献进行订购
3、用户确认订购后,系统自动生成订单(此时订单的状态为“未处理”)
4、对于未处理的订单用户可以进行撤销
5、后台订单管理员查看到“未处理”的订单后,和用户确认订购事项后,对该订单进行处理
6、首先接受该订单
7、然后核对订单的信息及所需文献内容,进行订单的处理
8、将用户订购的文献打印后,装订成册,打印出投递清单,并邮寄给用户
9、订单被接受后,管理员可以随时将订单修改为错误状态
备注:
- 练习
1、针对ATM机的取款流程进行测试;
2、淘宝购物
六、状态迁移法
状态转换图是对特定系统需求设计测试用例的工具之一,它描述了测试对象和测试数据之间的关系。测试对象的输入行为不仅仅和当前的输入数据有关,而且和测试对象当前的状态有关。状态转换图是设计状态转换测试用例的基础,基于状态转换图进行的测试就是状态转换测试;
- 通过构造能导致状态迁移的事件来测试状态之间的转换,常用语协议测试;
- 用这种方法可以设计逆向的测试用例,如状态和事件的非法组合;
- 状态迁移图步骤
- 画出状态迁移图
- 列出状态 --- 事件表
- 通过状态迁移图转做出状态转换树
- 从状态住转换树推到出测试路径
- 根据测试路径编写合法测试用例
- 编写非法测试用例
- 案例
1、向航空公司打电话预定机票 -> 此时机票信息出于"完成"状态
2、顾客支付了机票费用后 -> 机票信息就变为"已支付"状态
3、旅游当天到达机场后,打印机票后 -> 机票信息就变为"已出票"状态
4、登记检票后 -> 机票信息就变为"已使用"状态
5、在登上飞机之前任何时间可以取消自己的订票信息,如果已经支付了机票的费用,则还可以得到退款,取消后 -> 订票信息处于"已被取消"状态
- 练习
练习1 --- 电话系统
- 空闲: 电话初始状态
- 响拨号音: 拿起电话,未拨号,系统响拨号音
- 拨号中: 输入号码状态
- 连接中: 号码完毕,等待连接的状态
- 响铃: 线路通后,响铃的状态
- 通话: 对方拿起电话状态
- 断开: 对方挂断或已方挂断
- 超时状态: 拿起电话,一直未拨号
- 忙音: 拨打对方电话占线状态
- 播放录音: 拨号错误,系统状态
练习2 --- 打印机
- 打印机开启后,进入就绪态,同时就绪灯亮
- 如果收到打印命令后,将进行打印,在打印过程中如果缺纸,将停止打印,缺纸指示灯亮,放入纸张后恢复打印
- 如果打印过程中出现故障,将停止打印,故障指示灯亮,故障修复后继续打印
- 打印完成后,打印机进入就绪状态,同时就绪指示灯亮
七、错误推测法
错误猜测法,根据经验猜想可能有什么问题并依此设计测试用例。错误猜测法只能作为测试设计的补充而不能单独用来设计测试用例,否则可能会造成测试的不充分。
-
常见的错误推测法
优缺点
错误推测法不是一种系统的测试方法,所以只能用作辅助手段,即先用其他方法设计测试用例,再用此方法补充一些例子。
- 优点: 测试者能够快速且容易地切入,并能够体会到程序的易用与否;
- 缺点: 难以知道测试的覆盖率,可能丢失大量未知的区域,并且这种测试行为带有一定的主观性。况且,如果外部特性本身设计有问题或规格说明书的规定有误,此测试方法是发现不了的;
- 案例
测试计算平方根的函数 为例,假如在界面文本框中进行x值的输入。
根据题意,可知x要求为非负数,且是数字。可设计错
误推断的测试用例:
x为负数,如:-2
x为非数字,如:a, $等
x为0的情况。
针对不合法的输入,系统能否给出必要的判断提示信息?
八、异常处理法
系统异常分析法就是针对系统有可能存在的异常操作、软硬件缺陷引起的故障进行分析,依此设计测试用例。主要针对系统的容错能力、故障恢复能力进行测试。
九、因果图分析法
因果图提供了一个把规格转化为判定表的系统化方法,从该图中可以产生测试数据。其中,原因是表示输入条件,结果是对输入执行的一系列计算后得到的输出。
因果图方法最终生成的就是判定表。它适合于检查软件输入条件的各种组合情况。
-
因果图符号
-
约束符号
因果图的步骤
- 把大的系统规格划分解成可以测试的规格片段
- 分析分解后待测的系统规格,找出哪些是原因,哪些是结果,可以见助中间件
- 画出因果图
- 把因果图转换成判定表
- 简化判定表
- 用判定表中的每一项生成测试用例
-
案例
经典的因果图案例: 一个处理单价为5角钱的饮料的自动售货机。
其规格说明如下: 若投入5角钱或1元钱的硬币,押下〖橙汁〗或〖啤酒〗的按钮,则相应的饮料就送出来。若售货机没有零钱找,则一个显示〖零钱找完〗的红灯亮,这时在投入1元硬币并押下按钮后,饮料不送出来而且1元硬币也退出来;若有零钱找,则显示〖零钱找完〗的红灯灭,在送出饮料的同时退还5角硬币。
因果图转换判定表的方法:
将因果图中的所有条件(因)填入判定表的条件桩中;
将因果图中的所有动作(果)填入判定表的动作桩中;
根据因果图确定各个条件组合对应的动作,并且确定判定表中各个规则的条件项和动作项,在需要时优化判定表。
因果图的优点缺点
- 优点:
等价类法尽管各个输入条件可能出错的情况都考虑到了,但是多个输入条件组合起来出错的情况却被忽略了;
因果图法能够帮助我们按一定步骤,高效的选择测试用例,设计多个输入条件组合用例;
因果图分析还能为我们指出,程序规格照说明描述中存在什么问题; - 缺点:
输入条件与输出结果的因果关系,有时难以从软件需求规格说明书得到;
即使得到了这些因果关系,也会因为因果关系复杂导致因果图非常庞大,测试用例数目及其庞大;
十、正交试验法
正交试验设计法,是从大量的试验点中挑选出适量的、有代表性的点,应用依据迦罗瓦理论导出的“正交表”,合理的安排试验的一种科学的试验设计方法。
正交常用的术语:
- 指标:通常把判断试验结果优劣的标准叫做试验的指标
- 因子:所有影响试验指标的条件
- 因子的状态:影响试验因子的取值,叫做因子的状态
- 正交表表示形式: Lr(mn)或Lr(mn,pq)
N、 Q代表因子数,即正交表中的列
M、P代表水平数也称状态,单个因子取的最大数
R代表行数,正交表中行的数量,即测试用例数
行数的计算r=(m-1)*n+1或r=(m-1)*n+(p-1)*q+1
- 正交分析步骤:
- 提取功能说明,构造因子-状态表加权筛选,生成因素分析表
- 计算各因子和状态的权值,删去一部分权值较小,即重要性较小的因子或状态,使最后生成的测试用例集缩减到允许范围
- 利用正交表构造测试数据集
- 如果各个因子的状态数是不统一的,几乎不可能出现均匀的情况。必须首先用逻辑命令来组合各因子的状态,作出布尔图
- 根据布尔图查找最接近的相应阶数的正交表
- 依照因果图上根节点到叶子节点的顺序逐步替换正交表上的中间节点,得到最终的正交表
- 利用正交表每行数据构造测试用例
- 正交实际应用
- 单个功能测试:每个输入是因子,每个输入的取值是状态
- 功能组合测试:每个功能是因子,是否包含功能是状态,也就是每个功能2个状态。比如手机有多个功能:接听电话、接收短信、游戏、音乐、拍照等
- 配置测试:每个配置项是因子,每个具体配置是状态。比如针对CPU测试,需要考虑CPU与主板、内存、显卡、声卡等组合到一起能不能正常工作
正交的原则:两两组合!
十一、总结
- 使用各种测试方法
- 在任何情况下都必须使用边界值分析方法,经验表明用这种方法设计出测试用例发现程序错误的能力最强;
- 必要时用等价类划分方法补充一些测试用例;
- 用错误推测法再追加一些测试用例,依靠经验;
- 如果程序的功能说明中含有输入条件的组合情况,则一开始就可选用因果图;
- 对业务流程场景清晰的系统,使用流程分析贯穿这个测试案例的过程;
- 检查已设计的测试用例的覆盖程度;
- 最后要考虑异常分析,在进行综合使用。
- 测试用例的设计步骤
- 构造根据设计规格得出的基本功能测试用例
- 边界值测试用例
- 状态转换测试用例
- 错误猜测测试用例
- 异常测试用例
- 性能测试用例
- 压力测试用例
- 优化测试用例的方法
- 利用设计测试用例的8种方法不断的对测试用例进行分解与合并
- 采用遗传算法理论进化测试用例
- 在测试时利用发散思维构造测试用例