一、等价类划分法:用最少的用例,测最多的情况
1.1 它解决什么问题?
我们在测试一个密码输入框时,经常会遇到这种需求:密码必须是8-16位的英文字母、数字、字符组合(不能是纯数字)。
如果按"穷举法"来测,那得测多少种组合?无穷无尽。
等价类划分法的核心思想就是:把输入数据分成几类,每一类里选一个"代表"来测试就够了。
1.2 怎么划分?
以"微信注册密码 8-16位,英文字母+数字+字符组合,不能是纯数字"为例:
| 类型 | 说明 | 例子 |
|---|---|---|
| 有效等价类 | 符合所有规则的输入 | abc12345(8位,字母+数字) |
| 无效等价类① | 长度不足 | abc12(5位) |
| 无效等价类② | 长度超长 | abc12345678901234(17位) |
| 无效等价类③ | 纯数字(违反"不能纯数字"规则) | 12345678 |
| 无效等价类④ | 纯字母(不含数字或字符) | abcdefgh |
| 无效等价类⑤ | 含非法字符(如空格、中文) | abc 1234 |
注意:每个无效等价类都要单独测一条,不能只测一个代表。
1.3 我自己动手试了一下
我拿着微信注册的密码框实际测了一轮:
✅
Abc123!@(8位,字母+数字+字符)→ 符合规则✅
Abc123!@#456(12位,混合组合)→ 符合规则❌
abc12(5位)→ 报错"密码长度需为8-16位"❌
abc12345678901234(17位)→ 报错"密码长度需为8-16位"❌
12345678(纯数字)→ 报错"密码不能为纯数字"❌
abcdefgh(纯字母)→ 报错"密码需包含字母、数字或字符组合"❌
abc 1234(含空格)→ 报错"密码包含非法字符"
我只用了7个用例,就把所有情况覆盖了,而不是盲目地乱测一通。
二、边界值分析法:Bug最喜欢藏在"边界"上
2.1 为什么需要边界值分析?
等价类虽然好用,但它有个盲区——边界上的值最容易出错。
还是以"密码8-16位"为例,8位和16位是边界,7位和17位是刚好越界。程序员的代码里经常是if (len >= 8 && len <= 16)这种逻辑,边界上的=号有没有写对,就是最容易出Bug的地方。
2.2 三个关键概念
| 术语 | 我的理解 | 例子(8-16位) |
|---|---|---|
| 上点 | 边界上的点,正好等于边界值 | 8 和 16 |
| 离点 | 离上点最近的点,刚好越过边界 | 7 和 17 |
| 内点 | 范围内的任意一个点 | 12(或9、10都行) |
⚠️我一开始卡住的地方:分不清"离点"到底是取边界内还是边界外。
✅搞懂之后的理解:
如果是闭区间[8, 16],离点取外部,即 7 和 17
如果是开区间(8, 16),离点取内部,即 9 和 15
大部分实际需求都是闭区间,所以离点 = 刚好越界的那个数,这么记最简单。
2.3 等价类 + 边界值,搭配使用效果更好
通常先用等价类划分出大类,再用边界值补充边界上的测试点。
以"密码8-16位"为例:
| 测试数据 | 覆盖的方法 | 预期结果 |
|---|---|---|
| 7位密码 | 边界值(离点) | 报错"长度不足" |
| 8位密码 | 边界值(上点) | 符合规则 |
| 12位密码 | 等价类(内点) | 符合规则 |
| 16位密码 | 边界值(上点) | 符合规则 |
| 17位密码 | 边界值(离点) | 报错"长度超长" |
5个用例,既覆盖了等价类,又覆盖了边界值,效率极高。
三、判定表法
除了等价类和边界值,还有一种方法叫判定表法,它适用于"多个条件之间有组合关系"的场景。
比如:用户注册时,同时满足"手机号格式正确 + 验证码正确 + 密码符合规则"才能成功。
每个条件都有"真/假"两种可能,组合起来就是 2ⁿ 种情况。判定表就是把这些组合列成表格,然后筛选出有效的测试点。
四、等价类 + 边界值 速查卡
这张表浓缩了全文最核心的内容,写用例时可以直接对照。
| 场景 | 怎么做 | 口诀 |
|---|---|---|
| 划分等价类 | 有效类挑1个代表;无效类每个单独测 | "有效的测一个,无效的全测到" |
| 确定上点 | 就是边界值本身 | "边界上的点,一个不能少" |
| 确定离点 | 闭区间取外面,开区间取里面 | "闭测外,开测内" |
| 确定内点 | 范围内随便选1个 | "范围内,意思一下" |
| 组合策略 | 先用等价类筛大类,再用边界值补边角 | "等价类砍数量,边界值抓重点" |
密码8-16位场景的快速测试点:
| 测试数据 | 测什么 |
|---|---|
abc12345(8位) | 上点(最短边界) |
abc123456789abcd(16位) | 上点(最长边界) |
abc123(6位) | 离点(最短-1) |
abc123456789abcde(17位) | 离点(最长+1) |
abc1234567(10-12位左右) | 内点(中间值) |
12345678(纯数字) | 无效等价类(违反规则) |