4. 状态迁移测试

状态迁移测试 学习卡片

订单状态机建模

订单状态机由五个状态和若干迁移事件构成。设计用例前,先把状态、事件、迁移条件与动作整理成一张状态迁移表,作为用例覆盖的基准。

当前状态事件迁移条件目标状态动作
待支付支付成功金额匹配且未超时已支付记录支付流水
待支付取消订单用户主动取消已取消释放库存
待支付支付超时超过30分钟未支付已取消释放库存
已支付发货仓库已拣货已发货写入物流单号
已支付申请退款未发货已取消发起退款
已发货确认收货物流签收已完成结算货款
已发货申请退货签收后7天内已取消发起退货退款
已完成申请售后签收后15天内已完成创建售后单
待支付 PENDING 已支付 PAID 已发货 SHIPPED 已完成 COMPLETED 已取消 CANCELLED 支付成功 发货 确认收货 取消/超时 申请退款 申请退货 售后 非法迁移(需设计反向用例验证被拒绝) ✗ 待支付 → 已发货(跳过支付) ✗ 已取消 → 已支付(取消后不可恢复) ✗ 已完成 → 待支付(终态不可回退) ✗ 已发货 → 已支付(不可逆向) ✗ 已取消 → 已发货(终态不可迁移) ✗ 已完成 → 已取消(终态不可迁移)

覆盖策略与用例设计

状态迁移测试的核心覆盖准则有三类:状态覆盖(每个状态至少到达一次)、迁移覆盖(每条合法迁移至少执行一次)、非法迁移覆盖(对每个状态尝试所有不应被允许的事件,验证系统拒绝并保持原状态)。

以下按迁移覆盖准则设计用例,每条合法迁移对应一个正向用例,每个状态选取典型非法事件构造反向用例。

用例编号类型前置状态触发事件预期目标状态验证要点
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通过
迁移动作副作用正确库存、流水、物流单号按预期变化数据库记录与业务规则一致
终态不可再迁移已取消/已完成状态拒绝所有事件无状态变更,无副作用
并发迁移安全同一订单同时触发两个事件时仅一个成功无状态覆盖或数据不一致
常见遗漏:只测合法迁移而忽略非法迁移,会导致状态控制逻辑的边界缺陷漏出。例如“已取消订单仍可支付”这类缺陷,只有通过非法迁移用例才能暴露。另外,超时取消依赖定时任务,需确认任务调度周期与超时阈值的一致性。