测试用例设计方法:等价类划分法、边界值分析法、因果图法
说到测试用例设计,我见过不少新手一上来就凭感觉写用例。结果呢?要么漏测,要么重复。今天咱们聊聊三种最实用的设计方法。我个人习惯把它们当作工具箱里的三把扳手——各有各的用处。
一、等价类划分法:把无穷变成有限
等价类划分,说白了就是「分堆」。你想想看,一个输入框能接受1到100的整数。难道你要测1、2、3……一直到100?那得测到猴年马月去。
核心思想很简单:把输入数据分成若干「等价类」,每个类里选一个代表就够了。因为同一类里的数据,程序处理方式是一样的。
两种等价类
- 有效等价类:符合需求的数据。比如1-100之间的整数。
- 无效等价类:不符合需求的数据。比如小于1、大于100、非数字等。
重要原则:每个无效等价类要单独测。为什么?因为多个无效输入同时出现时,程序可能只报第一个错误,后面的bug就被「藏」起来了。
举个例子。一个登录功能,用户名要求6-18位字母数字组合。
| 输入条件 | 有效等价类 | 无效等价类 |
|---|---|---|
| 长度 | 6-18位 | 小于6位、大于18位 |
| 字符类型 | 字母+数字 | 含特殊字符、含中文、纯数字、纯字母 |
| 是否为空 | 非空 | 空字符串 |
我在项目中遇到过一件事:有个同事把「纯数字」和「含特殊字符」放在一个用例里测。结果程序只提示了特殊字符错误,数字的问题没暴露出来。后来上线后用户发现纯数字也能注册……嗯,这就是没遵守「无效等价类单独测」的教训。
二、边界值分析法:bug最爱藏在边界
等价类划分解决了「测哪些」的问题,但还不够。经验告诉我,程序在边界处最容易出问题。比如循环的边界、数组的边界、数值范围的边界。
为什么会这样?因为程序员写代码时经常用 <= 还是 < 搞混,或者数组下标从0开始还是从1开始没想清楚。
边界值分析的原则
- 取边界点:最小值、最大值
- 取边界附近:最小值-1、最小值+1、最大值-1、最大值+1
还是刚才1-100的例子。用等价类划分,我们只需要测1、50、100。但用边界值分析,我们要测:0、1、2、99、100、101。
我的习惯:等价类划分和边界值分析总是搭配使用。先分等价类,再在有效等价类的边界上多测几个点。这样既全面又高效。
我记得有一次测试一个分页功能,每页显示20条数据。开发写的代码是 if (pageSize > 20) pageSize = 20。我测了0、1、19、20、21这几个边界值。结果发现传0的时候,程序直接崩了——因为后面有个除以pageSize的操作。这就是边界值的威力。
三、因果图法:理清复杂逻辑
前面两种方法适合单个输入条件。但实际业务中,多个条件之间往往有复杂的组合关系。这时候因果图就派上用场了。
因果图的核心是:找出「因」(输入条件)和「果」(输出结果),然后用逻辑关系把它们连起来。
常见的逻辑关系
- 恒等:因成立,果就成立
- 非:因不成立,果才成立
- 与:所有因都成立,果才成立
- 或:任意一个因成立,果就成立
举个实际例子。一个优惠券系统:
- 条件1:用户是VIP
- 条件2:订单金额满100元
- 条件3:今天是会员日
- 结果:享受8折优惠
业务规则是:VIP用户且满100元,或者会员日且满100元,才能享受8折。
用因果图表示就是:(条件1 AND 条件2) OR (条件3 AND 条件2) → 结果成立。
避坑指南:我曾经遇到过一个复杂的审批流程,有7个条件、4种结果。一开始我直接写用例,写到一半发现漏了好多组合。后来老老实实画了因果图,才把逻辑理清楚。所以别嫌麻烦,复杂逻辑一定要画图。
四、三种方法的配合使用
这三种方法不是孤立的。我一般这样用:
- 先用等价类划分确定测试数据的「大类」
- 再用边界值分析补充边界附近的测试点
- 遇到复杂逻辑时,用因果图梳理条件组合
下面这张图展示了它们的关系:
五、实战案例:一个完整的测试设计
假设我们要测试一个「用户注册」功能,手机号字段要求:11位数字,以1开头,第二位是3、5、7、8、9。
第一步:等价类划分
- 有效:11位、1开头、第二位是3/5/7/8/9
- 无效:长度不是11位、不以1开头、第二位不是3/5/7/8/9、含非数字字符
第二步:边界值分析
- 长度边界:10位、11位、12位
- 首位边界:0开头、1开头、2开头
第三步:因果图分析
如果还有「验证码」和「同意协议」两个条件,那就需要画因果图了。比如:手机号有效 AND 验证码正确 AND 已同意协议 → 注册成功。
小技巧:因果图画完后,可以转成判定表。判定表能保证每个条件组合都不遗漏。我一般用Excel画判定表,一行一个组合,一目了然。
好了,这三种方法就聊到这儿。等价类划分帮你「分堆」,边界值分析帮你「守边」,因果图帮你「理关系」。下次写用例时,不妨试试这个组合拳。