4、判定表法:判定表结构、条件桩与动作桩、实战案例(优惠券发放逻辑)

大家好,我是老赵。今天咱们聊聊判定表法。

说实话,我刚入行那会儿,最怕的就是那种「条件多、逻辑绕」的需求。比如优惠券发放,什么满减、新用户、限时、品类限制……各种条件搅在一起,写测试用例写到怀疑人生。后来我学会了判定表法,嗯,这玩意儿真能救命。

4.1 判定表长什么样?

判定表,说白了就是一个「条件-动作」的对照表。它把所有的条件组合都列出来,然后告诉你每种组合下该做什么。

我个人习惯把判定表分成四个部分:

  • 条件桩:列出所有可能的条件。比如「是否新用户」、「是否满减」。
  • 动作桩:列出所有可能的动作。比如「发放优惠券」、「不发放」。
  • 条件项:针对每个条件,列出它的取值(真/假、是/否)。
  • 动作项:针对每个条件组合,列出对应的动作。

举个例子,一个最简单的判定表:

条件桩 规则1 规则2 规则3 规则4
是否新用户?
是否满100元?
动作桩 规则1 规则2 规则3 规则4
发放10元券
发放5元券
不发放
小技巧:条件桩的数量决定了规则的数量。如果有n个条件,理论上就有2ⁿ种组合。但实际工作中,很多组合是无效的,可以合并。

4.2 条件桩与动作桩:怎么拆?

很多同学问我:「老赵,条件桩和动作桩怎么分?感觉分不清啊。」

其实很简单。你想想看,条件桩是「输入」,动作桩是「输出」。条件桩是那些你无法控制、只能判断的东西,比如用户属性、订单金额。动作桩是系统要执行的操作,比如发券、弹窗、记录日志。

我在项目中遇到过一个问题:产品经理把「是否发放优惠券」既当条件又当动作。这其实不对。条件应该是「是否满足发放条件」,动作才是「发放优惠券」。记住这个原则,就不会搞混。

4.2.1 条件桩的提取原则

  • 互斥性:条件之间不能有隐含的依赖关系。比如「是否新用户」和「是否老用户」就是互斥的,不能同时出现。
  • 完整性:所有影响结果的条件都要列出来。漏掉一个,测试就不全。
  • 原子性:每个条件应该是不可再分的最小单元。比如「是否满100元且是新用户」应该拆成两个条件。

4.2.2 动作桩的提取原则

  • 可观测性:每个动作都应该是系统能执行、测试能验证的。比如「发送短信」可以验证,「提升用户体验」就没法测。
  • 唯一性:同一个条件组合下,动作应该是确定的。不能既发券又不发券。
重点:判定表法的核心不是画表,而是「穷举条件组合」。你想想看,如果条件有5个,那就是32种组合。手工写用例?写到崩溃。但用判定表,一张表搞定。

4.3 实战案例:优惠券发放逻辑

好了,理论说完了,咱们来点实际的。这是我从真实项目中提炼出来的案例。

4.3.1 需求描述

假设我们要测试一个优惠券发放系统。规则如下:

  • 用户必须是新用户或者老用户且累计消费满500元,才能获得优惠券。
  • 如果用户是新用户,发放10元无门槛券
  • 如果用户是老用户且满500元,发放8折券(最高减50元)
  • 如果用户是老用户但未满500元,不发放。
  • 所有用户如果在活动期间内,额外发放5元券

嗯,这个需求有点绕。咱们用判定表来拆解。

4.3.2 提取条件桩和动作桩

先看条件:

  • 条件1:是否新用户?(是/否)
  • 条件2:是否老用户且满500元?(是/否)——注意,这个条件只在「非新用户」时有效。
  • 条件3:是否在活动期间?(是/否)

再看动作:

  • 动作1:发放10元无门槛券
  • 动作2:发放8折券(最高减50元)
  • 动作3:发放5元券
  • 动作4:不发放
注意:这里有个坑。「是否老用户且满500元」这个条件,其实隐含了「非新用户」的前提。如果你把「是否新用户」和「是否老用户」作为两个独立条件,就会出现「既是新用户又是老用户」的无效组合。我曾经在这个问题上吃过亏,后来我学乖了,条件之间一定要保证互斥。

4.3.3 构建判定表

3个条件,理论上2³=8种组合。但有些组合是无效的,比如「新用户」且「老用户且满500元」——这不可能同时成立。所以实际有效的组合只有5种。

条件桩 规则1 规则2 规则3 规则4 规则5
是否新用户?
是否老用户且满500元?
是否在活动期间?
动作桩 规则1 规则2 规则3 规则4 规则5
发放10元无门槛券
发放8折券
发放5元券
不发放

注意看,规则5中「是否在活动期间」我填了「—」,表示这个条件不影响结果。因为老用户且未满500元,不管是不是活动期间,都不发放。这就是判定表的优势——一眼就能看出哪些条件组合是冗余的。

4.3.4 从判定表到测试用例

判定表画完了,测试用例也就出来了。每个规则就是一条测试用例。比如:

  • 用例1:新用户,活动期间 → 发放10元无门槛券 + 5元券
  • 用例2:新用户,非活动期间 → 发放10元无门槛券
  • 用例3:老用户且满500元,活动期间 → 发放8折券 + 5元券
  • 用例4:老用户且满500元,非活动期间 → 发放8折券
  • 用例5:老用户且未满500元 → 不发放
避坑指南:我曾经遇到过一个问题——判定表里写了5条规则,但实际测试时发现漏了一种情况:新用户且是老用户(系统数据异常)。虽然业务上不可能,但测试时还是要考虑。所以我的习惯是:判定表只覆盖「正常逻辑」,边界和异常情况单独补充。

4.4 判定表法的优缺点

说了这么多,咱们客观评价一下判定表法。

4.4.1 优点

  • 全覆盖:所有条件组合都列出来了,不会漏测。
  • 可视化:一张表就能看清所有逻辑,沟通成本低。
  • 易维护:需求变了,改表就行,不用重新想用例。

4.4.2 缺点

  • 组合爆炸:条件超过5个,表就变得很大。我见过一个项目有8个条件,256种组合,画完表人都傻了。
  • 不擅长处理顺序:判定表只关心「条件组合」,不关心「条件出现的顺序」。如果逻辑有先后依赖,判定表就不好使了。
我的建议:条件在4个以内,用判定表最合适。超过4个,可以考虑用正交实验法或者决策树。别死磕一种方法。

4.5 小结

判定表法,说白了就是「穷举条件,匹配动作」。它特别适合那种「条件多、逻辑复杂」的场景。你想想看,如果没有判定表,你可能会漏掉某个条件组合,导致线上出bug。有了判定表,一张表就能搞定所有测试用例。

嗯,今天就聊到这儿。下一章咱们讲正交实验法,那个更适合「条件多但组合可以精简」的场景。到时候见。