等价类划分是黑盒测试核心用例设计方法。核心思想:把输入域划分成若干等价类,同一类内的数据具有相同处理逻辑,从每个等价类选取代表性数据,用少量用例覆盖大量输入场景,避免穷举测试。 等价类分为:有效等价类(合法输入)、无效等价类(非法输入)。
一、完整实施步骤(落地流程)
1. 梳理输入条件,划分等价类
先提取所有输入项:文本长度、数值范围、字符类型、必填 / 可选、枚举选项等。
有效等价类:符合需求规格,程序可正常接收处理
无效等价类:违反规则,程序应识别并拦截、提示错误
划分原则:子集内输入具有等价效果;等价类之间互不相交。
示例:用户账号,要求 6~16 位字母 + 数字
2. 给每个等价类编号
方便后续编写用例、做覆盖率统计。 例: 有效等价类①:账号 6~16 位字母数字 无效等价类②:长度 <6;③长度> 16;④含特殊字符;⑤中文
3. 设计测试用例,优先覆盖有效类
一条用例尽量覆盖多个有效等价类,减少用例数量; 一条用例只覆盖一个无效等价类(关键!)
原因:多个错误同时输入,程序可能只触发第一个校验,掩盖其他 bug,无法确认每个单独非法场景是否正常拦截。
上面例子: ✅有效用例:
test123覆盖① ❌无效用例 1:t1覆盖② ❌无效用例 2:testtesttest12345覆盖③ ❌无效用例 3:test@123覆盖④ ❌无效用例 4:测试账号覆盖⑤
4. 补充边界值(等价类最佳搭档)
等价类本身不重点关注边界点,单纯等价类会漏掉边界缺陷,实际项目中一般等价类 + 边界值组合使用,大幅提升覆盖率。
上例边界:6 位、16 位、5 位、17 位。
二、怎么提高测试覆盖率(核心要点)
1. 不要只看输入,还要覆盖输出、内部状态
很多人只划分输入等价类,忽略:
输出结果等价类(成功、业务异常、系统报错)
状态等价类(订单:待支付 / 已支付 / 已取消)
接口参数、请求方式、权限身份等价类
例:订单退款,不同订单状态构成等价类,不同状态下退款逻辑不同,必须分开覆盖。
2. 拆分复合条件,避免大而笼统的等价类
当输入是多个条件组合(比如:手机号 + 验证码 + 勾选协议),不要合并成一个等价类。
错误做法:等价类 = 全部合法输入
正确做法:把每个条件拆成独立等价类,再组合用例,防止漏掉单项非法场景
3. 区分独立等价类,不要合并无效等价类
重点规则:无效等价类,每次只测一个错误。 如果同时传入「长度太短 + 包含特殊字符」,程序返回报错,你无法判断是拦截长度,还是拦截特殊字符。单独测试才能保证每个校验逻辑都被覆盖。
4. 挖掘隐性需求等价类(提升隐性场景覆盖率)
需求文档写的是显性规则,但存在隐性等价类:
空值、空格、全角空格
大小写、前后空格
输入为 null、空字符串 很多线上 bug,都是隐性等价类没覆盖。
示例:用户名允许字母,隐性场景:
Test01(前后空格),是否自动 trim?是否当作非法字符?单独划为等价类。
5. 统计等价类覆盖率指标
等价类覆盖率公式:
\(等价类覆盖率 = \frac{已覆盖等价类数量}{总等价类数量} ×100\%\) 目标:100% 等价类覆盖,代表所有划分出来的有效 / 无效等价类都至少有一条用例命中。
⚠️注意:100% 等价类覆盖 ≠ 100% 代码覆盖,黑盒不看代码,仍然可能遗漏代码分支缺陷。
6. 等价类 + 其他方法组合,补齐短板
等价类短板:不关注边界、不关注多条件组合。工程上组合使用:
等价类划分 + 边界值分析:覆盖范围最常用组合
复杂多条件(多个输入互相影响):再加判定表,处理条件组合场景
状态流转类功能:加状态迁移法
三、常见踩坑(会降低覆盖率)
等价类划分太粗:一类里面差异很大,选一个样本测不到内部不同逻辑
多个无效条件放同一个用例:缺陷被掩盖,校验逻辑覆盖不全
只测有效等价类,忽略无效等价类:大量异常场景缺失
只看显性需求,忽略空、空格、全角、null 等隐性等价类
把等价类覆盖率等同于代码覆盖率,误以为 100% 等价覆盖就足够
四、简单实战总结
提取所有输入 / 状态 / 输出条件
划分有效、无效等价类,编号;拆分隐性输入
有效用例尽量多覆盖有效类;无效用例每次仅一个错误
搭配边界值;复杂条件增加判定表
统计等价类覆盖率,保证全部等价类都被覆盖