因果图判定表
背景
我们前面介绍的等效类划分法和边界值分析方法,都是着重考虑输入条件,但未考虑输入条件之间的联系,相互作用等。
如果我们考虑多个条件之间的相互组合,可能会产生一种新的情况(组合之后就是一种新的情况)。但要检查输入条件的组合不是一件容易的事情,即使把所有输入条件划分成等价类,它们之间的组合情况也是相当之多,因此必须考虑采用一种不适于描述多种条件的组合,相应产生多个动作的形式来考虑设计测试用例,此时就需要利用因果图方法。
简单的说就是我们往往会有多个条件,不同的条件组合会有不同的结果。
使用场景
需求中存在多个条件及对应结果的场景,因我也不会忘。
因果图判定表分析的步骤
- 列出所有的条件及结果
- 画出判定表
- 简化判定表【简化判定表是有规则的,我们后边会说】
- 根据简化后的判定表中的每种组合分别编写对应的测试用例
补充:判定表的结构如图:

- 条件桩:我们所列出的需求中的所有条件,比如:疲倦,兴趣,糊涂。
- 动作桩:我们所列出需求中的所有结果,比如休息,跳入下一章,重读一遍,继续阅读。
- 条件项:不同条件的组合。
- 动作项:不同条件组合所得出的结果或者说不同条件组合所对应的结果。
- 条件项,到底有多少项?:每个条件有两个值(true/false),则条件项等于2的n次幂,n是条件桩的个数。
- 画判定表要注意一个目的:覆盖所有不同条件组合下不同结果对应的场景。
条件桩决定了输入维度N,条件项是输入的所有可能组合(数量 = 2^N),结果项是每个输入组合对应的输出动作。比如3个条件桩就有8个条件项,每个条件项都有自己对应的动作项。
比如:
如果感到疲倦 则休息,如果不疲倦且不感兴趣 则跳入下一章,如果不疲倦且感兴趣且感到糊涂 则重读一遍,如果不疲倦且感兴趣且不感到糊涂则继续阅读,用判定表描述法处理逻辑。
1、找出需求中的条件和结果
虽然读出来有6个条件可能,但是这里边我们分析出,其实就只有三个条件:只是每一个条件都有两个值,要么做,要么不做。如图:

2、画出判定表
| 条件桩 / 动作桩 | 条件项 | 条件项 | 条件项 | 条件项 | 条件项 | 条件项 | 条件项 | 条件项 |
|---|---|---|---|---|---|---|---|---|
| 疲倦 | Y | Y | Y | Y | N | N | N | N |
| 感兴趣 | Y | Y | N | N | Y | Y | N | N |
| 糊涂 | Y | N | Y | N | Y | N | Y | N |
| 动作桩 | 动作项 | 动作项 | 动作项 | 动作项 | 动作项 | 动作项 | 动作项 | 动作项 |
| 休息 | √ | √ | √ | √ | ||||
| 跳入下一章 | √ | √ | ||||||
| 重读一遍 | √ | |||||||
| 继续阅读 | √ |

3、简化判定表
简化判定表的规则:以合并相似规则为目标,也就是说,如果你的表中出现两条或者两条以上规则具有相同的动作(即相同的结果),并且在条件项之间存在极为相似的关系,则可以合并。如图所示的例子:

简单来说就是只要出现有相同的结果,并且在我们的条件项中有其中一项的值为任意值的情形下,不影响这个结果。那么这样的项可以进行合并。
那分析我们上述的因果判定表,可以合并的项为:

此时合并之后的结果:
| 疲倦 | Y | Y | N | N | N |
|---|---|---|---|---|---|
| 感兴趣 | Y | N | Y | Y | N |
| 糊涂 | - | - | Y | N | - |
| 条件桩 / 动作桩 | 条件项 1 | 条件项 2 | 条件项 3 | 条件项 4 | 条件项 5 |
| 动作桩 | 动作项 1 | 动作项 2 | 动作项 3 | 动作项 4 | 动作项 5 |
| 休息 | √ | √ | |||
| 跳入下一章 | √ | ||||
| 重读一遍 | √ | ||||
| 继续阅读 | √ |

