4. 状态迁移测试
订单状态机建模
订单状态机由五个状态和若干迁移事件构成。设计用例前,先把状态、事件、迁移条件与动作整理成一张状态迁移表,作为用例覆盖的基准。
| 当前状态 | 事件 | 迁移条件 | 目标状态 | 动作 |
|---|---|---|---|---|
| 待支付 | 支付成功 | 金额匹配且未超时 | 已支付 | 记录支付流水 |
| 待支付 | 取消订单 | 用户主动取消 | 已取消 | 释放库存 |
| 待支付 | 支付超时 | 超过30分钟未支付 | 已取消 | 释放库存 |
| 已支付 | 发货 | 仓库已拣货 | 已发货 | 写入物流单号 |
| 已支付 | 申请退款 | 未发货 | 已取消 | 发起退款 |
| 已发货 | 确认收货 | 物流签收 | 已完成 | 结算货款 |
| 已发货 | 申请退货 | 签收后7天内 | 已取消 | 发起退货退款 |
| 已完成 | 申请售后 | 签收后15天内 | 已完成 | 创建售后单 |
覆盖策略与用例设计
状态迁移测试的核心覆盖准则有三类:状态覆盖(每个状态至少到达一次)、迁移覆盖(每条合法迁移至少执行一次)、非法迁移覆盖(对每个状态尝试所有不应被允许的事件,验证系统拒绝并保持原状态)。
以下按迁移覆盖准则设计用例,每条合法迁移对应一个正向用例,每个状态选取典型非法事件构造反向用例。
| 用例编号 | 类型 | 前置状态 | 触发事件 | 预期目标状态 | 验证要点 |
|---|---|---|---|---|---|
| TC-01 | 合法 | 待支付 | 支付成功(金额匹配) | 已支付 | 状态变为已支付,支付流水写入 |
| TC-02 | 合法 | 待支付 | 用户取消订单 | 已取消 | 状态变为已取消,库存释放 |
| TC-03 | 合法 | 待支付 | 支付超时(>30min) | 已取消 | 定时任务触发,库存释放 |
| TC-04 | 合法 | 已支付 | 仓库发货 | 已发货 | 状态变为已发货,物流单号写入 |
| TC-05 | 合法 | 已支付 | 申请退款(未发货) | 已取消 | 退款发起,库存释放 |
| TC-06 | 合法 | 已发货 | 确认收货 | 已完成 | 状态变为已完成,货款结算 |
| TC-07 | 合法 | 已发货 | 申请退货(7天内) | 已取消 | 退货退款流程启动 |
| TC-08 | 合法 | 已完成 | 申请售后(15天内) | 已完成 | 售后单创建,状态不变 |
| TC-09 | 非法 | 待支付 | 发货 | 待支付 | 拒绝操作,返回错误提示 |
| TC-10 | 非法 | 已取消 | 支付成功 | 已取消 | 拒绝支付,状态不变 |
| TC-11 | 非法 | 已完成 | 取消订单 | 已完成 | 拒绝取消,状态不变 |
| TC-12 | 非法 | 已发货 | 支付成功 | 已发货 | 拒绝重复支付,状态不变 |
用例设计要点:非法迁移用例的预期结果不是“报错”这么简单,需要明确验证三点——① 接口返回明确的错误码或提示信息;② 订单状态保持不变;③ 不产生副作用(如库存未释放、未生成支付流水、未写入物流单号)。
状态迁移测试执行检查表
| 检查项 | 判断标准 | 通过条件 |
|---|---|---|
| 合法迁移后状态正确 | 查询订单状态与预期一致 | 全部TC-01~TC-08通过 |
| 非法迁移被拒绝 | 接口返回错误码,状态不变 | 全部TC-09~TC-12通过 |
| 迁移动作副作用正确 | 库存、流水、物流单号按预期变化 | 数据库记录与业务规则一致 |
| 终态不可再迁移 | 已取消/已完成状态拒绝所有事件 | 无状态变更,无副作用 |
| 并发迁移安全 | 同一订单同时触发两个事件时仅一个成功 | 无状态覆盖或数据不一致 |
常见遗漏:只测合法迁移而忽略非法迁移,会导致状态控制逻辑的边界缺陷漏出。例如“已取消订单仍可支付”这类缺陷,只有通过非法迁移用例才能暴露。另外,超时取消依赖定时任务,需确认任务调度周期与超时阈值的一致性。