一个例子理解因果图法

因果图法是软件测试中的一种黑盒测试设计方法,用于分析"输入条件(原因)"与"输出结果(结果)"之间的逻辑关系,并据此设计测试用例。

一、因果图法的用途

主要用途包括:

  1. 处理多个输入条件的组合

    • 当系统中有多个条件,并且条件之间存在"与、或、非"等逻辑关系时,因果图法特别有用。
  2. 发现条件组合遗漏

    • 可以避免只测试单个条件,而忽略多个条件组合造成的问题。
  3. 减少测试用例数量

    • 通过分析逻辑关系,选择具有代表性的组合,减少不必要的测试。
  4. 提高测试的系统性

    • 将需求中的自然语言转换成逻辑关系,再转换为测试用例,降低遗漏风险。
  5. 适用于复杂业务规则

    • 例如登录、优惠券、权限、贷款审批、订单处理等功能。

二、因果图法的使用步骤

通常包括以下步骤:

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 关系是否实现正确

因此,这四条用例分别覆盖了:

复制代码
正常情况
普通用户条件不满足
会员特殊分支
公共限制条件不满足

不过需要注意,严格来说,这四条是简化后的代表性测试用例,并不一定覆盖所有组合。完整测试还可以增加"普通用户金额不足""会员优惠券过期""会员已登录且金额充足"等组合。

相关推荐
更深兼春远2 天前
Python到底怎么用于测试?
自动化测试·软件测试·python·接口测试
尚云第三方软件测试3 天前
数字化项目验收测试:性能、易用性、可靠性一体化框架
软件测试·软件测评·软件验收测试
sir.山3 天前
Fiddler抓包IOS流程
软件测试·fiddler·ios抓包·fiddler抓包工具
测试老哥7 天前
接口测试的测试用例应该怎么写?
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
daopuyun7 天前
实验室CMA软件测试资质认证,质量管理体系文件编写思路整理
软件测试·cma资质
程序员杰哥7 天前
UI自动化测试:Jenkins配置
自动化测试·软件测试·python·测试工具·职场和发展·jenkins·测试用例
测试19989 天前
Jmeter接口自动化测试:Jmeter变量的使用
自动化测试·软件测试·测试工具·jmeter·职场和发展·测试用例·接口测试
降临-max10 天前
从零开始快速开发一个 AI 辅助测试设计智能体(附完整源码)
软件测试·人工智能·大模型·agent·ai测试智能体