测试用例设计(四)
针对测试场景类型属于流程测试场景的测试项下的测试子项,先从其最基本的流程入手,将流程抽象成为不同单功能点的顺序执行。在最基本流程的基础上再去考虑次要或者异常的流程,这样将各种流程逐渐细化,最后完成完整的针对该测试子项的流程图,如下图。这样既可以逐渐加深对流程的理解,还可以将各个看似孤立的流程关联起来。
本周分享《测试用例设计》实验内容,由于知识含量较多,现在拆分为多篇分享,今日是第一篇。
回顾前期内容,请点击:
实 验 简 介
本实验主要讲解测试用例设计方法,包括等价类,边界值,正交试验表,判定表,流程分析法,状态迁移法,错误猜测等。
实 验 目 的
(1)、掌握测试用例设计方法,以便设计高效的测试用例。
实 验 流 程
4.流程分析法
什么是流程分析法
流程分析法主要针对测试场景类型属于流程测试场景的测试项下的测试子项进行设计,这是从白盒测试中路径覆盖分析法借鉴过来的一种很重要的方法。
白盒测试中,路径就是指函数代码的某个分支组合,路径覆盖法需要我们构造足够的用例覆盖函数的所有代码路径。
在黑盒测试中,如果我们将软件系统的某个流程也看成路径的话,我们将可以尝试着用路径分析的方法来设计测试用例。
采用路径分析的方法设计测试用例有两点好处:
一是降低了测试用例设计的难度,只要搞清了各种流程,就可以设计出高质量的测试用例来,而不用太多测试方面的经验;
二是在测试时间较紧的情况下,可以有的放矢的选择测试用例,而不用完全根据经验来取舍。
如何使用流程分析法
步骤1:画出业务流程图
针对测试场景类型属于流程测试场景的测试项下的测试子项,先从其最基本的流程入手,将流程抽象成为不同单功能点的顺序执行。在最基本流程的基础上再去考虑次要或者异常的流程,这样将各种流程逐渐细化,最后完成完整的针对该测试子项的流程图,如下图。这样既可以逐渐加深对流程的理解,还可以将各个看似孤立的流程关联起来。

画流程图时需要注意:
(1)圆圈描述系统状态,箭头描述该状态下的输入或外部因素(条件)引起的状态迁移;
(2)需要描述正常流程和异常流程;
(3)若功能流程中涉及到多个实体的,可以画到一个流程图中,在圆圈或箭头的描述部分对属于哪个实体进行说明;
(4)对于与被测试子项无关的分支不需要考虑。
步骤2:定义状态节点和条件分支
顺着功能流程,针对被测试特性的每一状态节点分析其输入、下一状态节点、输出,并填写下表:
状态编号 | 状态描述 | 输入(条件)编号 | 输入(条件)描述 | 下一状态编号 | 输出 | 输入(条件)分支优先级 |
(1)分析过程是针对功能流程中的各个状态分别分析的;
(2)输入需要考虑与被测试对象的各个接口,输入可能是外部用户输入、系统内部定时触发、周边系统输入等;
(3)输入的分析需要详细到参数级别;
(4)对系统处理的分析过程中,需要全面考虑处理过程用到哪些资源,查过哪些表格,对用户状态做过哪些判断等。这些关键点如果是外部可控的,都可以列入到输入中去;
(5)输出是观察点的重要依据,表示系统沿流程分支处理业务时的输出,包括消息输出、后台输出、本地数据记录等
(6)对于系统不处理的输入,或没有必要测试的输入,在表中标出
注:在分析过程中,会发现存在状态是在其它功能流程中已经分析过的,那么不需要重复分析。
分支优先级根据两个原则来选取:一是分支使用的频率,使用越频繁的优先级越高;二是分支的重要程度,如果失败对系统影响越大的优先级越高。将根据两个原则所得到的路径各分支的优先级相加就得到了整个路径的优先级。
步骤3:确定测试路径
步骤2确定了每个分支的优先级后,将组成路径的各分支的优先级相加就得到了路径的优先级。给每条路径设定优先级,这样在测试时就可以先测优先级高的,再测优先级低的,在时间紧迫的情况下甚至可以考虑忽略一些低优先级的路径。根据优先级的排序就可以更有针对性的进行测试。
根据每条路径的优先级和测试进度情况,选取需要测试的路径,达到规定的路径覆盖率。这里每条路径对应一个或几个测试用例规格。将测试用例规格填入下表:
用例编号 | 测试用例 | 覆盖路径 | 覆盖的样点 |
其中“覆盖路径”指该用例覆盖的路径的分支序列;“覆盖的样点”指该分支序列上某个或某几个状态点的输入的等价类点或边界点(可不填)
通常对于有向图,采用基本路径覆盖法,对于每条基本路径规划一个用例对其进行覆盖。这里需要了解这么几个概念:
(1)环路复杂度:有向图的闭合区域数+1;
(2)基本路径:至少包含有一条在其它基本路径中从未有过的边的路径;
(3)基本路径数=环路复杂度。
这里计算环路复杂度(圈数)时,入口点要求入度(进入分支数)为0,出度(出发分支数)为1;出口点要求出度为0,入度为1。如果入口点不符合入度、出度要求(如下图),可以在入口点之上增加一个节点作为纯入口节点;出口点也可进行类似处理。经过上述处理后,入口点、出口点不会既可能出现在路径首末端,又可能出现在路径中间。

