用例设计基础:等价类划分法、边界值分析法、因果图法
聊到用例设计,很多新手第一反应就是「凭感觉写」。说实话,我刚入行那会儿也这样。直到有一次,我负责一个支付模块的测试,漏了一个边界值,结果线上出现了金额溢出的bug。从那以后,我老老实实把等价类和边界值当成了基本功来练。
今天咱们就把这三个最经典的方法掰开揉碎讲清楚。你想想看,测试用例设计说白了就两件事:怎么选数据和怎么定逻辑。等价类和边界值解决的是数据选择问题,因果图解决的是逻辑组合问题。
等价类划分法:用最少的数据覆盖最多的场景
等价类的核心思想很简单——把输入数据分成若干「等价」的组,每组里随便挑一个值测试就行。因为理论上,同一组里的数据,程序处理方式是一样的。
核心原则:每个等价类至少覆盖一个测试用例
我个人习惯把等价类分成两种:
- 有效等价类:符合需求、程序应该正常处理的数据
- 无效等价类:不符合需求、程序应该拒绝或报错的数据
举个例子,一个输入框要求输入1-100的整数:
| 类型 | 等价类 | 示例值 |
|---|---|---|
| 有效等价类 | 1到100之间的整数 | 50 |
| 无效等价类1 | 小于1的整数 | -5 |
| 无效等价类2 | 大于100的整数 | 200 |
| 无效等价类3 | 非整数(小数、字符、空值) | 3.14, "abc", 空 |
我的经验:无效等价类往往比有效等价类更容易漏掉。我曾经测试一个注册功能,只测了有效数据,结果用户输入特殊字符时系统直接崩溃了。所以,无效等价类至少要占用例总数的40%。
边界值分析法:bug最喜欢藏在边界上
为什么要单独讲边界值?因为程序员的代码里,判断条件通常长这样:if (x >= 1 && x <= 100)。你想想看,最容易写错的是哪个部分?就是边界上的 >= 和 <= 啊。
边界值分析法的原则是:取边界值、边界值-1、边界值+1。还是上面那个1-100的例子:
- 上点:1 和 100(边界本身)
- 离点:0 和 101(边界两侧最近的值)
- 内点:50(边界内的任意值,其实等价类已经覆盖了)
实际测试时,我们通常用边界值+等价类的组合策略。比如:
测试数据:0, 1, 50, 100, 101
覆盖分析:
- 0:无效等价类 + 下边界离点
- 1:有效等价类 + 下边界上点
- 50:有效等价类 + 内点
- 100:有效等价类 + 上边界上点
- 101:无效等价类 + 上边界离点
避坑指南:我曾经遇到过一个日期选择器,边界值只测了月份的天数边界,没测跨年边界。结果12月31日切换到1月1日时,年份计算出了bug。记住:边界不只有数值边界,还有逻辑边界、时间边界、状态边界。
因果图法:当多个条件互相影响时
等价类和边界值解决的是「单个输入」的问题。但实际业务中,往往是多个条件组合决定一个结果。比如:
场景:一个登录功能,用户输入用户名和密码。如果用户名正确且密码正确,登录成功;如果用户名错误或密码错误,提示错误;如果连续3次失败,账号锁定。
这里就有三个条件(用户名正确、密码正确、失败次数)和三个结果(登录成功、提示错误、账号锁定)。用因果图法,我们这样分析:
- 列出原因(输入条件):C1=用户名正确,C2=密码正确,C3=失败次数≥3
- 列出结果(输出动作):E1=登录成功,E2=提示错误,E3=账号锁定
- 画出因果关系:C1且C2 → E1;非(C1且C2) → E2;C3 → E3
- 生成决策表:把条件组合全部列出来
决策表长这样:
| 条件/动作 | 规则1 | 规则2 | 规则3 | 规则4 |
|---|---|---|---|---|
| C1: 用户名正确 | Y | Y | N | N |
| C2: 密码正确 | Y | N | Y | N |
| C3: 失败≥3次 | N | N | N | N |
| E1: 登录成功 | ✓ | |||
| E2: 提示错误 | ✓ | ✓ | ✓ | |
| E3: 账号锁定 |
嗯,这里要注意,实际项目中条件往往不止3个。如果有4个条件,组合数就是2^4=16种。这时候因果图的价值就体现出来了——它能帮你系统化地找出所有组合,而不是靠拍脑袋。
实用技巧:因果图法最适合用在「条件多、结果少」的场景。比如权限校验、状态流转、规则引擎。如果条件超过6个,建议先合并等价类,再画因果图,否则决策表会膨胀到无法维护。
三种方法的配合使用
实际工作中,我不会只用一种方法。我的套路是这样的:
- 先用等价类划分:把输入数据分组,确定有效和无效范围
- 再用边界值分析:在每个等价类的边界上补充测试数据
- 最后用因果图:梳理条件之间的逻辑关系,生成决策表
举个例子,测试一个电商的优惠券功能:
- 等价类:满减券、折扣券、免邮券(不同类型)
- 边界值:满100减20,那边界就是99、100、101
- 因果图:优惠券是否过期 + 是否达到门槛 + 是否叠加使用 → 最终优惠金额
你看,三个方法各司其职,组合起来就能覆盖绝大多数场景。
我的习惯:写用例之前,先花10分钟画一张因果图。别嫌麻烦,这10分钟能帮你省下后面2小时的返工时间。我曾经就是因为没画因果图,漏了一个「已退款订单不能再次退款」的组合,结果线上出了重复退款的事故。
知识体系总览
下面这张图是我自己总结的,把三个方法的关系和适用场景画清楚了:
说白了,这三个方法就是测试用例设计的「三板斧」。等价类帮你选数据,边界值帮你查漏洞,因果图帮你理逻辑。三者配合,基本能覆盖90%以上的场景。
最后说一句,方法再好,也得落地。我建议你下次写用例时,先别急着动手,花5分钟想想:这个功能属于「单输入」还是「多条件」?然后对应选择方法。慢慢养成习惯,你会发现用例质量提升一大截。