但是此时我们仔细观察,还能再合并:

那么最终合并后的结果为:
| 条件桩 | 条件项 | 条件项 | 条件项 | 条件项 |
|---|---|---|---|---|
| 疲倦 | Y | N | N | N |
| 感兴趣 | - | Y | Y | N |
| 糊涂 | - | Y | N | - |
| 动作桩 | 动作项 | 动作项 | 动作项 | 动作项 |
| 休息 | √ | |||
| 跳入下一章 | √ | |||
| 重读一遍 | √ | |||
| 继续阅读 | √ |

因此原本我们需要测8次,但实际我们简化下来只需要测4次就行了。
4、根据简化后的判定表中的每种组合分别编写对应的测试用例【本例子呢,我们主要是解释如何分析,所以呢,就不做这一步了,那我们后续会有对应的例子】
案例分析
需求:行李托运处理逻辑如下:
航天公司规定,乘客可以免费托运30公斤的行。
当重量超过30公斤的时候,对头等舱的国内乘客超重部分每公斤收费4元。
对其他舱的国内乘客超重部分6元每公斤。
对国外乘客收费多一倍,对残疾乘客收费减半。
用判定表描述以上处理逻辑。
首先看到这个题目,我们分析需求可知,它含有那种有不同的条件组成的不同的结果的含义,所以此时我们就考虑到使用判定表方法。【找多个条件 得到的结果这种语句】
1、找出条件和结果
1)首先你就所有的条件和结果找出来,不分能取还是不能取

2)然后我就将条件合并为一个条件 取两个值(取或者不取)

2、画判定表
| 条件桩 | 条件项 | 条件项 | 条件项 | 条件项 | 条件项 | 条件项 | 条件项 | 条件项 | 条件项 | 条件项 | 条件项 | 条件项 | 条件项 | 条件项 | 条件项 | 条件项 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 30 公斤 | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N | N | N | N | N | N |
| 头等舱 | Y | Y | Y | Y | N | N | N | N | Y | Y | Y | Y | N | N | N | N |
| 国内乘客 | Y | Y | N | N | Y | Y | N | N | Y | Y | N | N | Y | Y | N | N |
| 残疾 | Y | N | Y | N | Y | N | Y | N | Y | N | Y | N | Y | N | Y | N |
| 动作桩 | 动作项 | 动作项 | 动作项 | 动作项 | 动作项 | 动作项 | 动作项 | 动作项 | 动作项 | 动作项 | 动作项 | 动作项 | 动作项 | 动作项 | 动作项 | 动作项 |
| 免费 | √ | √ | √ | √ | √ | √ | √ | √ | ||||||||
| 4 元 /kg | √ | √ | ||||||||||||||
| 6 元 /kg | √ | √ | ||||||||||||||
| 8 元 /kg | √ | |||||||||||||||
| 12 元 /kg | √ | |||||||||||||||
| 2 元 /kg | √ | |||||||||||||||
| 3 元 /kg | √ |

3、简化判定表
分析:

简化之后:
| 条件桩 / 动作桩 | 条件项 1 | 条件项 2 | 条件项 3 | 条件项 4 | 条件项 5 | 条件项 6 | 条件项 7 | 条件项 8 | 条件项 9 |
|---|---|---|---|---|---|---|---|---|---|
| 30 公斤 | Y | N | N | N | N | N | N | N | N |
| 头等舱 | - | Y | Y | Y | Y | N | N | N | N |
| 国内乘客 | - | Y | Y | N | N | Y | Y | N | N |
| 残疾 | - | Y | N | Y | N | Y | N | Y | N |
| 动作桩 | 动作项 1 | 动作项 2 | 动作项 3 | 动作项 4 | 动作项 5 | 动作项 6 | 动作项 7 | 动作项 8 | 动作项 9 |
| 免费 | √ | ||||||||
| 4 元 /kg | √ | √ | |||||||
| 6 元 /kg | √ | √ | |||||||
| 8 元 /kg | √ | ||||||||
| 12 元 /kg | √ | ||||||||
| 2 元 /kg | √ | ||||||||
| 3 元 /kg | √ |

