等价类划分是什么
等价类划分把输入域切成若干区间,同一区间内任一取值预期产生相同行为,因此每类只需取一个代表值做用例,就能用最少用例覆盖最大的输入空间。它是黑盒用例设计的基础方法:Myers《The Art of Software Testing》系统阐述,ISTQB 大纲收录为通用技术。划分时必须同时给出有效类(合法输入)与无效类(非法输入),两者共同构成完整集合;实际工作中通常先划分等价类,再对每类的边界单独做边界值分析。划分的粒度服务于风险:类划得越细用例越多,划得越粗漏检风险越高,用历史缺陷数据校正粒度比凭感觉细划更有效。
基本信息
| 方法类别 | 黑盒用例设计,基于输入域分析 |
|---|---|
| 核心判据 | 同一等价类中任取一个值,预期结果相同 |
| 适用输入 | 数值范围、枚举、布尔、集合、字符串格式 |
| 产出物 | 每个等价类的代表值及预期结果 |
| 常配合使用 | 边界值分析、决策表、场景法 |
| 覆盖口径 | 有效类与无效类都要划分并覆盖 |
典型使用场景
- 表单校验规则:年龄、金额、数量等数值区间输入
- 枚举与下拉:支付状态、单据类型等有限取值集合
- 格式类输入:手机号、邮箱、身份证号的位数与字符集约束
- 数据库字段约束:长度上限、非空、唯一键冲突路径
- 接口参数校验:必填项缺失、类型错误、超长字符串
- 验收标准拆解:把用户故事里的输入条件逐条映射成等价类
- 组合爆炸裁剪:先用等价类收敛每个维度的取值再谈组合
示例:18 到 60 周岁可办卡
示例:18 到 60 周岁可办卡
# 有效类:18 ≤ age ≤ 60,代表值取区间中值 25
# 无效类一:age < 18,代表值取 10
# 无效类二:age > 60,代表值取 70
# 无效类三:非数字输入,代表值取 abc
# 无效类四:空值,代表值取 None
# 用例:25 -> 可办卡;10/70/abc/None -> 拒绝并给出对应提示常见输入的划分
| 输入类型 | 有效类示例 | 无效类示例 | 划分要点 |
|---|---|---|---|
| 数值范围 | 18 到 60 | 小于 18、大于 60 | 分段规则变化时按段拆分 |
| 枚举 | 状态为 paid | 未知状态、空状态 | 核对系统间枚举字典一致性 |
| 布尔 | true 或 false | 空值、字符串 yes | 注意隐式类型转换的边界 |
| 字符串格式 | 11 位数字手机号 | 位数不足、含字母 | 位数与字符集是两个维度 |
| 集合 | 1 到 5 个元素 | 0 个、超过 5 个 | 空集合常触发独立代码路径 |
同类只取一个代表值,取多个是重复劳动;选择代表值时可优先靠近区间边界(如 18、60),把边界值分析的用例一并覆盖掉。
无效类覆盖要逐个来:一次只放一个非法值,其余输入保持合法,否则失败时无法判断是哪条校验拦下的;多个非法值叠加属于反模式,详见 equivalence-invalid 条目。
同一维度内部行为不一致时必须拆分:例如折扣从 100 元、500 元分段后折扣率不同,应按分段拆成多个等价类,否则会漏掉分支缺陷。
接口与数据库字段的等价类要单独核一遍:前端校验通过不代表后端也拦住;两侧规则不一致时,脏数据会从缺口进入,事后清洗与修复的成本远高于补一条用例。
划分不是一次性的:线上每次出现新缺陷,都应回溯它落在哪个未划分或划分错误的等价类上,把代表值补给用例集。