前置知识: 软件工程与测试

等价类划分

5 min中级

等价类划分法:测试用例设计方法、有效/无效等价类、边界值结合应用详解。

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”提示过短无效长度(短)
TC321个a提示过长无效长度(长)
TC4“user@name”提示非法字符无效字符
TC5""提示必填空值

3.2 实例2:日期输入

需求:输入年份(1900-2100)、月份(1-12)、日期。

输入有效等价类无效等价类
年份1900-2100<1900, >2100, 非数字
月份1-120, 13, 非数字
日期1-28(通用)0, 29+, 非数字
日期(31天月)29-3132+
日期(30天月)29-3031
日期(2月平年)1-2829、30、31
日期(2月闰年)1-2930、31

3.3 实例3:购物金额折扣

需求:

  • 金额 < 100:无折扣
  • 100 ≤ 金额 < 500:9 折
  • 500 ≤ 金额 < 1000:8 折
  • 金额 ≥ 1000:7 折
等价类类型值预期折扣
0 < 金额 < 100有效50无
100 ≤ 金额 < 500有效2009折
500 ≤ 金额 < 1000有效7008折
金额 ≥ 1000有效15007折
金额 ≤ 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. 最佳实践

实践描述
先有效后无效优先确保正常流程
每个无效类独立用例避免缺陷掩盖
结合边界值提高缺陷发现率
考虑隐含需求非显式约束
持续更新需求变更时更新等价类

「每个无效类独立用例」值得强调:一条用例同时输入非法长度 + 非法字符 + 空值,系统往往在第一个校验就拦截,后面的非法输入根本没被执行——即使 全部报错通过,你也不知道另外两个校验是否存在。无效等价类要一次验一个。

小结

  • 初学者要点:按范围/枚举/布尔/必填/格式五类规则划分有效与无效等价类, 每类取一个代表值;无效类每条用例只验一个;先等价类定范围,再边界值 选点。
  • 进阶注意:等价类假设「类内行为一致」,对依赖状态或时序的逻辑不成立, 此时改用状态转换或判定表;多输入组合用正交/成对压缩用例数,参数越多 收益越大;等价类是活文档,需求变了要跟着重划。