等价类划分
等价类划分法:测试用例设计方法、有效/无效等价类、边界值结合应用详解。
1. 等价类划分原理
1.1 基本概念
等价类划分是将输入域划分为若干等价类,从每个等价类中选取代表性值作为测试用例。同一等价类中的值对揭露缺陷的效果相同。
1.2 核心假设
如果某个等价类中的一个值能发现缺陷,则该类中其他值也能发现;反之,如果某个值不能发现缺陷,则该类中其他值也不能。
1.3 优势
| 优势 | 描述 |
|---|---|
| 减少用例数 | 每个等价类只取代表值 |
| 提高效率 | 避免冗余测试 |
| 系统化 | 有规律的划分方法 |
| 覆盖全面 | 有效+无效等价类 |
2. 有效等价类与无效等价类
2.1 定义
| 类型 | 定义 | 示例(年龄 1-120) |
|---|---|---|
| 有效等价类 | 符合需求的输入集合 | 25(1 ≤ age ≤ 120) |
| 无效等价类 | 不符合需求的输入集合 | -1, 0, 121, “abc” |
2.2 划分规则
| 输入条件 | 有效等价类 | 无效等价类 |
|---|---|---|
| 范围 | 范围内 | 小于下界、大于上界 |
| 枚举 | 枚举值之一 | 非枚举值 |
| 布尔 | true/false | 非布尔值 |
| 必填 | 有值 | 空值 |
| 格式 | 符合格式 | 不符合格式 |
3. 等价类划分实例
3.1 实例1:用户名注册
需求:用户名长度 6-20 个字符,仅允许字母、数字和下划线。
| 等价类 | 类型 | 值 |
|---|---|---|
| 长度 6-20 | 有效 | “user01” |
| 长度 < 6 | 无效 | “usr” |
| 长度 > 20 | 无效 | “a”*21 |
| 字母数字下划线 | 有效 | “user_name1” |
| 含特殊字符 | 无效 | “user@name” |
| 空值 | 无效 | "" |
测试用例:
| 用例 | 输入 | 预期结果 | 覆盖等价类 |
|---|---|---|---|
| TC1 | “user01” | 注册成功 | 有效长度+有效字符 |
| TC2 | “usr” | 提示过短 | 无效长度(短) |
| TC3 | 21个a | 提示过长 | 无效长度(长) |
| TC4 | “user@name” | 提示非法字符 | 无效字符 |
| TC5 | "" | 提示必填 | 空值 |
3.2 实例2:日期输入
需求:输入年份(1900-2100)、月份(1-12)、日期。
| 输入 | 有效等价类 | 无效等价类 |
|---|---|---|
| 年份 | 1900-2100 | <1900, >2100, 非数字 |
| 月份 | 1-12 | 0, 13, 非数字 |
| 日期 | 1-28(通用) | 0, 29+, 非数字 |
| 日期(31天月) | 29-31 | 32+ |
| 日期(30天月) | 29-30 | 31 |
| 日期(2月平年) | 1-28 | 29、30、31 |
| 日期(2月闰年) | 1-29 | 30、31 |
3.3 实例3:购物金额折扣
需求:
- 金额 < 100:无折扣
- 100 ≤ 金额 < 500:9 折
- 500 ≤ 金额 < 1000:8 折
- 金额 ≥ 1000:7 折
| 等价类 | 类型 | 值 | 预期折扣 |
|---|---|---|---|
| 0 < 金额 < 100 | 有效 | 50 | 无 |
| 100 ≤ 金额 < 500 | 有效 | 200 | 9折 |
| 500 ≤ 金额 < 1000 | 有效 | 700 | 8折 |
| 金额 ≥ 1000 | 有效 | 1500 | 7折 |
| 金额 ≤ 0 | 无效 | -10 | 错误 |
| 非数字 | 无效 | “abc” | 错误 |
4. 等价类与边界值结合
4.1 结合策略
等价类划分确定范围,边界值分析选择具体值。
示例:输入范围 1-100
| 方法 | 选取值 |
|---|---|
| 等价类 | 50(有效), 0(无效), 101(无效) |
| 边界值 | 0, 1, 2, 99, 100, 101 |
| 结合 | 0, 1, 2, 50, 99, 100, 101 |
4.2 完整测试用例设计流程
1. 分析需求 → 提取输入条件
2. 划分等价类 → 有效+无效
3. 边界值补充 → 在边界附近取值
4. 组合测试用例 → 覆盖所有等价类
5. 补充异常场景 → 空值、超时等
5. 多输入组合
5.1 组合策略
| 策略 | 描述 | 用例数 |
|---|---|---|
| 全组合 | 所有等价类组合 | 最多 |
| 正交实验 | 正交表选择组合 | 适中 |
| 成对测试 | 每对参数至少组合一次 | 较少 |
5.2 成对测试示例
成对测试的价值随参数数量增长:只有两个参数时,每对组合就是全组合, 省不掉;三个及以上参数才开始显著压缩用例数。
| 参数 | 等价类 |
|---|---|
| 浏览器 | Chrome, Firefox, Safari |
| 操作系统 | Windows, macOS, Linux |
| 语言 | 中文, 英文, 日文 |
三个参数各 3 个等价类,全组合 3³ = 27 条;用成对测试约 9 条即可让 「任意两个参数的任意等价类组合」都至少出现一次。借助 pairwise 工具 (如 Microsoft 的 PICT、Python 的 allpairspy)可自动生成用例表。
6. 最佳实践
| 实践 | 描述 |
|---|---|
| 先有效后无效 | 优先确保正常流程 |
| 每个无效类独立用例 | 避免缺陷掩盖 |
| 结合边界值 | 提高缺陷发现率 |
| 考虑隐含需求 | 非显式约束 |
| 持续更新 | 需求变更时更新等价类 |
「每个无效类独立用例」值得强调:一条用例同时输入非法长度 + 非法字符 + 空值,系统往往在第一个校验就拦截,后面的非法输入根本没被执行——即使 全部报错通过,你也不知道另外两个校验是否存在。无效等价类要一次验一个。
小结
- 初学者要点:按范围/枚举/布尔/必填/格式五类规则划分有效与无效等价类, 每类取一个代表值;无效类每条用例只验一个;先等价类定范围,再边界值 选点。
- 进阶注意:等价类假设「类内行为一致」,对依赖状态或时序的逻辑不成立, 此时改用状态转换或判定表;多输入组合用正交/成对压缩用例数,参数越多 收益越大;等价类是活文档,需求变了要跟着重划。