进行了如上处理后,再分析该有向图的基本路径。按基本路径的定义-至少包含有一条在其它基本路径中从未有过的边的路径,这个定义很容易产生歧义。这里参考线性空间的概念来理解,基本路径相当于所有路径空间(当有循环、为有向有环图时,路径数可能为无穷)的一组基,即路径空间的其他任意路径都可以由这些基本路径组合而成(这里的组合需要理解成向量基的四则运算,只能沿路径的正向和逆向进行运算)。如果一个路径可以由已有基本路径组合而成,则这个路径不是一条基本路径。
例如在某个有向图中,有两个循环,其基路径为:
路径1:1-2-4-6-7
路径2:1-2-3-2-4-6-7
路径3:1-2-4-6-5-6-7
有条路径4:1-2-3-2-4-6-5-6-7,路径4不为基路径。因为:路径4-路径2=5-6,路径3-路径1=5-6,所以:路径4=路径2+路径3-路径1
步骤4:选取测试数据,构造测试用例
对选定的每条需要测试的路径,结合等价类、边界值,确定每个状态节点的输入,沿着该路径通过表格将各种测试数据的输入输出对应起来,这样就完成了测试用例的设计。编写完全的用例填入下表:
编号 | 测试用例 | 覆盖路径 | 覆盖样点 | 优先级 | 预置条件 | 步骤编号 | 输入 | 输出 |
案例
针对ATM取款机的取款流程进行测试。

对应的需求如下:
1.用户向ATM提款机中插入银行卡,如果银行卡是合法的,ATM提款机界面提示用户输入提款密码;
如果插入无效的银行卡,那么,在ATM提款机界面上提示用户“您使用的银行卡无效!”,3秒钟后,自动退出该银行卡;然后,使用其他的有效的银行卡可以正常取款;
2. 用户输入该银行卡的密码,ATM提款机与MainFrame传递密码,检验密码的正确性。如果输入密码正确,提示用户输入取钱金额,提示信息为,“请输入您的提款额度”;
如果用户输入的密码错误,则提示用户“您输入的密码无效,请重新输入”,恢复到用户登录输入密码的界面;
如果用户连续3次输入错误密码,ATM提款机吞卡,并且ATM提款机的界面恢复到初始界面。此时,其他提款人可以继续使用其他的合法的银行卡在ATM提款机上提取现金。
3. 用户输入取钱金额,系统校验金额正确,提示用户确认,提示信息为“您输入的金额是xxx,请确认,谢谢!”,用户按下确认键,确认需要提取的金额;
如果用户输入的单笔提款金额超过单笔提款上限,ATM提款机界面提示“您输入的金额错误,单笔提款上限金额是1500RMB,请重新输入”;
如果用户输入的单笔金额,不是以100RMB为单位的,那么提示用户“您输入的提款金额错误,请输入以100为单位的金额”;
如果用户在24小时内提取的金额大于4500RMB,则ATM提款机提示用户,“24小时内只能提取4500RMB,请重新输入提款金额”输入提取的金额超过了系统的设定的限制;
如果ATM提款机中余额不足,则提示用户,“抱歉,ATM提款机中余额不足”,恢复到用户登录之后的界面,可以重新输入取钱金额;
4. 系统同步银行主机,点钞票,输出给用户,并且减掉数据库中该用户帐户中的存款金额。
如果用户银行户头中的存款小于提款金额,则提示用户“抱歉,您的存款余额不足!”,恢复到用户登录之后的界面,可以重新输入取钱金额;
如果ATM提款机与MainFrame之间通讯超时10秒钟,则本次操作取消,提示用户“抱歉,链接超时,本次操作取消”,并且将银行卡退出;
5. 用户提款,银行卡自动退出,用户取走现金,拔出银行卡,ATM提款机界面恢复到初始状态;
如果用户没有取走现金,或者没有拔出银行卡,ATM提款机告警装置开始蜂鸣;用户取走银行卡后,蜂鸣停止;可以继续使用其他银行卡取款;
一、根据以上需求,画出业务流程图
业务流程图中包含ATM的提示信息以及用户的操作,后者对应测试用例中的测试步骤部分,而前者对应测试用例中的预期输出部分,比如插入卡,且卡合法的预期输出是ATM提示输入密码。
二、确定测试的路径
有了业务流程图就很容易确定测试路径,也就是需要测试的业务流程了,主要包含3类:
1. 基本的:对应一次性取款成功。
2. 分支的:对应取款失败,包含退卡和吞卡。
3. 循环的:对应中间出现意外,比如密码输出错误,但最终取款成功。
三、进行测试用例的设计
针对每条路径设计1个测试用例即可,因为目的是验证流程是否正确。下面是部分测试用例。


总结
流程分析法的重点在测试流程,因此每个流程用一个测试用例验证即可,流程测试没有问题并不能说明系统功能就没有问题了,还需要针对单步的功能来进行测试,只有这两者都测试到了,才能算是比较充分的测试。
下周分享:测试用例设计(五)
为了答谢大家对蜗牛学院的支持,蜗牛学院将会定期对大家免费发放干货,敬请关注蜗牛学院的官方微信。