判定表/决策表(Decision Table) 在软件需求用例设计中的使用。它是处理复杂业务逻辑和组合条件时最强大、最严谨的黑盒测试方法,没有之一。

当业务规则由多个逻辑条件组成,并且这些条件的组合会触发不同的操作时,判定表就能大显身手,它能确保所有可能的逻辑路径都被无一遗漏地测试到。


一、 核心概念:什么是判定表?

判定表是一种以表格形式表达多条件逻辑判断的工具,它系统地列出了所有条件的组合以及每种组合对应的操作(结果)。

1. 四大组成部分:

  • 条件桩(Condition Stub): 列出了所有可能影响决策的输入条件。这些问题通常答案是“是/否”或“真/假”。

  • 条件项(Condition Entry): 列出了条件桩中所有条件的可能组合(每一列代表一种组合)。

  • 动作桩(Action Stub): 列出了所有可能采取的操作或结果。

  • 动作项(Action Entry): 指明了在每种条件组合下,应该执行哪些操作(打√或X表示执行或不执行)。

2. 核心价值:

  • 完备性: 强制性地考虑所有条件的真假组合,避免人为思考的遗漏。

  • 无歧义性: 以结构化的方式清晰地表达复杂的业务规则,比文字描述更精确。

  • 高效性: 能帮助我们发现规格说明中的不一致、遗漏和矛盾。


二、 在用例设计中的应用步骤

我们通过一个经典的业务场景来贯穿整个流程:电商平台的订单折扣规则

需求描述(一段模糊的文字):
“对于新用户,如果订单金额大于100元,则享受9折优惠。对于老用户,如果订单金额大于200元,并且账户积分大于1000分,则享受85折优惠,否则无折扣。所有用户,如果购买了打折商品,则不再享受任何额外折扣。”

看到这种需求,用等价类和边界值会非常吃力且容易遗漏。判定表是唯一正确的选择。

步骤一:识别条件桩和动作桩
  1. 分析需求,提取所有独立的布尔条件(是/否问题):

    • 用户是新用户吗? (C1)

    • 订单金额 > 100元吗? (C2)

    • (如果是老用户)订单金额 > 200元吗? (C2)注意:这里金额条件有歧义,需要澄清

    • (如果是老用户)积分 > 1000吗? (C3)

    • 是否包含打折商品? (C4)

    澄清需求后: 老用户的85折优惠需要同时满足“金额>200”和“积分>1000”。而新用户的9折优惠只满足“金额>100”即可。金额条件对于不同用户是不同的阈值,但我们可以用两个条件来表示:金额 > 100 和 金额 > 200。

  2. 识别所有可能的操作或结果:

    • 应用9折优惠 (A1)

    • 应用85折优惠 (A2)

    • 无折扣 (A3)

步骤二:构建判定表(初始全量表)

列出所有条件的所有可能组合。如果有N个条件,理论上就有2^N种规则。本例最初有4个条件,理论上16种规则。

规则编号123456...16
条件桩
C1: 是新用户?YYYYNN......
C2: 金额>100?YYNNYY......
C3: 金额>200?YNYNYN......
C4: 积分>1000?YNYNYN......
C5: 有打折商品?YNYNYN......
动作桩
A1: 应用9折
A2: 应用85折
A3: 无折扣

注意:上表只是一个示意,实际16列很长。我们发现C2和C3(金额>100和金额>200)存在逻辑关联,这会导致很多无效或矛盾的规则。这正是判定表帮助我们发现需求模糊点的威力!

步骤三:简化(合并/优化)判定表

