场景建模方法:状态机建模、决策表建模、流程树建模、组合爆炸问题

大家好,我是老张。今天咱们聊聊场景建模。

做测试这么多年,我最大的体会就是:没有好的建模,就没有好的覆盖。你想想看,一个复杂系统动辄几百个功能点,靠脑袋硬记,迟早翻车。我早期吃过这个亏——有一次测支付系统,漏了一个异常状态,结果线上出了资损。嗯,从那以后,我再也不敢跳过建模这一步。

场景建模说白了,就是把业务逻辑翻译成测试能看懂的结构。常用的有三种:状态机、决策表、流程树。咱们一个一个说。

1. 状态机建模:最适合有状态流转的系统

状态机建模,我个人习惯叫它「状态+事件」模型。核心就两个东西:状态和迁移。

举个例子,一个订单系统:

  • 状态:待支付、已支付、已发货、已完成、已取消
  • 事件:支付、发货、确认收货、取消

状态机模型长这样:

状态: 待支付
  事件: 支付 → 状态: 已支付
  事件: 取消 → 状态: 已取消

状态: 已支付
  事件: 发货 → 状态: 已发货
  事件: 取消 → 状态: 已取消

状态: 已发货
  事件: 确认收货 → 状态: 已完成

状态: 已完成
  事件: (无)

状态: 已取消
  事件: (无)

我在项目中遇到过一个问题:状态机画得太细,导致测试用例爆炸。比如「待支付」状态下,用户连续点击支付按钮10次,算不算有效事件?我的建议是:只关注业务上合法的状态迁移,非法事件统一归到「异常处理」里,不要每个都画一条线。

小技巧:状态机建模时,先画「快乐路径」,再补「异常路径」。别一上来就想把所有分支画全,容易把自己绕晕。

2. 决策表建模:最适合条件组合多的场景

决策表,说白了就是「条件+动作」的矩阵。什么时候用?当你发现一个功能点有多个条件,每个条件有多个取值,组合起来让人头皮发麻的时候——决策表就是你的救星。

举个例子,一个优惠券系统:

条件 规则1 规则2 规则3 规则4
用户等级 VIP VIP 普通 普通
订单金额≥100 是 否 是 否
是否使用过优惠券 否 否 是 是
动作:发放优惠券 是 是 否 否

你看,4条规则就把所有组合覆盖了。我曾经见过一个团队,用决策表测一个保险核保系统,30个条件,硬是缩成了64条规则——比全组合的2^30少了不知道多少个数量级。

注意:决策表不是万能的。当条件超过5个时,规则数会指数增长。这时候需要做「条件合并」或「等价类划分」。我曾经犯过这个错,画了一张16个条件的决策表,结果自己都看不懂了。

3. 流程树建模:最适合业务流程清晰的场景

流程树,其实就是把业务流程画成一棵树。根节点是起始状态,叶子节点是结束状态,中间节点是各种分支。

举个例子,一个注册流程:

开始注册
├── 手机号注册
│   ├── 验证码正确 → 注册成功
│   ├── 验证码错误 → 重新输入
│   └── 验证码超时 → 重新获取
├── 邮箱注册
│   ├── 验证链接有效 → 注册成功
│   └── 验证链接失效 → 重新发送
└── 第三方登录
    ├── 授权成功 → 注册成功
    └── 授权失败 → 返回登录页

流程树的优点是直观,适合给产品和开发看。但缺点是:分支多了以后,树会变得很胖。我建议每个节点的分支数控制在5个以内,超过的话就考虑拆成多个子流程。

核心观点:三种建模方法没有的优劣。状态机适合有状态流转的系统,决策表适合条件组合多的场景,流程树适合业务流程清晰的场景。我个人的习惯是:先画流程树理清主干,再用状态机补全状态迁移,最后用决策表覆盖条件组合。

4. 组合爆炸问题:建模最大的敌人

说到组合爆炸,我得先叹口气。这玩意儿,我早期做测试时被它坑过无数次。

什么叫组合爆炸?就是条件一多,测试用例数呈指数级增长。比如你有10个条件,每个条件2个取值,全组合就是2^10=1024个用例。如果每个条件3个取值,那就是3^10=59049个。你想想看,一个项目周期就两周,哪来的时间跑5万条用例?

怎么解决?我总结了三板斧:

  1. 等价类划分:把无限取值变成有限类。比如「年龄」这个条件,你不需要测1岁、2岁、3岁...只需要测「未成年」「成年」「老年」三个类就够了。
  2. 边界值分析:很多bug都出在边界上。比如「订单金额≥100」这个条件,你只需要测99、100、101这三个值,中间的不用管。
  3. 正交实验法:用最少的用例覆盖最多的组合。比如3个条件,每个条件3个取值,全组合是27条,正交表只需要9条。我在项目中用过一次,效果出奇的好。
避坑指南:我曾经在一个金融项目中,用全组合测一个风控规则引擎,结果用例数到了10万+。后来改用正交实验法,缩到了200条,覆盖率反而更高了。为什么?因为全组合里有很多冗余用例,正交表去掉了这些冗余,反而让测试更聚焦。

最后,我画了一张图,把今天讲的内容串起来:

场景建模方法体系 场景建模 状态机建模 决策表建模 流程树建模 有状态流转的系统 条件组合多的场景 业务流程清晰的场景 组合爆炸问题 解决方案:等价类划分 | 边界值分析 | 正交实验法 三种方法灵活组合,才能有效收敛测试场景

好了,今天的内容就到这里。记住:建模不是为了画图,而是为了找到测试的边界。下次你遇到一个复杂系统,不妨先问问自己:这个场景适合用哪种模型?

一句话总结:状态机管状态,决策表管条件,流程树管流程。组合爆炸不可怕,等价类、边界值、正交表三招搞定。

可可精品资料库