测试基础---测试用例之场景法和状态迁移法

本文介绍了场景法与状态迁移图法在软件测试中的应用。场景法适用于安装程序、向导类功能及多界面切换完成的功能测试;状态迁移图法则适用于依赖数据状态的功能测试,如工作流系统。文章通过实例详细阐述了如何运用这两种方法设计有效的测试用例。

       昨天我们介绍了正交实验法,那么正交实验法主要适用于一些配置功能的界面和兼容性测试,其他需要组合的界面。正交实验法也是针对有效等价类的。

       在实际测试中,经常有这种情况,像安装程序向导,它是由多个界面组成的,并且他们之间彼此有联系,而且他们之间是有流程顺序的,在面对这种测试时,我们就可以使用今天介绍的场景法了。照例还是先看一下基本概念,基本流就是按照正确的事件流来实现的流程。备选流就是出现故障或缺陷的过程。场景就是若干事件流首尾拼接构成一个测试场景。来看一个场景图:

这里共有一个基本流和四个备选流,那么我们来确定一下场景:

场景1:基本流

场景2:基本流     备选流1

场景3:基本流     备选流1        备选流2

场景4:基本流     备选流3

场景5:基本流     备选流3        备选流1

场景6:基本流     备选流3        备选流1        备选流2

场景7:基本流     备选流4

场景8:基本流     备选流3        备选流4

备选流覆盖准则:(1)覆盖每个备选流(2)覆盖一个循环,这两种方法可以看自己的情况选择。到这基本测试用例就出来了,每个场景对应一个测试用例,对每个用例进行评审,删掉重复的就可以了。场景法最主要的就是能够分析出基本流和备选流。场景法主要适用于安装程序、向导类功能和多界面切换完成的功能。

下面来看一下状态迁移图法设计测试用例。在实际测试过程中有这么一种情况,就是被测系统的功能依赖于数据的状态,像常见的工作流系统(OA),对于这类软件状态迁移法就在合适不过了。所谓状态迁移法就是首先要找出所有的状态,然后再分析各个状态之间的转换,条件这些。根据这些来建立测试用例。还是用一个简单的例子来说明一下吧。

案例研究1:某航空公司的订票系统

 

 

 

 

 

 

 

 

 

 

客户提供机票信息,订票系统根据这些信息订票,将订单状态标记为Made

 

 

 

 

 

 

 

同时订票系统启动计时器,要求客户在指定时间内必须付费

 

 

 

 

 

 

 

 

 

计时器超时前,客户付费,订单状态标记为Paid

 

 

 

 

 

 

 

 

 

 

客户可以打印处于Paid状态的订单机票,订单系统将为用户出票,订单状态标记为Ticketed

 

 

 

 

 

 

客户使用机票登机后,订单状态标记为Used(结束订单)

 

 

 

 

 

 

 

 

 

订票系统计时器超时后客户未付费,订票系统将取消本次机票预订,订单状态为CanceledNonPay

 

 

 

 

 

若在计时器超时之前,客户要求取消本次订票,订票系统将取消本次机票预订,订单状态为CanceledByCustomer

 

 

 

 

若客户在付费后取消订票,订单状态标记为CanceledByCustomer,但需要将相关的机票款项按规定退还给客户

 

 

 

 

若客户在拿到机票后取消订票,订单状态标记为CanceledByCustomer,客户需要将机票退回航空公司,航空公司收到退票后将相关的机票款项按规定退还给客户

 

 

 

 

 

 

 

 

 

 

 

 

 

电子机票的状态

 

事件

 

 

 

 

 

 

 

 

 

 

Made初始创建

 

提交订单

 

 

 

 

 

 

 

 

 

 

Paid已付费

 

客户付费

 

 

 

 

 

 

 

 

 

 

Ticketed已出票

 

打印机票

 

 

 

 

 

 

 

 

 

 

Used已使用

 

登机使用

 

 

 

 

 

 

 

 

 

 

CanceledNonPay超时取消

 

计时器超时未付费

 

 

 

 

 

 

 

 

 

CanceledByCustomer用户取消

客户取消

 

 

 

 

 

 

 

 

 

 

 

 