所以简化之后,我们从写16条测试用例变为只需要写9条。
4、根据判定表写测试用例
| 用例编号 | 模块 | 用例标题 | 用例级别 | 预置条件 | 测试步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|---|---|
| 001 | 行李收费模块 | 30 公斤及以内免费 | 高 | 重量:29.9 公斤国籍:任意值舱位:任意值是否残疾:任意值 | 收费:0 元 | ||
| 002 | 行李收费模块 | 头等舱国内残疾乘客超重 2 元 /kg | 高 | 重量:30.1 公斤国籍:中国舱位:头等舱是否残疾:是 | 收费:(30.1-30) 元 ×2=0.2 元 | ||
| 003 | 行李收费模块 | 头等舱国内非残疾乘客超重 4 元 /kg | 高 | 重量:30.1 公斤国籍:中国舱位:头等舱是否残疾:否 | 收费:(30.1-30) 元 ×4=0.4 元 | ||
| 004 | 行李收费模块 | 头等舱国外残疾乘客超重 4 元 /kg | 高 | 重量:30.1 公斤国籍:外国舱位:头等舱是否残疾:是 | 收费:(30.1-30) 元 ×4=0.4 元 | ||
| 005 | 行李收费模块 | 头等舱国外非残疾乘客超重 8 元 /kg | 高 | 重量:30.1 公斤国籍:外国舱位:头等舱是否残疾:否 | 收费:(30.1-30) 元 ×8=0.8 元 | ||
| 006 | 行李收费模块 | 经济舱国内残疾乘客超重 3 元 /kg | 高 | 重量:30.1 公斤国籍:中国舱位:经济舱是否残疾:是 | 收费:(30.1-30) 元 ×3=0.3 元 | ||
| 007 | 行李收费模块 | 经济舱国内非残疾乘客超重 6 元 /kg | 高 | 重量:30.1 公斤国籍:中国舱位:经济舱是否残疾:否 | 收费:(30.1-30) 元 ×6=0.6 元 | ||
| 008 | 行李收费模块 | 经济舱国外残疾乘客超重 6 元 /kg | 高 | 重量:30.1 公斤国籍:外国舱位:经济舱是否残疾:是 | 收费:(30.1-30) 元 ×6=0.6 元 | ||
| 009 | 行李收费模块 | 经济舱国外非残疾乘客超重 12 元 /kg | 高 | 重量:30.1 公斤国籍:外国舱位:经济舱是否残疾:否 | 收费:(30.1-30) 元 ×12=1.2 元 |

正交实验法
背景
上述我们说的因果图判定表,如果他的条件很多的话,那我们的条件项就会特别多。而我们使用因果图判定表,我们的条件都是控制在有限范围内的,多的话我们搞不了。
也就是说,利用因果图来设计测试用例的时候,作为输入条件的原因与输出条件之间的因果关系有时候很难从软件去需求规格说明中得到。往往因果关系非常庞大,以至于据此因果图得到的测试用例数目多的惊人,给软件测试带来沉重的负担,为了有效的合理的减少测试用例的工时和费用,可利用正交实验设计方法进行测试用地的设计。
正交实验法的使用场景
当你的因果关系非常庞大的情况下,一般使用正交实验法进行测试。
如何使用正交实验法进行测试【如何根据正交表进行测试】
正交表的格式:Ln(m的k次幂):
- n:测试的次数,表的行数。
- m:每个条件有几个值
- k:条件的个数

步骤:
- 根据需求,选择需求中需要参与的测试的条件及对应条件的值。
- 选取对应的正交表,正交表中的m的值要小于等于需求条件中最小值的个数 K要小于等于需求条件的个数。
- 根据正交表的每一行进行对应的测试。
以「字符属性设置」为例,正交测试法完整应用流程 📝

