4. 测试用例设计方法(上):等价类划分法、边界值分析法、因果图法、判定表驱动法
大家好,我是老张。今天咱们聊聊测试用例设计。
说实话,我见过太多测试新手,一上来就凭感觉写用例。结果呢?要么漏测,要么重复。其实,设计测试用例是有章可循的。今天这四种方法,是我个人最常用的基本功。
核心思想:用最少的用例,覆盖最多的场景。别想着穷举,你测不完的。
4.1 等价类划分法
这个方法,说白了就是「分门别类」。把输入数据分成几个组,每个组里挑一个代表来测。
我记得刚入行时,测一个登录框。用户名要求6-18位字母数字。我傻乎乎地测了「abc123」、「testuser2024」、「admin」...测了十几种。后来师傅告诉我:你其实只需要测三类——有效等价类、无效等价类。
我的经验:有效等价类测一个就够了,无效等价类要尽量覆盖全。因为用户总爱乱输入。
具体怎么分?
- 有效等价类:符合需求的数据。比如6-18位字母数字,那「test123」就是一个有效代表。
- 无效等价类:不符合需求的数据。比如小于6位、大于18位、包含特殊字符、空值等等。
举个例子,一个年龄输入框(1-120岁):
| 输入条件 | 有效等价类 | 无效等价类 |
|---|---|---|
| 年龄范围 | 1-120之间的整数 | 0、负数、121、小数、字母、空值 |
注意:我曾经踩过一个坑——只分了有效和无效两类,但没考虑「边界」。比如年龄输入「0」和「121」虽然都是无效,但它们的处理逻辑可能完全不同。所以,等价类划分后,一定要配合边界值分析。
4.2 边界值分析法
你想想看,程序最容易在哪儿出问题?边界!
我做过一个统计,大概70%的缺陷都集中在边界附近。为什么?因为开发写代码时,最容易搞错的就是「大于等于」和「大于」的区别。
边界值分析的核心:取边界点、边界内一点、边界外一点。
比如输入范围是1-100:
- 上点:1 和 100(边界本身)
- 离点:0 和 101(边界外紧邻的点)
- 内点:50(边界内的任意点)
实战技巧:我一般会取「最小值、最小值-1、最小值+1、最大值、最大值-1、最大值+1」这6个值。如果涉及多个边界,比如字符串长度,还要考虑空字符串和超长字符串。
举个代码例子,一个判断成绩等级的函数:
def get_grade(score):
if score >= 90:
return '优秀'
elif score >= 80:
return '良好'
elif score >= 70:
return '中等'
elif score >= 60:
return '及格'
else:
return '不及格'
边界值测试用例:
| 输入 | 预期输出 | 说明 |
|---|---|---|
| 59 | 不及格 | 60的离点 |
| 60 | 及格 | 边界点 |
| 61 | 及格 | 边界内点 |
| 89 | 良好 | 90的离点 |
| 90 | 优秀 | 边界点 |
| 91 | 优秀 | 边界内点 |
小提示:边界值分析不要只盯着数字。字符串长度、列表大小、文件大小,这些都有边界。我曾经测过一个上传功能,文件大小限制10MB,结果用户传了个9.99MB的文件,程序直接崩溃了——因为开发写的是「if size > 10MB」,没考虑浮点数精度。
4.3 因果图法
这个方法,适合处理「条件组合」的场景。说白了,就是多个输入条件互相影响,导致不同的输出结果。
我刚开始学因果图时,觉得画图好麻烦。后来发现,不画图才麻烦——你根本理不清那些复杂的逻辑关系。
因果图的基本元素:
- 原因(输入条件):用圆圈表示,比如「是否登录」、「是否VIP」
- 结果(输出动作):用方框表示,比如「显示折扣价」、「显示原价」
- 关系:与、或、非等逻辑关系
举个例子,一个电商优惠规则:
- 原因1:用户是VIP
- 原因2:商品是促销品
- 结果:享受折扣价
逻辑关系:VIP 或 促销品 → 享受折扣价
我的做法:先画因果图,理清逻辑关系。然后根据因果图生成判定表。这样不容易漏掉组合情况。
4.4 判定表驱动法
判定表,其实就是把因果图「翻译」成表格。它特别适合处理「多个条件、多个结果」的场景。
我记得有一次测一个审批流程,条件有5个,结果有3种。我一开始凭感觉写了20多个用例,结果还是漏了一种组合。后来用判定表,一查——原来有32种组合,我只覆盖了不到一半。
判定表的组成:
| 条件/动作 | 规则1 | 规则2 | 规则3 | 规则4 |
|---|---|---|---|---|
| 条件1:是否VIP | Y | Y | N | N |
| 条件2:是否促销 | Y | N | Y | N |
| 动作:折扣价 | ✓ | ✓ | ✓ | ✗ |
| 动作:原价 | ✗ | ✗ | ✗ | ✓ |
避坑指南:我曾经犯过一个错误——判定表里条件太多,导致规则数量爆炸(2的n次方)。后来我学会了「合并规则」:如果某些条件不影响结果,就把它们合并。比如上面的例子,只要满足VIP或促销,结果都是折扣价,那就可以合并规则1、2、3。
判定表的使用步骤:
- 列出所有条件(输入)
- 列出所有动作(输出)
- 计算规则数量(2的n次方,n为条件数)
- 填充条件组合
- 确定每个组合对应的动作
- 合并冗余规则
实用建议:条件超过4个时,判定表会变得很大。这时候可以考虑「扩展条目判定表」或者「条件分割」。我一般会把条件控制在4个以内,超过就拆分成多个小判定表。
好了,这四种方法讲完了。它们不是孤立的,实际工作中经常组合使用。比如先用等价类划分缩小范围,再用边界值分析补充边界用例,遇到复杂逻辑就用因果图+判定表。嗯,多练练,你也能写出高质量的测试用例。