专业测试人员不会测试所有16种情况,因为很多规则在业务上是不可能的(如金额>200为真,则金额>100必然为真)或执行相同动作。我们需要合并和优化。

  1. 处理逻辑依赖: C3: 金额>200 成立意味着 C2: 金额>100 必然成立。我们可以简化条件,只保留 C3: 金额>200,并通过它推断出金额>100也为真。

  2. 处理无关条件: 根据需求,“包含打折商品(C5)” 是一个否决条件,只要它为Y,无论其他条件如何,结果都是无折扣。

  3. 合并相似规则: 对于C4: 积分>1000这个条件,它只对老用户有效。对新用户来说,这个条件是无关的,它的值可以是Y或N(用“-”表示),结果都一样。

简化后的优化判定表:

规则编号1234567
条件桩
C1: 是新用户?YYNNN--
C3: 金额>200?--YYN--
C4: 积分>1000?--YN---
C5: 有打折商品?NNNNNYY
动作桩
A1: 应用9折√
A2: 应用85折√
A3: 无折扣√√√√√
说明新用户 & 金额>100*新用户 & 金额<=100老用户 & 金额>200 & 积分>1000老用户 & (金额<=200 | 积分<=1000)老用户 & 金额<=200有打折商品(新用户)有打折商品(老用户)

金额>100 由规则1的新用户和隐含条件推断得出。

优化说明:

  • 规则1 & 2: 针对新用户,C3和C4是无关条件(-)。

  • 规则3,4,5: 针对老用户,根据C3和C4的不同组合决定折扣。

  • 规则6 & 7: C5为Y是绝对否决条件,覆盖了所有用户类型,直接输出“无折扣”。这是最关键的两条规则,确保了核心业务逻辑。

步骤四:根据优化后的判定表生成测试用例

现在,表格中的每一列(规则)都直接对应一个高价值的测试用例。

| 用例ID | 条件组合 | 预期结果 |
| :--- | :--- | :--- |
| TC-DT1 | 新用户,订单金额150元,无打折商品 | 享受9折优惠 |
| TC-DT2 | 新用户,订单金额80元,无打折商品 | 无折扣 |
| TC-DT3 | 老用户,订单金额250元,积分1500,无打折商品 | 享受85折优惠 |
| TC-DT4 | 老用户,订单金额250元,积分800,无打折商品 | 无折扣 |
| TC-DT5 | 老用户,订单金额150元,积分2000,无打折商品 | 无折扣 (金额不满足>200) |
| TC-DT6 | 新用户,订单金额任意,有打折商品 | 无折扣 (否决条件测试) |
| TC-DT7 | 老用户,订单金额任意,积分任意,有打折商品 | 无折扣 (否决条件测试) |


三、 最佳实践与专家建议

  1. 适用场景:

    • “如果...并且...或者...那么...”这类结构的业务规则。

    • 功能中存在多个逻辑条件组合,且输出结果依赖于这些组合。

    • 重要的核心业务逻辑(如支付、风控、计费),需要极高的测试覆盖率。

  2. 先简化,后设计: 直接使用全量表会导致用例爆炸(2^N)。测试专家的价值就在于通过分析条件间的逻辑关系(包含、互斥、依赖)来优化和合并规则,大幅减少冗余用例,同时保证逻辑覆盖率(条件组合覆盖)。

  3. 发现需求缺陷: 在画表的过程中,你经常会发现需求的歧义、遗漏和矛盾。例如,老用户金额在100到200之间是否有折扣?这就是一个典型的遗漏,需要在设计用例前与产品经理澄清。

  4. 与其它方法结合: 判定表保证了逻辑覆盖,但表中的具体测试数据(如金额150元)仍然可以使用等价类和边界值来选取(例如,规则3中,金额应该取201元和200元来测试边界)。

总结

        对于测试专家而言,判定表不仅仅是一个用例设计工具,更是一个强大的需求分析工具和逻辑梳理工具。它迫使你以一种结构化的、无歧义的方式去理解需求,将模糊的自然语言转化为精确的技术规格,从而设计出逻辑完备、无遗漏的测试用例集。在面对复杂的业务规则时,它是确保软件质量和业务正确性的终极武器。

更多推荐