一、为什么这个场景适合用正交测试?
这个界面有 4 个独立配置项(条件/因素):
- 字体
- 字符样式
- 字体颜色
- 字号
如果每个配置项有 2 个可选值(水平),全组合测试需要 (2^4=16) 次 ,而正交测试只用 8 次 就能覆盖核心组合,高效且不遗漏关键场景。
二、步骤1:确定「因素」与「水平」
先给每个配置项定义可选取值(水平):
| 因素(配置项) | 水平1(取值1) | 水平2(取值2) |
|---|---|---|
| 字体(F) | 宋体 | 黑体 |
| 字符样式(S) | 常规 | 斜体 |
| 字体颜色(C) | 黑色 | 红色 |
| 字号(Z) | 小四 | 五号 |
这里每个因素取 2 个水平,是最常见的正交场景,也可根据实际选项扩展更多水平。
三、步骤2:选择合适的正交表
- 因素数(条件):4 个
- 水平数(可选值):2 个
- 选择正交表:(L_8(2^7))
- (L_8):需要执行 8 次测试
- (2):每个因素有 2 个水平
- (7):最多可容纳 7 个 2 水平因素(足够放我们的 4 个因素)
四、步骤3:映射因素到正交表列
将 4 个因素分配到正交表的前 4 列:
- 列1 → 字体(F)
- 列2 → 字符样式(S)
- 列3 → 字体颜色(C)
- 列4 → 字号(Z)
(列5~7 暂时空置,不影响测试)
五、步骤4:生成测试用例(正交表行 = 测试用例)
| 试验号 | 字体(列1) | 字符样式(列2) | 字体颜色(列3) | 字号(列4) | 测试用例描述 |
|---|---|---|---|---|---|
| 1 | 1(宋体) | 1(常规) | 1(黑色) | 1(小四) | 设置:宋体、常规、黑色、小四 → 验证显示 |
| 2 | 1(宋体) | 1(常规) | 2(红色) | 2(五号) | 设置:宋体、常规、红色、五号 → 验证显示 |
| 3 | 1(宋体) | 2(斜体) | 1(黑色) | 2(五号) | 设置:宋体、斜体、黑色、五号 → 验证显示 |
| 4 | 1(宋体) | 2(斜体) | 2(红色) | 1(小四) | 设置:宋体、斜体、红色、小四 → 验证显示 |
| 5 | 2(黑体) | 1(常规) | 1(黑色) | 2(五号) | 设置:黑体、常规、黑色、五号 → 验证显示 |
| 6 | 2(黑体) | 1(常规) | 2(红色) | 1(小四) | 设置:黑体、常规、红色、小四 → 验证显示 |
| 7 | 2(黑体) | 2(斜体) | 1(黑色) | 1(小四) | 设置:黑体、斜体、黑色、小四 → 验证显示 |
| 8 | 2(黑体) | 2(斜体) | 2(红色) | 2(五号) | 设置:黑体、斜体、红色、五号 → 验证显示 |
六、步骤5:执行测试与结果分析
- 按上面 8 组用例逐一操作「字符属性设置」界面,保存后查看字符显示效果。
- 验证点:
- 字体是否与选择一致(宋体/黑体)
- 字符样式是否正确(常规/斜体)
- 颜色是否匹配(黑色/红色)
- 字号是否符合(小四/五号)
- 若某组用例显示异常,可快速定位是哪个因素(比如「斜体+红色」组合出问题),高效排查缺陷。
正交测试的核心优势 ✨
- 少测多覆盖:原本 16 次全组合 → 现在 8 次,测试量减半
- 均衡无遗漏:任意两个因素的水平组合(如「宋体+斜体」「黑体+红色」)都被覆盖,不会漏掉关键交互场景
- 易定位问题:缺陷能快速关联到具体因素组合,方便开发修复
最后如果觉得这篇知识的总结对你有帮助,别忘了👍 点赞⭐ 收藏👀 关注,感谢🦀各位老铁的支持。