软件测试系列三《测试用例编写原则与设计方法》
Posted 再见孙悟空_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件测试系列三《测试用例编写原则与设计方法》相关的知识,希望对你有一定的参考价值。
1. 概述
1.1. 目的
1.2. 使用范围
2.1. 系统性
2.2. 连贯性
2.3. 全面性
2.4. 正确性
3.3. 判定表法
3.4. 因果图法
1.概述
1.1. 目的
统一测试用例编写的规范,为测试设计人员提供测试用例编写的指导,提高编写的测试用例的可读性,可执行性、合理性。为测试执行人员更好执行测试,提高测试效率,最终提高公司整个产品的质量。
1.2. 使用范围
适用于对产品/项目的业务流程、功能测试用例的编写。
2. 测试用例编写原则
2.1. 系统性
a) 对于系统业务流程要能够完整说明整个系统的业务需求、系统由几个子系统组 成以及它们之间的关系;
b) 对于模块业务流程要能够说明清楚子系统内部功能、重要功能点以及它们之间的关系;
2.2. 连贯性
a) 对于系统业务流程来说,各个子系统之间是如何连接在一起,如果需要接口,各个 子系统之间是否有正确的接口;如果是依靠页面链接,页面链接是否正确;
b) 对于模块业务流程来说,同级模块以及上下级模块是如何构成一个子系统,其内部 功能接口是否连贯;
2.3. 全面性
a) 应尽可能覆盖程序的各种路径
b) 应尽可能覆盖系统的各个业务
c) 应考虑存在跨年、跨月的数据
d) 大量数据并发测试的准备
e) 系统中各功能、业务的异常情况
2.4. 正确性
a) 输入用户实际数据以验证系统是否满足需求规格说明书的需求。
b) 测试用例中的测试点应保证至少覆盖需求规格说明书中的各项功能。
2.5. 符合正常业务惯例
a) 测试数据应符合用户实际工作业务流程
b) 兼顾各种业务变化的可能
c) 要符合当前业务行业法律,法规。
3. 系统测试用例设计方法
3.1. 等价类划分法
何为等价类,某个输入域的集合,在这个集合中每个输入条件都是等效的,如果其中一个的输入不能导致问题发生,那么集合中其它输入条件进行测试也不可能发现错误。
等价类分为有效等价类和无效等价类,有效等价类就是由那些对程序的规格说明有意义的、合理的输入数据所构成的集合;无效等价类就是那些对程序的规格说明不合理的或无意义的输入数据所构成的集合。
划分等价类的方法:下面给出六条确定等价类的原则。
a) 在输入条件规定了取值范围或值的个数的情况下,则可以确立一个有效等价类和两个无效等价类。
b) 在输入条件规定了输入值的集合或者规定了“必须如何”的条件的情况下,可确立一个有效等价类和一个无效等价类。
c) 在输入条件是一个布尔量的情况下,可确定一个有效等价类。
d) 在规定了输入数据的一组值(假定n个),并且程序要对每一个输入值分别处理的情况下,可确立n个有效等价类和一个无效等价类。
e) 在规定了输入数据必须遵守的规则的情况下,可确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。
f) 在确知已划分的等价类中各元素在程序处理中的方式不同的情况下,则应再将该等价类进一步的划分为更小的等价类。
根据等价类划分原则,将等价类填入下表。
等价类表
输入条件 | 有效等价类 | 无效等价类 |
根据等价类表,然后从划分出的等价类中按以下三个原则设计测试用例:
a) 为每一个等价类规定一个唯一的编号。
b) 2、设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖地有效等价类,重复这一步,直到所有的有效等价类都被覆盖为止。
c) 3、设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步,直到所有的无效等价类都被覆盖为止。
举例:
拿PowerPoint的打印功能界面做例子,用等价类方法,划分等价类。
根据原则划分等价类,填入等价类表。
输入条件 | 有效等价类 | 无效等价类 |
打印机名称 | 可选择的打印机 | |
打印到文件 | TRUE、FALSE | |
打印范围 | 全部、当前幻灯片、幻灯片 | |
幻灯片 | 不大于幻灯片总数的自然数集合 | 小于1的整数 |
打印份数 | [1,32767] | 小于1的整数,大于32767的整数 |
逐份打印 | TRUE、FALSE | |
打印内容 | 幻灯片、讲义、备注页、大纲视图 | |
颜色/灰度 | 颜色、灰度、纯黑白 | |
每页幻灯片数 | 1、2、3、4、6、9 | 除了1、2、3、4、6、9以外 整数 |
顺序 | 水平、垂直 | |
根据纸张调整大小 | TRUE、FALSE | |
幻灯片加框 | TRUE、FALSE |
测试用例略。等价类划分是最常用的方法,通常和边界值分析法一起用,在下面的流程分析法里,我会将等价类、边界值和流程分析法一起举例,一起写测试用例。
3.2. 边界值分析法
测试经验丰富的前辈们告诉我们,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围的内部。因此针对个中边界情况设计测试用例,可以查处更多的错误。
首先来了解一下边界点的定义,边界点分为上点、内点和离点。如图:
结合上面的图示。
上点,就是边界上的点,不管它是开区间还是闭区间,就是说,如果该点是封闭的,那上点就在域范围内,如果该点是开放的,那上点就在域范围外;
内点,就是在域范围内的任意一个点;
离点,就是离上点最近的一个点,如果边界是封闭的,那离点就是域范围外离上点最近的点,如果边界是开放的,那离点就是域范围内离上点最近的点。
现在大家都知道边界点了,那接下来就讲一下,边界值分析方法的原则:
a) 如果输入(输出)条件规定了取值范围,则应该以该范围的边界值及边界附近的值作为测试数据;
b) 如果输入(输出)条件规定了值的个数,则用最大个数,最小个数,比最小个数少一,比最大个数多一的数作为测试数据;
c) 如果程序规格说明书中提到的输入或输出是一个有序的集合,应该注意选取有序集合的第一个和最后一个元素作为测试数据;
d) 如果程序中使用了一个内部数据结构,则应当选择这个内部数据结构的边界上的值作为测试数据。
举例:
闭区间[50,100]的上点为50和100,离点是49和101,在域范围内的都是内点;
半开半闭区间(50,100]的上点为50和100,离点是51和101,在域范围内的都是内点;
开区间(50,100)的上点为50和100,离点是51和99,在域范围内的都是内点;
测试用例略。在下面的流程分析法里,我会将等价类、边界值和流程分析法一起举例,一起写测试用例。
3.3. 判定表法
现在我们先讲判定表法,再讲因果图法,因为判定表法经常和因果图法一起用,先进行因果图分析,再结合判定表,最后完成测试用例。
在多个条件决定多个动作,并且每个条件的取值只有两种情况下,我们就可以采用因果图和判定表方法。
注:条件和动作之间的逻辑关系是明确的,可以直接使用判定表法;如果条件和动作关系不明确,则要先使用因果图法。
判定表通常由四部分组成,如图:
每一个部分之间用双线或粗条线分开,左上部称条件桩,它列出决定一组条件的对象;右上部称条件项,它列出各种可能的条件组合;左下部称动作桩,它列出所有的操作,右下部为动作项,它列出在对应的条件组合下的动作。
表的右部一般有很多列。
举例:
订购单的检查。如果金额超过500元,又未过期,则发出批准单和提货单;如果金额超过500元,但过期了,则不发批准单;如果金额低于500元,则不论是否过期都发出批准单和提货单,在过期的情况下还需要发出通知单。
将这段需求进行判定表分析,可以得到如下判定表。
金额 | >500 | >500 | <=500 | <=500 |
状态 | 未过期 | 已过期 | 未过期 | 已过期 |
发出批准单 | O | O | O | |
发出提货单 | O | O | O | |
发出通知单 | O |
在很多情况下,一个判定表写出来以后,是很复杂的,我们需要对其进行简化。如果表中有两条或多条规则具有相同的动作,并且其条件项之间存在极为相似的关系,我们就可以将其合并。
比如表中,条件:>500、未过期;<=500、未过期。这两个条件项导致的结果是一样的,并且条件项之间很相似,我们就可以将它们合并。结果如下:
金额 | >500 | <=500 | |
状态 | 未过期 | 已过期 | 已过期 |
发出批准单 | O | O | |
发出提货单 | O | O | |
发出通知单 | O |
这里在引入一个概念,规则,以上判定表里,右部的每一列(条件项和对应的动作项)都是一条规则。以上判定表里每一条规则都可以转化为测试用例。
用例:
1、
测试用例编号 | ORDER_ST_CHECK_001 |
测试项目 | 订购单的检查 |
测试标题 | 状态为未过期 |
重要级别 | 高 |
预置条件 | 无 |
输入 | 499 |
操作步骤 | 1、 输入金额:499 2、 选择未过期 3、 点击确定 |
预期输出 | 发出批准单和提货单 |
2、
测试用例编号 | ORDER_ST_CHECK_002 |
测试项目 | 订购单的检查 |
测试标题 | 金额>500,状态为已过期 |
重要级别 | 中 |
预置条件 | 无 |
输入 | 501 |
操作步骤 | 1、输入金额:501 2、选择已过期 3、点击确定 |
预期输出 | 批准单、提货单和通知单都不发出 |
3、
测试用例编号 | ORDER_ST_CHECK_003 |
测试项目 | 订购单的检查 |
测试标题 | 金额<=500,状态为已过期 |
重要级别 | 中 |
预置条件 | 无 |
输入 | 499 |
操作步骤 | 1、输入金额:499 2、选择已过期 3、点击确定 |
预期输出 | 发出批准单、提货单和通知单 |
3.4. 因果图法
接下来我们讲因果图法。前面说过在多个条件决定多个动作,并且每个条件的取值只有两种情况下,我们就可以采用因果图和判定表方法。
因果图法就是从程序规格说明书的描述中找出因(输入条件)和果(输出或程序状态的改变),通过因果图转换为判定表,最后为判定表中的每一列设计一个测试用例。
首先我们来了解一下因果图的基本符号,我会在边上加些注解以帮助大家理解。
接着我们讲一下使用因果图法的步骤:
1、根据程序规格说明书描述的语义内容,分析并确定“因”和“果”,将其表示成连接各个原因与各个结果的“因果图”。需要注意的是,由于语法或环境的限制,某些原因和结果的组合情况是不可能出现的。为表明这些特定的情况,需要在因果图上使用若干个约束符号来标明约束条件;
2、将得到的因果图转换成判定表;
3、为判定表中每一列所表示的情况设计一个测试用例。
对于较为复杂的问题,这个方法常常是十分有效的。具体我们来举个例子来讲,可以更好的理解。
举例:
以中国象棋中马的走法为例子,具体说明:
1、如果落点在棋盘外,则不移动棋子;2、如果落点与起点不构成日字型,则不移动棋子;3、如果落点处有自己方棋子,则不移动棋子;4、如果在落点方向的邻近交叉点有棋子(绊马腿),则不移动棋子;5、如果不属于1-4条,且落点处无棋子,则移动棋子;6、如果不属于1-4条,且落点处为对方棋子 (非老将) ,则移动棋子并除去对方棋子;7如果不属于1-4条,且落点处为对方老将,则移动棋子,并提示战胜对方,游戏结束。
对说明进行分析,得到原因和结果:
原因:
1、 落点在棋盘外;
2、 不构成日字;
3、 落点有自方棋子;
4、 绊马腿;
5、 落点无棋子;
6、 落点为对方棋子;
7、 落点为对方老将。
结果:
1、 不移动;
2、 移动;
3、 移动己方棋子消除对方棋子;
4、 移动并战胜对方。
根据分析出来的原因和结果,我们可以画出因果图,如下:
画得不好,比较乱,大家请见谅。我只加了些必要的约束条件,还有一些没有加,不过后面会讲的。
11这个结点称做中间结点,是为了让因果图的结构更加明了,简化因果图导出的判定表。分析得出以下两个结论。只有1、2、3、4都不成立时,产生11,跟5、6、7结合分别得出22、23、24三个结果;不管5、6、7哪个成立,只要1、2、3、4有一个成立,就产生结果21;再加上落点有自方棋子的状况。可以得到判定表如下:
条件 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
3 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | |
5 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | |
6 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | |
7 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | |
中间结果 | 11 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
结果 | 21 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | ||||||
22 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | |||||||
23 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | |||||||
24 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
进一部分析,将各种不可能产生的组合情况,取消掉,我用灰色表示出来了。这些都是之前没有写的一些约束条件导致的。比如落点在棋盘外,那么落点就不可能在对方棋子上了。
最后将判定表内的规则转换成测试用例。
用例:
1
测试用例编号 | CHINESECHESS_ST_MOVE_MA_001 |
测试项目 | 象棋马的移动 |
测试标题 | 条件1-4不成立,移动马,落点是对方老将 |
重要级别 | 高 |
预置条件 | 无 |
输入 | 点击马,点击棋子的落点 |
操作步骤 | 1、点击自方马; 2、点击对方老将。 |
预期输出 | 移动棋子并提示战胜对方。 |
2
测试用例编号 | CHINESECHESS_ST_MOVE_MA_002 |
测试项目 | 象棋马的移动 |
测试标题 | 条件1-4不成立,移动马,落点是对方棋子(非老将) |
重要级别 | 中 |
预置条件 | 无 |
输入 | 点击马,点击棋子的落点 |
操作步骤 | 1、点击自方马; 2、点击对方棋子。 |
预期输出 | 移动棋子并除去对方棋子。 |
3
测试用例编号 | CHINESECHESS_ST_MOVE_MA_003 |
测试项目 | 象棋马的移动 |
测试标题 | 条件1-4不成立,移动马,落点无棋子 |
重要级别 | 中 |
预置条件 | 无 |
输入 | 点击马,点击棋子的落点 |
操作步骤 | 1、点击自方马; 2、点击无棋子的落点。 |
预期输出 | 移动棋子。 |
4
测试用例编号 | CHINESECHESS_ST_MOVE_MA_004 |
测试项目 | 象棋马的移动 |
测试标题 | 绊马腿,落点为对方老将 |
重要级别 | 中 |
预置条件 | 无 |
输入 | 点击马,点击棋子的落点 |
操作步骤 | 1、点击自方马; 2、点击对方老将。 |
预期输出 | 不移动棋子。 |
5
测试用例编号 | CHINESECHESS_ST_MOVE_MA_005 |
测试项目 | 象棋马的移动 |
测试标题 | 绊马腿,落点为对方棋子(非老将) |
重要级别 | 中 |
预置条件 | 无 |
输入 | 点击马,点击棋子的落点 |
操作步骤 | 1、点击自方马; 2、点击对方棋子。 |
预期输出 | 不移动棋子。 |
6
测试用例编号 | CHINESECHESS_ST_MOVE_MA_006 |
测试项目 | 象棋马的移动 |
测试标题 | 绊马腿,落点无棋子 |
重要级别 | 中 |
预置条件 | 无 |
输入 | 点击马,点击棋子的落点 |
操作步骤 | 1、点击自方马; 2、点击无棋子落点。 |
预期输出 | 不移动棋子。 |
7
测试用例编号 | CHINESECHESS_ST_MOVE_MA_007 |
测试项目 | 象棋马的移动 |
测试标题 | 落点为自方棋子 |
重要级别 | 中 |
预置条件 | 无 |
输入 | 点击马,点击棋子的落点 |
操作步骤 | 1、点击自方马; 2、点击自方棋子。 |
预期输出 | 不移动棋子。 |
8
测试用例编号 | CHINESECHESS_ST_MOVE_MA_008 |
测试项目 | 象棋马的移动 |
测试标题 | 不构成日字,落点为对方老将 |
重要级别 | 中 |
预置条件 | 无 |
输入 | 点击马,点击棋子的落点 |
操作步骤 | 1、点击自方马; 2、点击对方老将。 |
预期输出 | 不移动棋子。 |
9
测试用例编号 | CHINESECHESS_ST_MOVE_MA_009 |
测试项目 | 象棋马的移动 |
测试标题 | 不构成日字,落点为对方棋子(非老将) |
重要级别 | 中 |
预置条件 | 无 |
输入 | 点击马,点击棋子的落点 |
操作步骤 | 1、点击自方马; 2、点击对方棋子。 |
预期输出 | 不移动棋子。 |
10
测试用例编号 | CHINESECHESS_ST_MOVE_MA_010 |
测试项目 | 象棋马的移动 |
测试标题 | 不构成日字,落点无棋子 |
重要级别 | 中 |
预置条件 | 无 |
输入 | 点击马,点击棋子的落点 |
操作步骤 | 1、点击自方马; 2、点击无棋子落点。 |
预期输出 | 不移动棋子。 |
11
测试用例编号 | CHINESECHESS_ST_MOVE_MA_011 |
测试项目 | 象棋马的移动 |
测试标题 | 落点在棋盘外 |
重要级别 | 中 |
预置条件 | 无 |
输入 | 点击马,点击棋子的落点 |
操作步骤 | 1、点击自方马; 2、点击棋盘外。 |
预期输出 | 不移动棋子。 |
3.5. 状态迁移图法
许多需求用状态机的方式来描述,状态机的测试主要关注在测试状态转移的正确性上面。对于一个有限状态机,通过测试验证其在给定的条件内是否能够产生需要的状态变化,有没有不可达的状态和非法的状态,可能不可能产生非法的状态转移等。
构造能导致状态迁移的事件,来测试状态之间的转换。
状态迁移图的步骤:
1、 画出状态迁移图;
2、 列出状态——事件表;
3、 得到状态转换树;
4、 推出测试路径;
5、 根据测试路径编写测试用例。
下面我们结合一个例子来理解。
举例:
手机中MP3播放功能状态-事件表如下,请用状态迁移法设计用例。其中没有选择MP3曲目时不能按任何键,并且当MP3曲目在起点时不能按R键,当MP3曲目在末端时不能按P、F键。
按键 | Idle | 倒 | 播放 | 进 | 录音 |
R(倒) | 倒 | --- | 倒 | 倒 | --- |
P(播放) | 播放 | 播放 | --- | 播放 | --- |
F(进) | 进 | 进 | 进 | --- | --- |
RC(录音) | 录音 | --- | --- | --- | --- |
S(Idle) | --- | Idle | Idle | Idle | Idle |
这里我给出了状态-事件表,为了能更清楚的说明问题,没有有复杂的文字描述出来,一般需要先从需求中提取信息,画出状态图,再得到状态-事件表。
画出状态迁移图:
图画得不好,原则上应该没有交叉的线,这里画得比较乱了,大家见谅。
得到状态-事件表如下:
按键 | R(倒) | P(播放) | F(进) | RC(录音) | S(Idle) |
Idle | 倒 | 播放 | 进 | 录音 | --- |
倒 | --- | 播放 | 进 | --- | Idle |
播放 | 倒 | --- | 进 | --- | Idle |
进 | 倒 | 播放 | --- | --- | Idle |
录音 | --- | --- | --- | --- | Idle |
根据状态-事件表,得到状态树:
每一条路径都是一个测试用例。
用例:
1
测试用例编号 | MOBILE_ST_MP3_ PLAY_001 |
测试项目 | 播放器状态转换 |
测试标题 | 在Idle状态时,先倒后播放 |
重要级别 | 高 |
预置条件 | 已选定MP3曲目,并且不在起点 |
输入 | 选定曲目 |
操作步骤 | 1、按R键; 2、按P键。 |
预期输出 | 曲目先倒带后正常播放。 |
2
测试用例编号 | MOBILE_ST_MP3_ PLAY_002 |
测试项目 | 播放器状态转换 |
测试标题 | 在Idle状态时,先倒后快进 |
重要级别 | 中 |
预置条件 | 已选定MP3曲目,并且不在起点 |
输入 | 选定曲目 |
操作步骤 | 1、按R键; 2、按F键。 |
预期输出 | 曲目先倒带后快进。 |
3
测试用例编号 | MOBILE_ST_MP3_ PLAY_003 |
测试项目 | 播放器状态转换 |
测试标题 | 在Idle状态时,先倒带,然后再停止 |
重要级别 | 中 |
预置条件 | 已选定MP3曲目,并且不在起点 |
输入 | 选定曲目 |
操作步骤 | 1、按R键; 2、按S键。 |
预期输出 | 曲目先倒带后停止。 |
4
测试用例编号 | MOBILE_ST_MP3_ PLAY_004 |
测试项目 | 播放器状态转换 |
测试标题 | 在Idle状态时,先播放后倒带 |
重要级别 | 中 |
预置条件 | 已选定MP3曲目,并且不在末端 |
输入 | 选定曲目 |
操作步骤 | 1、按P键; 2、按R键。 |
预期输出 | 曲目先正常播放后倒带。 |
5
测试用例编号 | MOBILE_ST_MP3_ PLAY_005 |
测试项目 | 播放器状态转换 |
测试标题 | 在Idle状态时,先播放后快进 |
重要级别 | 中 |
预置条件 | 已选定MP3曲目,并且不在末端 |
输入 | 选定曲目 |
操作步骤 | 1、按P键; 2、按F键。 |
预期输出 | 曲目先正常播放后快进。 |
6
测试用例编号 | MOBILE_ST_MP3_ PLAY_006 |
测试项目 | 播放器状态转换 |
测试标题 | 在Idle状态时,先播放后停止 |
重要级别 | 中 |
预置条件 | 已选定MP3曲目,并且不在末端 |
输入 | 选定曲目 |
操作步骤 | 1、按P键; 2、按S键。 |
预期输出 | 曲目先正常播放后停止。 |
7
测试用例编号 | MOBILE_ST_MP3_ PLAY_007 |
测试项目 | 播放器状态转换 |
测试标题 | 在Idle状态时,先快进后倒带 |
重要级别 | 中 |
预置条件 | 已选定MP3曲目,并且不在末端 |
输入 | 选定曲目 |
操作步骤 | 1、按F键; 2、按R键。 |
预期输出 | 曲目先快进后倒带。 |
8
测试用例编号 | MOBILE_ST_MP3_ PLAY_008 |
测试项目 | 播放器状态转换 |
测试标题 | 在Idle状态时,先快进后播放 |
重要级别 | 中 |
预置条件 | 已选定MP3曲目,并且不在末端 |
输入 | 选定曲目 |
操作步骤 | 1、按F键; 2、按P键。 |
预期输出 | 曲目先快进后正常播放。 |
9
测试用例编号 | MOBILE_ST_MP3_ PLAY_009 |
测试项目 | 播放器状态转换 |
测试标题 | 在Idle状态时,先快进后停止 |
重要级别 | 中 |
预置条件 | 已选定MP3曲目,并且不在末端 |
输入 | 选定曲目 |
操作步骤 | 1、按F键; 2、按S键。 |
预期输出 | 曲目先快进后停止。 |
10
测试用例编号 | MOBILE_ST_MP3_ PLAY_010 |
测试项目 | 播放器状态转换 |
测试标题 | 在Idle状态时,先录音后停止 |
重要级别 | 中 |
预置条件 | 已选定MP3曲目。 |
输入 | 选定曲目 |
操作步骤 | 1、按RC键; 2、按S键。 |
预期输出 | 曲目先录音后停止。 |
3.6. 流程分析法
流程分析法是将软件系统的某个流程看成路径,用路径分析的方法来设计测试用例。根据流程的顺序依次进行组合,使得流程的各个分支都能走到。
这里拿一个最简单的流程来做分析。用户登陆操作的流程。这个大家都应该很熟悉的,需求如下(这里只简单举个例子说明用例设计方法,具体需求应该还要详细。):
1、 用户执行程序,弹出登陆对话框;
2、 用户输入用户名,格式要符合如下规范:
a. 2-16个字长,英文或数字;
b. 用户名中不可出现空格符;
c. 可以使用这些字符:“横线-”,“下划线_”,“点.”;
d. 不可以使用“&、%、$”等其它字符。
用户名出错处理:
1)、用户名为空:提示用户:“请输入用户名!”;
2)、用户名错误:提示用户:“用户名错误,请重新输入用户名!”。
3、用户输入密码,格式要符合如下规范:
a. 密码为字符串;
b. 字符串为0~9之间的阿拉伯数字组合,密码长度为6位。
密码出错处理:
1)、密码为空:提示用户:“请输入密码!”;
2)、密码错误:提示用户:“密码错误,请重新输入密码!”。
4、确定登陆,系统验证用户登陆;
5、取消登陆,退出系统。
提取需求信息,得到流程图:
在流程图里,我们将用户和系统的操作用不同的颜色区分开来。用户部分,就相当于是用例的输入;系统部分就相当于是用例的输出。
流程图中有很多路径,每一条路径都可以设计测试用例,首先要列出一条基本路径(优先级最高)的路径,进行测试分析。
基本路径:启动程序 -> 输入用户名密码 –> 进入系统
任何测试用例都会采用这条基本测试路径,只是测试结果不同。下面我们来设计测试用例,首先进行等价类的划分:
输入条件 | 有效等价类 | 无效等价类 |
用户名 | 2-16个字长,英文或数字或“横线-”、“下划线_”、“点.”; | 字长为0、1和大于16;空格;“&、%、$”等其它字符; |
密码 | 字符串为0~9之间的阿拉伯数字组合,密码长度为6位 | c |
再进行边界值分析
输入 | 内点 | 上点 | 离点 |
用户名 | Abc、ab-12_34.ABmU15 | Qq、16ab-12_34ABmU16 | P、17ab-12_34.ABmU17 |
密码 | 000001、999998 | 000000、999999 | 11111、0000000 |
可以看到,我在进行边界值分析的时候,内点和上点已经覆盖了所有有效等价类。下面根据等价类测试用例设计原则和边界值分析法设计测试用例的原则,进行用例的编写。
注:用例设计完后,对照流程图分析是否有遗漏的路径没有覆盖到。如果有,设计用例覆盖这些路径。
用例:
1、
测试用例编号 | XXXX_ST_XXX_LOGIN_001 |
测试项目 | LOGIN |
测试标题 | 输入合法用户名和密码,按确认,内点小 |
重要级别 | 高 |
预置条件 | 系统数据库内存在该用户及密码 |
输入 | Abc,000001 |
操作步骤 | 1、启动系统; 2、输入用户名:Abc; 3、输入密码:000001; 4、点击确定。 |
预期输出 | 进入系统。 |
2、
测试用例编号 | XXXX_ST_XXX_LOGIN_002 |
测试项目 | LOGIN |
测试标题 | 输入合法用户名和密码,按确认,内点大 |
重要级别 | 中 |
预置条件 | 系统数据库内存在该用户及密码 |
输入 | ab-12_34.ABmU15,999998 |
操作步骤 | 1、启动系统; 2、输入用户名: ab-12_34.ABmU15; 3、输入密码:999998; 4、点击确定。 |
预期输出 | 进入系统。 |
3、
测试用例编号 | XXXX_ST_XXX_LOGIN_003 |
测试项目 | LOGIN |
测试标题 | 输入合法用户名和密码,按确认,上点小 |
重要级别 | 中 |
预置条件 | 系统数据库内存在该用户及密码 |
输入 | Qq,000000 |
操作步骤 | 1、启动系统; 2、输入用户名: Qq; 3、输入密码:000000; 4、点击确定。 |
预期输出 | 进入系统。 |
4、
测试用例编号 | XXXX_ST_XXX_LOGIN_004 |
测试项目 | LOGIN |
测试标题 | 输入合法用户名和密码,按确认,上点大 |
重要级别 | 中 |
预置条件 | 系统数据库内存在该用户及密码 |
输入 | 16ab-12_34.ABmU16,999999 |
操作步骤 | 1、启动系统; 2、输入用户名:16ab-12_34.ABmU16; 3、输入密码:999999; 4、点击确定。 |
预期输出 | 进入系统。 |
5、
测试用例编号 | XXXX_ST_XXX_LOGIN_005 |
测试项目 | LOGIN |
测试标题 | 用户名为空 |
重要级别 | 中 |
预置条件 | |
输入 | “”,000000 |
操作步骤 | 1、启动系统; 2、输入用户名: ; 3、输入密码:000000; 4、点击确定。 |
预期输出 | 提示用户“请输入用户名!”。 |
6、
测试用例编号 | XXXX_ST_XXX_LOGIN_006 |
测试项目 | LOGIN |
测试标题 | 用户名字长为1 |
重要级别 | 中 |
预置条件 | |
输入 | P,000000 |
操作步骤 | 1、启动系统; 2、输入用户名:P; 3、输入密码:000000; 4、点击确定。 |
预期输出 | 提示用户:“用户名错误,请重新输入用户名!” |
7、
测试用例编号 | XXXX_ST_XXX_LOGIN_007 |
测试项目 | LOGIN |
测试标题 | 用户名字长为17 |
重要级别 | 中 |
预置条件 | |
输入 | 17ab-12_34.ABmU17,000000 |
操作步骤 | 1、启动系统; 2、输入用户名:17ab-12_34.ABmU17; 3、输入密码:000000; 4、点击确定。 |
预期输出 | 提示用户:“用户名错误,请重新输入用户名!” |
8、
测试用例编号 | XXXX_ST_XXX_LOGIN_008 |
测试项目 | LOGIN |
测试标题 | 用户名含有空格 |
重要级别 | 中 |
预置条件 | |
输入 | 123 456,000000 |
操作步骤 | 1、启动系统; 2、输入用户名:123 456; 3、输入密码:000000; 4、点击确定。 |
预期输出 | 提示用户:“用户名错误,请重新输入用户名!” |
9、
测试用例编号 | XXXX_ST_XXX_LOGIN_009 |
测试项目 | LOGIN |
测试标题 | 用户名含有“&、%、$”等其它字符 |
重要级别 | 中 |
预置条件 | |
输入 | 123$4,000000 |
操作步骤 | 1、启动系统; 2、输入用户名:123$4; 3、输入密码:000000; 4、点击确定。 |
预期输出 | 提示用户:“用户名错误,请重新输入用户名!” |
10、
测试用例编号 | XXXX_ST_XXX_LOGIN_010 |
测试项目 | LOGIN |
测试标题 | 用户名合法,密码不合法,离点小 |
重要级别 | 中 |
预置条件 | |
输入 | Qq,11111 |
操作步骤 | 1、启动系统; 2、输入用户名: Qq ; 3、输入密码:11111; 4、点击确定。 |
预期输出 | 提示用户:“密码错误,请重新输入密码!” |
11、
测试用例编号 | XXXX_ST_XXX_LOGIN_011 |
测试项目 | LOGIN |
测试标题 | 用户名合法,密码不合法,离点大 |
重要级别 | 中 |
预置条件 | |
输入 | Qq,0000000 |
操作步骤 | 1、启动系统; 2、输入用户名: Qq ; 3、输入密码:0000000; 4、点击确定。 |
预期输出 | 提示用户:“密码错误,请重新输入密码!” |
12、
测试用例编号 | XXXX_ST_XXX_LOGIN_012 |
测试项目 | LOGIN |
测试标题 | 用户名合法,密码含有非阿拉伯数字字符 |
重要级别 | 中 |
预置条件 | |
输入 | Qq,321abc |
操作步骤 | 1、启动系统; 2、输入用户名: Qq ; 3、输入密码:321abc; 4、点击确定。 |
预期输出 | 提示用户:“密码错误,请重新输入密码!” |
第13、14个用例为补充覆盖流程路径的测试用例。
13、
测试用例编号 | XXXX_ST_XXX_LOGIN_013 |
测试项目 | LOGIN |
测试标题 | 用户名合法,密码为空 |
重要级别 | 中 |
预置条件 | |
输入 | |
操作步骤 | 1、启动系统; 2、输入用户名: Qq ; 3、输入密码: 4、点击确定。 |
预期输出 | 提示用户:“请输入密码!” |
14、
测试用例编号 | XXXX_ST_XXX_LOGIN_014 |
测试项目 | LOGIN |
测试标题 | 不输用户名密码,点击取消 |
重要级别 | 底 |
预置条件 | |
输入 | |
操作步骤 | 1、启动系统; 2、点击取消。 |
预期输出 | 退出系统。 |
下面再举一个用户通过银行的ATM取款机进行取款的例子,来说明流程分析法、等价类分析法和边界值法。
基本事件流:
1、用户向ATM提款机中插入银行卡,如果银行卡是合法的,ATM提款机界面提示用户输入提款密码;
参数1 | 银行密码 |
参数类型 | 字符串 |
参数范围 | 字符串为0~9之间的阿拉伯数字组合,密码长度为6位 |
备注 |
用户输入该银行卡的密码,ATM提款机与MainFrame传递密码,检验密码的正确性。如果输入密码正确,提示用户输入取钱金额,提示信息为,“请输入您的提款额度”;
用户输入取钱金额,系统校验金额正确,提示用户确认,提示信息为“您输入的金额是xxx,请确认,谢谢!”,用户按下确认键,确认需要提取的金额;
参数1 | 取款金额 |
参数类型 | 整数 |
参数范围 | 50~1500 RMB,单笔取款额最高为1500RMB;每24小时之内,取款的最高限额是4500RMB |
备注 |
系统同步银行主机,点钞票,输出给用户,并且减掉数据库中该用户帐户中的存款金额。
用户提款,银行卡自动退出,用户取走现金,拔出银行卡,ATM提款机界面恢复到初始状态;
备选事件流(考虑可能失败的地方):
1. 在基本事件流1中:
a) 如果插入无效的银行卡,那么,在ATM提款机界面上提示用户“您使用的银行卡无效!”,3秒钟后,自动退出该银行卡。
2. 在基本事件流2中:
a) 如果用户输入的密码错误,则提示用户“您输入的密码无效,请重新输入”;
b) 如果用户连续3次输入错误密码,ATM提款机吞卡,并且ATM提款机的界面恢复到初始状态。此时,其他提款人可以继续使用其他的合法的银行卡在ATM提款机上提取现金。
c) 用户输入错误的密码后,也可以按“退出”键,则银行卡自动退出。
3. 在基本事件流3中:
a) 如果用户输入的单笔提款金额超过单笔提款上限,ATM提款机界面提示“您输入的金额错误,单笔提款上限金额是1500RMB,请重新输入”;
b) 如果用户输入的单笔金额,不是以50RMB为单位的,那么提示用户“您输入的提款金额错误,请输入以50为单位的金额”;
c) 如果用户在24小时内提取的金额大于4500RMB,则ATM提款机提示用户,“24小时内只能提取4500RMB,请重新输入提款金额”输入提取的金额超过了系统的设定的限制 ;
d) 如果用户输入正确的提款金额,ATM提款机提示用户确认后,用户取消提款,则ATM提款机自动退出该银行卡;
e) 如果ATM提款机中余额不足,则提示用户,“抱歉,ATM提款机中余额不足”,3秒钟后,自动退出银行卡。
4. 在基本事件流4中:
a) 如果用户银行户头中的存款小于提款金额,则提示用户“抱歉,您的存款余额不足!”,3秒钟后,自动退出银行卡;
5. 在基本事件流5中:
a) 如果用户没有取走现金,或者没有拔出银行卡,ATM提款机不做任何提示,直接恢复到界面的初始状态;
根据以上这段需求,画出流程图,如下:
根据流程图,得到基本路径。
基本路径:插入银行卡---提示输入密码---用户输入密码---提示输入金额---用户输入金额---提示确认---用户确认---输出钞票给用户,退卡---用户取走现金,取走银行卡---界面恢复初始状态
下面分析测试数据,采用等价类划分和边界值法。
等价类划分:
输入条件 | 有效等价类 | 无效等价类 |
银行卡 | 银行卡 | 非银行卡 |
密码 | 字符串为0~9之间的阿拉伯数字组合,密码长度为6位 | 长度不是6位的0~9之间的组合 |
金额 | 以50为单位,50~1500 RMB,单笔取款额最高为1500RMB;每24小时之内,取款的最高限额是4500RMB | 非50的倍数,或大于1500,24小时内取款超过4500 |
确认 | TRUE | |
取现金 | TRUE、FALSE | |
取银行卡 | TRUE、FALSE |
边值分析:
输入 | 内点 | 上点 | 离点 |
密码 | 000001、999998 | 000000、999999 | 00000、1000000 |
金额 | 100、1450 | 50、1500 | 0、1550 |
得到测试用例:
1
测试用例编号 | ATM_ST_FETCH_001 |
测试项目 | 银行ATM机取款 |
以上是关于软件测试系列三《测试用例编写原则与设计方法》的主要内容,如果未能解决你的问题,请参考以下文章 |