因果图法是软件测试中的一种黑盒测试设计方法,用于分析"输入条件(原因)"与"输出结果(结果)"之间的逻辑关系,并据此设计测试用例。
一、因果图法的用途
主要用途包括:
-
处理多个输入条件的组合
- 当系统中有多个条件,并且条件之间存在"与、或、非"等逻辑关系时,因果图法特别有用。
-
发现条件组合遗漏
- 可以避免只测试单个条件,而忽略多个条件组合造成的问题。
-
减少测试用例数量
- 通过分析逻辑关系,选择具有代表性的组合,减少不必要的测试。
-
提高测试的系统性
- 将需求中的自然语言转换成逻辑关系,再转换为测试用例,降低遗漏风险。
-
适用于复杂业务规则
- 例如登录、优惠券、权限、贷款审批、订单处理等功能。
二、因果图法的使用步骤
通常包括以下步骤:
1. 分析需求,确定原因和结果
- 原因:输入条件或触发条件
- 结果:系统输出或行为
例如:
用户输入正确的用户名和密码,并且账号未被冻结时,允许登录。
原因可能是:
- C1:用户名正确
- C2:密码正确
- C3:账号未被冻结
结果可能是:
- E1:允许登录
- E2:拒绝登录
2. 明确原因和结果之间的逻辑关系
常见逻辑关系:
- 与(AND):所有条件同时满足
- 或(OR):任意一个条件满足
- 非(NOT):条件不成立
- 恒等:某原因成立导致某结果成立
在上面的例子中:
C1 AND C2 AND C3 → E1
只要其中一个条件不满足,就不能正常登录。
3. 绘制因果图
使用逻辑符号表示条件之间的关系。
简化表示如下:
C1:用户名正确 ─┐
C2:密码正确 ─┼── AND ──> E1:允许登录
C3:账号未冻结 ─┘
4. 加入约束条件
实际业务中,某些条件不能同时成立,或者必须满足特定限制。例如:
- 互斥:两个条件不能同时为真
- 包含:一个条件成立时,另一个条件也必须成立
- 唯一:多个条件中只能有一个成立
- 依赖:某个结果必须依赖某个条件
这一步可以避免生成不符合实际业务的测试组合。
5. 将因果图转换为判定表
判定表列出各种条件组合及其对应结果。
例如登录功能:
| 用户名正确 | 密码正确 | 账号未冻结 | 预期结果 |
|---|---|---|---|
| 是 | 是 | 是 | 允许登录 |
| 否 | 是 | 是 | 拒绝登录 |
| 是 | 否 | 是 | 拒绝登录 |
| 是 | 是 | 否 | 拒绝登录 |
| 否 | 否 | 是 | 拒绝登录 |
| 否 | 是 | 否 | 拒绝登录 |
| 是 | 否 | 否 | 拒绝登录 |
| 否 | 否 | 否 | 拒绝登录 |
6. 根据判定表设计测试用例
为每一行或每个有代表性的组合设计测试数据,并验证实际结果是否符合预期。
三、示例:网上商城优惠券使用
需求如下:
用户购买金额满 100 元,并且用户已登录,或者用户拥有会员资格时,可以使用优惠券。
但是优惠券必须在有效期内。
1. 确定原因和结果
原因:
- C1:订单金额满 100 元
- C2:用户已登录
- C3:用户是会员
- C4:优惠券在有效期内
结果:
- E1:优惠券可以使用
- E2:优惠券不可使用
2. 分析逻辑关系
根据需求:
(C1 AND C2) OR C3
表示:
- 普通用户:订单满 100 元并且已登录
- 会员用户:只要是会员即可满足金额和登录条件
同时还必须满足:
C4
因此完整逻辑是:
[(C1 AND C2) OR C3] AND C4 → E1
3. 设计判定表
| 金额满100元 | 已登录 | 是会员 | 优惠券有效 | 预期结果 |
|---|---|---|---|---|
| 是 | 是 | 否 | 是 | 可以使用 |
| 是 | 否 | 否 | 是 | 不可使用 |
| 否 | 是 | 否 | 是 | 不可使用 |
| 否 | 否 | 是 | 是 | 可以使用 |
| 是 | 是 | 是 | 是 | 可以使用 |
| 是 | 是 | 否 | 否 | 不可使用 |
| 否 | 否 | 是 | 否 | 不可使用 |
| 否 | 是 | 是 | 是 | 可以使用 |
4. 转换成测试用例
测试用例1:普通用户满足条件
- 订单金额:100 元
- 登录状态:已登录
- 会员状态:否
- 优惠券状态:有效
- 预期:优惠券可以使用
测试用例2:普通用户未登录
- 订单金额:100 元
- 登录状态:未登录
- 会员状态:否
- 优惠券状态:有效
- 预期:优惠券不可使用
测试用例3:会员用户订单金额不足
- 订单金额:50 元
- 登录状态:未登录
- 会员状态:是
- 优惠券状态:有效
- 预期:优惠券可以使用
测试用例4:优惠券过期
- 订单金额:200 元
- 登录状态:已登录
- 会员状态:否
- 优惠券状态:无效
- 预期:优惠券不可使用
四、总结
因果图法的核心过程是:
分析需求
↓
确定原因和结果
↓
建立逻辑关系
↓
绘制因果图
↓
转换为判定表
↓
设计测试用例
它尤其适合测试具有多个条件组合和复杂业务规则的系统功能。
这四条测试用例不是随意选择的,而是为了覆盖需求中的关键逻辑分支 和异常情况。
需求逻辑是:
[(订单金额满100元 AND 用户已登录) OR 用户是会员]
AND 优惠券有效
也就是:
- 普通用户必须"金额满100元且已登录"
- 会员用户可以不受金额和登录条件限制
- 无论什么用户,优惠券都必须有效
四条用例分别覆盖的情况
| 测试用例 | 覆盖目的 |
|---|---|
| 普通用户满足条件 | 验证普通用户在所有必要条件满足时,可以使用优惠券 |
| 普通用户未登录 | 验证普通用户缺少"已登录"条件时,不能使用优惠券 |
| 会员用户订单金额不足 | 验证会员资格可以绕过"订单金额满100元"的限制 |
| 优惠券过期 | 验证优惠券有效期是一个必须满足的公共条件 |
1. 普通用户满足条件
金额满100元 = 是
已登录 = 是
是会员 = 否
优惠券有效 = 是
此时:
(是 AND 是) OR 否 = 是
优惠券也有效,所以最终结果是:可以使用。
它验证了正常流程,也就是"正向用例"。
2. 普通用户未登录
金额满100元 = 是
已登录 = 否
是会员 = 否
优惠券有效 = 是
此时:
(是 AND 否) OR 否 = 否
所以结果是:不可使用。
它验证了普通用户缺少登录条件时,系统是否正确拒绝。
3. 会员用户订单金额不足
金额满100元 = 否
已登录 = 否
是会员 = 是
优惠券有效 = 是
此时:
(否 AND 否) OR 是 = 是
所以结果是:可以使用。
这个用例很重要,因为它验证了需求中的"会员可以绕过金额和登录限制"这一特殊规则。
4. 优惠券过期
金额满100元 = 是
已登录 = 是
是会员 = 否
优惠券有效 = 否
前面的用户资格虽然满足,但:
[(是 AND 是) OR 否] AND 否 = 否
所以结果是:不可使用。
它验证了优惠券有效期这个公共限制,防止系统错误地允许使用过期优惠券。
为什么不是只测一条?
如果只测试"普通用户满足条件",只能证明正常情况可用,无法发现:
- 未登录用户是否被拦截
- 会员的特殊权限是否正确
- 过期优惠券是否被禁止
- 逻辑中的 AND、OR 关系是否实现正确
因此,这四条用例分别覆盖了:
正常情况
普通用户条件不满足
会员特殊分支
公共限制条件不满足
不过需要注意,严格来说,这四条是简化后的代表性测试用例,并不一定覆盖所有组合。完整测试还可以增加"普通用户金额不足""会员优惠券过期""会员已登录且金额充足"等组合。