客户已付费取消

 

 

 

 

 

 

 

 

 

 

 

拿到机票后取消

 

 

 

 

 

 

 

 

 

将这些状态和事件状态图表示



这样就形成测试用例了,在形成测试用例的时候有几个准则:

(1)至少覆盖所有状态一次啊

(2)至少覆盖所有事件一次

(3)至少覆盖所有转换一次

(4)至少覆盖所有路径一次

 

### 使用状态迁移设计测试用例方法 状态迁移是一种基于系统状态变化的黑盒测试技术,其核心在于识别系统的各个状态以及这些状态之间可能发生的转换条件路径[^1]。通过这种方法可以全面覆盖系统的各种行为模式。 #### 1. 状态迁移图的设计 在应用状态迁移之前,需先构建目标系统的 **状态迁移图 (State Transition Diagram)** 。该图由节点(表示状态边(表示状态间的迁移关系)组成。每条边上应标注触发迁移的具体事件或输入条件[^3]。 例如,假设有一个简单的登录模块: - 初始状态:未登录。 - 可能的状态有:“已登录” “锁定账户”。 - 迁移条件可能是用户名密码验证成功与否、连续错误次数达到上限等。 ```plaintext 未登录 --(正确凭证)---> 已登录 未登录 --(多次失败)---> 锁定账户 已登录 --(主动登出)---> 未登录 ``` #### 2. 定义测试目标 依据项目需求设定覆盖率标准,常见的目标包括但不限于以下几种情况: - 覆盖所有单独的状态- 验证每一个状态到另一个状态的基本转移逻辑; - 尝试复杂场景下的多重跳转路径。 #### 3. 构建具体测试用例 根据上述定义好的状态迁移图逐一创建对应的测试案例集合。下面给出一个实际例子说明这一过程: ##### 示例:ATM取款功能 假设有如下简化版 ATM 的操作规则描述: - 用户插卡进入“等待PIN码”状态- 输入三次错误 PIN 后卡片被吞没并切换至“吞卡”状态- 成功认证后可选择存款/查询余额等功能;退出返回主菜单直至拔卡结束会话。 ###### 对应的状态迁移图为: ```plaintext 初始 --> 插入银行卡 --> 等待PIN码 等待PIN码 --{正确}--> 主菜单 等待PIN码 --{第1次错, 第2次错}-> 继续尝试 等待PIN码 --{第三次错}--> 吞卡 主菜单 --{选取出钱}--> 出钞处理...最终回到主菜单... 主菜单 --{选择退卡}--> 结束 ``` 按照以上结构我们可以编写一系列具体的测试脚本比如: | ID | 当前状态 | 动作 | 下一期望状态 | |----|----------------|-------------------------|---------------| | T1 | 初始化 | 插入有效借记卡 | 等待PIN码 | | T2 | 等待PIN码 | 提供有效的个人身份号码 | 主菜单 | | T3 | 等待PIN码 | 填写两次不匹配的安全代码 | 再次请求安全代码 | | ...| | | | 注意这里仅列举部分基础情形,完整的方案还需要考虑异常状况如网络中断等问题的影响评估。 #### Python实现简易状态机模拟 为了更好地理解整个流程,可以用Python快速搭建一个小规模的状态管理器作为辅助工具演示效果: ```python class StateMachine: def __init__(self): self.state = 'idle' def transition(self, event): transitions = { ('idle', 'insert_card'): 'wait_pin', ('wait_pin', 'correct_pin'): 'main_menu', ('wait_pin', 'wrong_pin_once'): 'still_wait_pin', ('wait_pin', 'third_wrong'): 'card_ejected' } new_state = transitions.get((self.state, event)) if not new_state: raise ValueError(f"No valid transition from {self.state} with {event}") print(f"{self.state} -> {new_state} due to '{event}'") self.state = new_state if __name__ == "__main__": sm = StateMachine() events_sequence = ['insert_card', 'correct_pin'] try: for e in events_sequence: sm.transition(e) except Exception as ex: print(ex) ``` 此段程序展示了基本框架下如何根据不同外部刺激改变内部所处阶段,并打印相应日志记录以便后续审查确认是否满足预期结果要求。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值