跳到主要内容

等价类划分

等价类划分是把预期按同一规则处理的取值归成一类,再从每类选择代表值进行测试。它减少的是重复验证同一种行为的输入,而不是把所有“看起来类似”的数据随意合并。

例如,购买数量要求为 1 到 99 的整数。0 和 100 都应拒绝,但它们分别检验下限与上限;只选一个无效值,另一条限制可能完全没有被验证。

1. 面试核心​

先记住这几条,再读正文
  • 划分依据是预期处理规则相同,不是数值接近或外观相似。类型、范围和业务状态都可以形成不同类别。卡 · 划分过程
  • 同一划分维度中的类别应互不重叠,并覆盖约定的取值范围。空值、字段缺失和类型错误需要按契约判断,不能自动并入正常值。卡 · 划分过程
  • 代表值有效的前提是划分假设合理;一个代表通过不能证明类内每个值都正确。边界、特殊编码和实现差异可能要求进一步拆分。卡 · 代表值与划分假设
  • 验证单个无效条件时,其他输入先保持有效,避免前面的错误掩盖目标校验;多个无效条件组合另行检查优先级规则。卡 · 无效输入隔离与多字段

2. 划分过程​

先把约束写清楚,再按规则划分。假设 API 的 quantity 是必填 JSON 字段,值必须为整数,范围为 1 到 99;字符串不自动转换,布尔值也不算数量。

可以用“先类型、再范围”的层次整理:

类别代表输入预期
字段缺失不发送 quantity缺少字段错误
空值null类型错误
布尔值true类型错误
字符串"2"类型错误,不自动转成整数
非整数数值2.5类型错误
数组或对象[]、{}类型错误;按实现差异分别取样
整数且小于 10下限错误
1 到 99 的整数25接受并按该数量处理
整数且大于 99100上限错误

这份表的“预期”来自示例契约,而不是通用 HTTP 规则。真实接口如果允许数值字符串,字符串就需要继续拆为可解析、不可解析以及解析后超范围等类别。

同样,1.0 是否被当成整数,要在 API 契约和解析层确定。不要把 Python 的 int、JSON 的 number 和业务上的整数直接当成同一个概念。测试应面向接口承诺的表示与行为。

3. 代表值与划分假设​

有效等价类包含满足当前约束的值,无效等价类包含违反该约束的值。有效只描述输入是否合法,不表示程序收到它就一定能成功;库存不足仍可能让合法数量无法完成购买。

从有效整数区间选择 25,可以检查一条普通成功路径。若实现错误地只接受奇数,这个代表就发现不了问题。类内等价是我们基于规则作出的测试假设,需要用边界、代码信息和历史缺陷修正。

拆分类别的理由应具体。例如用户名允许 Unicode,而存储层有长度限制,可以按 ASCII、多字节字符和组合字符补样本,检查字符计数与字节存储是否一致。不能仅仅因为测试数据很多就全部加进来,也不能因为它们都“是字符串”就只留一个英文名字。

连续范围的交界检查见 边界值分析。两种方法配合时,类内代表说明普通行为,边界值核对规则切换的位置。

4. 无效输入隔离与多字段​

测试目标是数量上限时,账号、商品和身份凭证都应先有效。如果凭证过期,系统可以在读取 quantity 之前拒绝请求;得到一个错误响应并不能证明数量校验起作用。

因此可以分两轮:

  1. 每次只引入一个目标无效条件,核对它的错误类型和没有产生的副作用。
  2. 再组合多个无效条件,验证错误优先级、一致的返回结构和防护顺序。

第二轮也有价值,例如应先校验身份还是先泄露某个商品是否存在。但它不能代替第一轮对每条规则的独立检查。

多个字段各自覆盖所有类别,也不等于覆盖了类别之间的组合。假设会员和普通用户各测过一次,优惠券的有效与过期也各测过一次,如果只有普通用户使用过期券才出错,已有样本仍可能漏掉。此时应根据共同决定结果的规则设计组合,而不是继续增加某个字段的普通值。

5 · 面试题卡片​

本页题目与参考回答

5.1 什么是等价类划分,怎样为数量输入选择代表值?​

考察重点:划分依据、有效与无效输入及代表值。

相关内容:划分过程、代表值与划分假设。

参考回答

把预期按相同规则处理的值归类,再从每类选代表。 对必填、范围 1 到 99 的整数数量,可以先区分缺失、空值、错误类型,再把整数分成低于下限、合法范围和高于上限。

有效范围选一个普通值验证正常处理,无效类别分别验证拒绝原因和无副作用。随后补上下限附近的值,不把一个合法代表当成整个范围已经验证完毕。

5.2 空字符串、null 和字段缺失可以放在一个等价类吗?​

考察重点:表示差异与契约语义。

相关内容:划分过程。

参考回答

需要先看契约,不能默认它们具有相同含义。 缺失可能使用默认值,null 可能表示主动清空,空字符串可能是合法字符串,也可能触发长度校验。

即使三者最终都被拒绝,也可能经过不同解析与校验路径。可以先分别取样,确认是否有足够依据将它们合并。

5.3 每个等价类都测试了一个值,是否足以证明所有输入正确?​

考察重点:代表性假设与有限测试的边界。

相关内容:代表值与划分假设。

参考回答

不能,类内处理相同是测试模型的假设,实际实现可能并不满足。 例如同一合法整数区间中,代码错误地对奇偶数采取不同处理,单个代表可能碰不到错误路径。

应结合边界、实现信息和已发现缺陷调整划分,并保留关键特殊值。等价类覆盖只说明覆盖了定义的类别,不说明穷尽了全部输入行为。

5.4 为什么一个用例不宜同时使用过期凭证、错误商品和超限数量?​

考察重点:错误掩盖与组合检查的目的。

相关内容:无效输入隔离与多字段。

参考回答

如果目标是独立验证每条校验,这些无效条件可能互相掩盖。 过期凭证先被拒绝后,商品和数量校验可能完全没有执行。

先保持其他条件有效,分别核对每个错误;再用多错误组合检查校验顺序和返回规则。组合用例有自己的目标,不能替代单条件证据。

6. 参考资料​

来源:Coding 101 原文 · 免费阅读,引用请保留出处。内容使用说明