【需求测试用例设计】需求设计判定表/决策表如何使用(有关必回)
判定表/决策表(Decision Table) 在软件需求用例设计中的使用。它是处理复杂业务逻辑和组合条件时最强大、最严谨的黑盒测试方法,没有之一。
当业务规则由多个逻辑条件组成,并且这些条件的组合会触发不同的操作时,判定表就能大显身手,它能确保所有可能的逻辑路径都被无一遗漏地测试到。
一、 核心概念:什么是判定表?
判定表是一种以表格形式表达多条件逻辑判断的工具,它系统地列出了所有条件的组合以及每种组合对应的操作(结果)。
1. 四大组成部分:
-
条件桩(Condition Stub): 列出了所有可能影响决策的输入条件。这些问题通常答案是“是/否”或“真/假”。
-
条件项(Condition Entry): 列出了条件桩中所有条件的可能组合(每一列代表一种组合)。
-
动作桩(Action Stub): 列出了所有可能采取的操作或结果。
-
动作项(Action Entry): 指明了在每种条件组合下,应该执行哪些操作(打
√或X表示执行或不执行)。
2. 核心价值:
-
完备性: 强制性地考虑所有条件的真假组合,避免人为思考的遗漏。
-
无歧义性: 以结构化的方式清晰地表达复杂的业务规则,比文字描述更精确。
-
高效性: 能帮助我们发现规格说明中的不一致、遗漏和矛盾。
二、 在用例设计中的应用步骤
我们通过一个经典的业务场景来贯穿整个流程:电商平台的订单折扣规则
需求描述(一段模糊的文字):
“对于新用户,如果订单金额大于100元,则享受9折优惠。对于老用户,如果订单金额大于200元,并且账户积分大于1000分,则享受85折优惠,否则无折扣。所有用户,如果购买了打折商品,则不再享受任何额外折扣。”
看到这种需求,用等价类和边界值会非常吃力且容易遗漏。判定表是唯一正确的选择。
步骤一:识别条件桩和动作桩
-
分析需求,提取所有独立的布尔条件(是/否问题):
-
用户是新用户吗? (
C1) -
订单金额 > 100元吗? (
C2) -
(如果是老用户)订单金额 > 200元吗? (
C2)注意:这里金额条件有歧义,需要澄清 -
(如果是老用户)积分 > 1000吗? (
C3) -
是否包含打折商品? (
C4)
澄清需求后:老用户的85折优惠需要同时满足“金额>200”和“积分>1000”。而新用户的9折优惠只满足“金额>100”即可。金额条件对于不同用户是不同的阈值,但我们可以用两个条件来表示:金额 > 100和金额 > 200。 -
-
识别所有可能的操作或结果:
-
应用9折优惠 (
A1) -
应用85折优惠 (
A2) -
无折扣 (
A3)
-
步骤二:构建判定表(初始全量表)
列出所有条件的所有可能组合。如果有N个条件,理论上就有2^N种规则。本例最初有4个条件,理论上16种规则。
| 规则编号 | 1 | 2 | 3 | 4 | 5 | 6 | ... | 16 |
|---|---|---|---|---|---|---|---|---|
| 条件桩 | ||||||||
| C1: 是新用户? | Y | Y | Y | Y | N | N | ... | ... |
| C2: 金额>100? | Y | Y | N | N | Y | Y | ... | ... |
| C3: 金额>200? | Y | N | Y | N | Y | N | ... | ... |
| C4: 积分>1000? | Y | N | Y | N | Y | N | ... | ... |
| C5: 有打折商品? | Y | N | Y | N | Y | N | ... | ... |
| 动作桩 | ||||||||
| A1: 应用9折 | ||||||||
| A2: 应用85折 | ||||||||
| A3: 无折扣 |
注意:上表只是一个示意,实际16列很长。我们发现C2和C3(金额>100和金额>200)存在逻辑关联,这会导致很多无效或矛盾的规则。这正是判定表帮助我们发现需求模糊点的威力!
步骤三:简化(合并/优化)判定表
专业测试人员不会测试所有16种情况,因为很多规则在业务上是不可能的(如金额>200为真,则金额>100必然为真)或执行相同动作。我们需要合并和优化。
-
处理逻辑依赖:
C3: 金额>200成立意味着C2: 金额>100必然成立。我们可以简化条件,只保留C3: 金额>200,并通过它推断出金额>100也为真。 -
处理无关条件: 根据需求,“包含打折商品(C5)” 是一个否决条件,只要它为
Y,无论其他条件如何,结果都是无折扣。 -
合并相似规则: 对于
C4: 积分>1000这个条件,它只对老用户有效。对新用户来说,这个条件是无关的,它的值可以是Y或N(用“-”表示),结果都一样。
简化后的优化判定表:
| 规则编号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| 条件桩 | |||||||
| C1: 是新用户? | Y | Y | N | N | N | - | - |
| C3: 金额>200? | - | - | Y | Y | N | - | - |
| C4: 积分>1000? | - | - | Y | N | - | - | - |
| C5: 有打折商品? | N | N | N | N | N | Y | Y |
| 动作桩 | |||||||
| 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 | 老用户,订单金额任意,积分任意,有打折商品 | 无折扣 (否决条件测试) |
三、 最佳实践与专家建议
-
适用场景:
-
“如果...并且...或者...那么...”这类结构的业务规则。
-
功能中存在多个逻辑条件组合,且输出结果依赖于这些组合。
-
重要的核心业务逻辑(如支付、风控、计费),需要极高的测试覆盖率。
-
-
先简化,后设计: 直接使用全量表会导致用例爆炸(2^N)。测试专家的价值就在于通过分析条件间的逻辑关系(包含、互斥、依赖)来优化和合并规则,大幅减少冗余用例,同时保证逻辑覆盖率(条件组合覆盖)。
-
发现需求缺陷: 在画表的过程中,你经常会发现需求的歧义、遗漏和矛盾。例如,老用户金额在100到200之间是否有折扣?这就是一个典型的遗漏,需要在设计用例前与产品经理澄清。
-
与其它方法结合: 判定表保证了逻辑覆盖,但表中的具体测试数据(如金额150元)仍然可以使用等价类和边界值来选取(例如,规则3中,金额应该取201元和200元来测试边界)。
总结
对于测试专家而言,判定表不仅仅是一个用例设计工具,更是一个强大的需求分析工具和逻辑梳理工具。它迫使你以一种结构化的、无歧义的方式去理解需求,将模糊的自然语言转化为精确的技术规格,从而设计出逻辑完备、无遗漏的测试用例集。在面对复杂的业务规则时,它是确保软件质量和业务正确性的终极武器。
更多推荐


所有评论(0)