等价类划分是一种黑盒测试用例设计方法:把输入域按业务规则切成若干互不重叠的集合,同一集合内的取值被预期触发相同处理结果,再从每个集合中选取代表性数据编写用例。它解决的是“有限用例覆盖近乎无限的输入”的问题,核心产出是等价类表和据此精简的用例集。本文依次说明定义与边界、划分步骤、与边界值分析和决策表的分工,并用一个完整示例演示推导过程。
要点总览(TL;DR)
- 等价类划分是一种黑盒测试设计方法:按业务规则把输入域切成互不重叠的集合,同一集合内取值预期得到相同处理结果,再从每个集合选代表值编写用例。
- 有效等价类验证正常处理路径,无效等价类验证异常与容错;无效类要按违反的规则拆分,通常一条用例只覆盖一个无效类。
- 划分粒度以“预期处理结果相同”为准,类内等价、类间互斥、覆盖完整是三条合格性判定规则。
- 等价类划分选类内代表值,边界值分析补临界点,决策表处理多条件组合,三者按覆盖骨架、临界加固、组合列举的顺序配合使用。
- 年龄字段 18–60 的示例中,一个有效类加五个无效类可形成六条代表性用例;代表值取 30 而非 18 或 60,避免与边界测试重复。
等价类划分的直接定义
等价类划分(Equivalence Partitioning)属于黑盒测试方法,也叫基于规格的测试设计方法。它只依据需求规格、输入域定义和业务规则推导用例,不依赖代码内部结构。方法的基本假设是:如果把输入域切成若干集合,同一集合内的任意取值在程序中被预期走同一条处理路径、得到同类结果,那么每个集合测一个代表值,就等价于测了这个集合里的所有取值。
由此产生两个基本术语。有效等价类指符合需求规格、程序应当正常处理的输入集合,例如“年龄输入 18–60 的整数”这一规则下,18 到 60 之间的整数构成一个有效等价类。无效等价类指不符合规格、程序应当拒绝或给出错误提示的输入集合,例如小于 18 的整数、大于 60 的整数、非整数、空值、非数字字符,各自构成独立的无效等价类。有效类验证功能正确性,无效类验证异常处理与容错能力,两者缺一不可。
方法的输入是需求规格、输入条件清单和业务约束;输出是一张等价类表,表中列出每个类的编号、类别(有效/无效)、覆盖的输入条件和代表值,再据此编写代表性用例。它要解决的核心问题是:一个字段的可能输入在理论上近乎无限,而测试资源有限,必须用可解释的抽样方式选出少量用例,并说清这些用例覆盖了哪些输入情形、还有哪些没有覆盖。
等价类划分的边界:它管什么、不管什么
等价类划分适用于输入条件可以枚举、可以按规则分组的场景,例如表单字段的取值范围、枚举型选项、文件类型白名单、数值区间、字符串长度区间等。当输入是一组离散且规则明确的取值时,它能快速压缩用例数量,并让覆盖情况可核对。它的能力边界同样清晰,下面这张表说明它负责什么、把什么交给相邻方法。
| 范围 | 内容 | 接手位置 |
|---|---|---|
| 管什么 | 按业务规则把输入域切成有效类与无效类;为每个类选代表值;形成等价类表与精简用例集 | 等价类划分自身 |
| 不管什么 | 边界点上的取值是否被正确处理,例如 17、18、60、61 这类临界值 | 边界值分析 |
| 不管什么 | 多个输入条件之间的组合逻辑,例如“会员等级 + 订单金额 + 优惠券类型”共同决定折扣 | 决策表、因果图 |
| 不管什么 | 测试脚本编写、自动化框架搭建与执行调度 | 自动化测试工程实践 |
| 不管什么 | 跨项目的用例资产沉淀、复用与度量 | 测试用例库与资产管理 |
需要强调的是,等价类划分不负责判定边界。它选出的代表值通常取在类的中部,边界附近的取值由边界值分析单独补充。同样,当业务规则涉及多个条件的组合时,等价类划分只能给出单个条件的分类,组合覆盖需要决策表来系统列举。把这几类方法混为一谈,容易造成“以为覆盖了、实际漏测”的情况。
等价类怎么划分:步骤与判定规则
划分过程可以按以下步骤推进,每一步都有明确的产物,便于评审时核对。
- 提取输入条件与约束。逐条阅读需求,把每个可输入项、取值范围、格式要求、必填规则、依赖关系列成清单。产物是一份输入条件表,它是后续划分的依据。
- 先划有效类,再划无效类。对每个输入条件,先确定符合规格的取值集合,形成有效等价类;再穷举不符合规格的情形,形成无效等价类。无效类要按“违反哪条规则”拆分,例如“超出上限”“低于下限”“格式错误”“为空”应各自成类。
- 检查类内等价、类间互斥。同一类内的任意取值应被预期触发相同处理结果;任意一个输入值只能落入一个类,不能同时属于两个类。若发现某类内部处理结果不一致,说明划分过粗,需要继续拆分。
- 检查覆盖完整性。所有有效类和无效类都要在表中有归属,输入域中不存在“没有类可归”的取值。评审时逐项对照输入条件表,确认没有遗漏的无效情形。
- 确定划分粒度。粒度以“预期处理结果相同”为准。处理逻辑相同、只是数值不同的取值放在同一类;一旦错误提示、分支走向或数据落库方式不同,就应拆成不同的类。过粗会掩盖缺陷,过细则退化为逐值测试,失去精简用例的意义。
- 为每个类选取代表值并编写用例。代表值取类内典型值,避开边界点,以免与边界值分析重复。无效等价类通常一条用例只覆盖一个无效类,其余输入保持有效,这样一旦报错就能定位到具体是哪个无效条件触发的。
判定一个类是否合格,可以用三条规则自查:类内取值预期结果一致;类与类之间没有交集;所有类合起来能覆盖完整的输入域。三条同时满足,等价类表才具备作为用例设计输入的条件。
等价类划分与边界值分析、决策表的区别
这三种方法经常在同一批需求上配合使用,但它们回答的问题不同。用同一口径对照,可以避免把边界值当成等价类的一部分,也避免用一个代表值代替边界测试。
| 维度 | 等价类划分 | 边界值分析 | 决策表 |
|---|---|---|---|
| 针对的输入特征 | 输入域的取值分组 | 取值区间的临界点及其邻近值 | 多个条件之间的组合关系 |
| 回答的问题 | 哪些输入情形需要覆盖,每类选哪个代表值 | 边界附近是否被正确处理 | 不同条件组合下应执行哪条处理规则 |
| 典型产物 | 等价类表、代表性用例 | 边界点清单、边界用例 | 条件桩与动作桩组成的决策表 |
| 常见误用 | 代表值取在边界上,与边界测试重复 | 只测边界、忽略类内典型值 | 条件组合遗漏,规则未穷举 |
实际项目中常见的组合顺序是:先用等价类划分把输入域切成有效类和无效类,形成覆盖骨架;再对每个取值范围补充边界值用例;当业务规则涉及多条件组合时,用决策表把组合情形系统列出,并把每个组合映射回对应的等价类。三者是互补关系,等价类划分提供覆盖面,边界值分析加固临界点,决策表处理组合逻辑。
一个具体例子:年龄字段的等价类划分
假设某注册表单的年龄字段要求输入 18–60 的整数,必填。按前述步骤,先提取输入条件:取值范围 18–60、数据类型为整数、必填。再分别划出有效类和无效类,得到如下等价类表(示例为演示情景,用于说明推导过程)。
| 编号 | 类别 | 覆盖的输入情形 | 代表值 |
|---|---|---|---|
| E1 | 有效 | 18–60 之间的整数 | 30 |
| I1 | 无效 | 小于 18 的整数 | 10 |
| I2 | 无效 | 大于 60 的整数 | 70 |
| I3 | 无效 | 非整数(小数) | 25.5 |
| I4 | 无效 | 非数字字符 | abc |
| I5 | 无效 | 空值 | (留空) |
据此可以编写六条代表性用例:输入 30 预期注册成功;输入 10 预期提示年龄低于下限;输入 70 预期提示年龄超出上限;输入 25.5 预期提示必须为整数;输入 abc 预期提示格式错误;留空提交预期提示必填。每条无效用例只改动一个条件,其余字段保持有效,便于定位问题来源。
这个例子中有几个常见错误值得注意。只测有效类 E1,会漏掉全部异常处理路径;把 I1 和 I2 合并成一条“超出范围”的用例,一旦程序只对上限做了校验,缺陷就会被掩盖;代表值取 18 或 60,实际上测的是边界,与边界值分析重复,而类内典型值反而没有覆盖。正确的做法是等价类划分负责类内代表值,边界值分析另行补充 17、18、60、61 等临界点用例。
等价类表如何落到用例管理与评审中
等价类表是用例设计的中间产物,它的价值要在编写、评审和变更维护三个环节中体现。编写阶段,等价类表中的每一行应对应用例库中的一条或多条用例,并在用例属性中记录来源类编号,使“类—用例”的对应关系可追溯。评审阶段,检查两件事:有效类和无效类是否都有对应用例,无效类是否逐条单列而非合并。变更阶段,需求中的取值范围或校验规则一旦调整,先更新等价类表,再据此增删或修改关联用例,避免用例与需求脱节。
这些动作落到测试管理工具中,对应的是用例组织、属性记录、需求关联和权限控制。在 ONES 中,测试用例可以按树状结构组织并拖拽排序,便于按模块或按等价类分组管理用例;用例属性支持自定义,可以用来记录等价类编号、类别(有效/无效)等设计信息;用例可与需求、任务关联,测试计划与迭代关联,使等价类表的更新和用例调整能够沿着需求线索被找到。用例库和测试计划支持单独配置权限,便于区分设计、评审与执行的职责。若团队已有存量用例,也可以通过 Excel 批量导入后在线维护,并支持导出备份。
需要说明的是,等价类表的维护责任在测试设计人员,工具承载的是记录、关联和权限这些管理动作。评审时是否覆盖完整、无效类是否单列,仍要由评审人对照输入条件表逐项核对。把等价类表作为用例库中的结构化输入,而不是停留在个人文档里,才能让后续的需求变更和回归范围判断有据可依。
常见问题
等价类划分和边界值分析必须一起用吗?
两者可以单独使用,配合使用更稳妥。等价类划分解决“哪些输入情形需要覆盖”,边界值分析解决“临界点是否被正确处理”。如果只做等价类划分,类内代表值通常取在中部,17、18、60、61 这类临界值不会被测到;如果只做边界值分析,类内典型值和无效类的异常路径又容易遗漏。常见做法是先用等价类表搭出覆盖骨架,再对每个取值范围补充边界点用例。
无效等价类为什么建议一条用例只覆盖一个?
一条用例同时触发多个无效条件时,程序通常只返回第一个错误提示,后面的无效条件是否被正确校验无法观察。例如年龄字段同时输入 10 和 abc,系统提示“年龄低于下限”后,格式校验是否生效就看不出来。把无效类逐条单列,其余输入保持有效,报错信息就能直接定位到具体条件,缺陷也不会互相掩盖。当业务规则明确要求一次性展示全部错误时,可以另设组合用例,但不应替代单条件用例。
需求变更后,等价类表和已有用例怎么同步?
先改等价类表,再改用例。需求中的取值范围、格式要求或必填规则调整后,重新核对输入条件表,确认哪些类被新增、删除或合并,然后沿着用例中记录的类编号找到关联用例,做增删改。若团队把等价类编号作为用例属性维护,并让用例与需求条目关联,变更时就能按需求线索筛出受影响用例,回归范围也有据可查。等价类表停留在个人文档里,是变更后用例脱节最常见的原因。
输入条件很多时,等价类表会不会变得难以维护?
会,所以需要控制表的组织方式。可以按功能模块或页面拆分等价类表,每张表只覆盖一组相关输入条件,编号带上模块前缀;跨字段的依赖关系单独记录,不塞进单字段的类表。当条件数量增长到组合逻辑成为主要风险时,把组合部分交给决策表处理,等价类表只保留单条件的分类结果。这样每张表规模可控,评审时也便于逐项核对覆盖完整性。
等价类划分能直接用于自动化测试吗?
等价类表可以作为自动化用例的数据设计来源:每个类的代表值对应一组测试数据,驱动同一段脚本执行。等价类划分本身不涉及脚本实现、框架选型和执行调度,这些属于自动化测试工程实践。把类编号写进测试数据或用例标识,可以在自动化执行报告中回溯每条结果覆盖了哪个等价类,便于判断失败影响的是单个取值还是整类输入。


















