如何检查等价类划分覆盖有效类、无效类和异常类
检查等价类划分是否覆盖有效类、无效类和异常类,要分两层看:先确认划分本身是否完整,再核对每条等价类是否至少被一条用例引用。两层结论不能互相替代。下文给出三类等价类的统计口径、清单与映射表的记录方式、可复算的覆盖率公式和检查步骤,并用一个输入表单演示计算过程。
Table of Contents
要点总览(TL;DR)
- 检查分两层:先复核等价类划分本身是否完整,再核对每条等价类是否至少被一条用例引用,两层结论不能互相替代。
- 三类口径先统一:有效类取合法输入,无效类取超出范围但格式可识别的输入,异常类取格式非法、类型错误、空值等无法按正常规则解析的输入。
- 覆盖率 = 已覆盖等价类数 ÷ 应覆盖等价类总数 × 100%,有效类与异常类分开计算,同一等价类被多条用例覆盖只计一次。
- 分母为零时标注不适用并回查划分环节;一条用例覆盖多个等价类应标记并建议拆分,避免失败时定位困难。
- 覆盖率达标只说明清单被用例引用,划分完整性要靠人工复核输入条件、非法区间和异常类型是否列全。
评估目标:判断等价类划分是否完整且被用例覆盖
这项检查要回答两个问题。第一个问题是划分完整性:针对每个输入条件,合法区间、非法区间和异常输入类型是否都被识别并单独成类。第二个问题是用例覆盖率:已经列出的每条等价类,是否至少有一条用例引用它。两个问题的检查对象不同,前者看等价类清单本身,后者看清单与用例之间的对应关系。
两层检查的先后顺序会影响结论的可信度。如果划分本身漏掉了某个输入条件,覆盖率再高也只是在一个不完整的清单上计算,数字好看但没有意义。因此实际操作中先做划分复核,再做用例映射统计,最后把两层结果放在一起解读。
检查结果用于发现遗漏,不能用来证明测试质量。覆盖率达标说明清单中的等价类都被用例引用过,说明不了清单之外没有遗漏,也说明不了用例的断言和预期结果写得对。把检查定位成“找缺口”的活动,比定位成“出合格证明”更符合它的实际作用。
可操作的检查框架可以概括为三步:先按输入条件列出三类等价类清单,再把用例逐条映射到等价类,最后分别计算有效类覆盖率和异常类覆盖率并人工复核划分维度。这三步对应后文的统计口径、记录字段和计算步骤。
指标与范围:有效类、无效类、异常类的统计口径
三类等价类的区分标准需要在检查开始前统一,否则同一输入可能被两个人归到不同类别,覆盖率也就无法比较。建议采用下表口径,并在团队内形成书面约定。
| 类别 | 区分标准 | 典型代表值 | 统计处理 |
|---|---|---|---|
| 有效类 | 落在合法输入范围内、能被正常业务规则接受和处理的输入 | 合法区间内的普通值、合法格式的字符串 | 计入有效类分母,单独计算有效率覆盖率 |
| 无效类 | 超出合法范围但格式可识别、能按正常规则解析后判定为不合法的输入 | 超出上下限的数值、长度超限但结构正常的文本 | 计入无效类分母,与有效类分开统计 |
| 异常类 | 格式非法、类型错误、空值、特殊字符、超长或无法按正常规则解析的输入 | 空输入、错误类型、乱码、注入类字符串 | 计入异常类分母,单独计算异常类覆盖率 |
无效类与异常类的边界最容易产生分歧。一个可操作的界定方式是看系统能否按正常规则解析:能解析、只是取值不合法,归无效类;无法按正常规则解析或类型本身不对,归异常类。例如年龄输入“200”属于无效类,输入“abc”或留空属于异常类。团队约定后应写入检查说明,避免同一输入被重复计入两个类别或两边都漏计。
分母按输入条件汇总。每个输入条件先列出应覆盖的等价类总数,再把所有输入条件的数量相加得到整体分母。一个表单有五个输入条件,每个条件平均划出三个有效类、两个无效类、两个异常类,整体分母就是有效类15条、无效类10条、异常类10条。分母确定后不再随用例增减而变动,否则覆盖率失去可比性。
统计范围限定在等价类清单与用例的对应关系上,不涉及测试脚本实现、自动化执行结果和缺陷数据。跨项目的测试资产复用也不在本次检查范围内。范围写清楚,检查结论才有明确的适用边界。
数据口径与证据:等价类清单和用例映射表怎么记
覆盖检查要能复核,就需要留下可核验的记录。建议维护两张表:等价类清单和用例映射表。清单回答“应该覆盖什么”,映射表回答“实际覆盖了什么”,两张表用等价类编号关联。
等价类清单建议包含以下字段:
- 等价类编号:唯一标识,建议按“输入条件缩写-类别-序号”命名,便于在映射表中引用。
- 输入条件:对应的字段或参数名称,与需求或设计文档中的叫法一致。
- 类别:有效类、无效类或异常类,取值只能三选一。
- 代表值:用于设计用例的具体取值,能代表该等价类的特征。
- 边界值:与该等价类相邻的边界取值,用于配套设计边界用例。
- 划分依据:引用需求条款或规则说明,说明为什么这样划分。
- 备注:记录争议点、待确认事项或与其他等价类的关系。
用例映射表建议包含:用例编号、用例名称、覆盖的等价类编号、覆盖方式(单类覆盖或多类合并)、执行状态、最后更新时间。一条用例覆盖多个等价类时,在映射表中逐条列出被覆盖的编号,覆盖方式标注为多类合并,便于后续识别定位能力偏弱的用例。
证据形式包括等价类清单、用例映射表、划分评审记录和补充修改记录。评审记录应写明参与人、复核的输入条件范围和结论,补充修改记录写明新增了哪条等价类、由谁在什么时间补充。缺失值处理要明确:代表值未填写的等价类视为未完成划分,不计入已覆盖;类别未标注的条目单独列出,在统计前补齐,不能默认归入有效类。
这些记录可以放在测试管理工具中承载。ONES TestCase 支持编写测试用例、组织用例库,并可自定义用例属性以适配不同业务场景;用例模块支持树状结构和拖拽排序,便于按输入条件分层组织用例;用例库中的属性支持筛选,便于按类别快速找出待核对条目。把等价类编号和类别做成自定义属性后,清单与用例的对应关系可以在同一套用例库中维护,减少表格分散带来的版本不一致。
计算与评估步骤:从清单到覆盖率结论
检查按五步推进,每一步都有明确的产出物,便于复算和交接。
- 列输入条件。从需求、接口文档或页面字段中逐个提取输入条件,形成输入条件清单。完成标志是清单经复核确认无遗漏字段。
- 划等价类。对每个输入条件分别划出有效类、无效类和异常类,填入等价类清单。完成标志是每个输入条件三类都有条目,或写明某一类不适用的理由。
- 标类别并编号。为每条等价类标注类别、代表值和边界值,分配唯一编号。完成标志是清单中不存在类别空缺的条目。
- 映射用例。逐条检查现有用例,把用例编号填入映射表,标明覆盖的等价类编号和覆盖方式。完成标志是每条用例都有映射记录,每条等价类都能查到引用它的用例或标记为未覆盖。
- 计算覆盖率并复核。按公式计算有效类覆盖率和异常类覆盖率,再人工复核划分完整性。完成标志是形成覆盖率结论和待补充清单。
覆盖率公式为:覆盖率 = 已覆盖等价类数 ÷ 应覆盖等价类总数 × 100%。分子按“至少有一条用例引用该等价类”计,同一等价类被多条用例覆盖只计一次;分母是清单中该类别的等价类总数。有效类覆盖率和异常类覆盖率分开计算,无效类可单独计算也可与异常类合并观察,但合并时要在结论中注明口径。
几种特殊情况的处理方式需要提前约定。分母为零时覆盖率没有意义,标注为“不适用”,并回到划分环节确认该输入条件是否被整体遗漏,而不是记为100%。一条用例覆盖多个等价类时,分子按实际被引用的等价类数量计,同时在映射表中标记多类合并,提示该用例在失败时的定位能力较弱。重复覆盖不重复计数,但可以在备注中记录覆盖次数,用于观察用例分布是否过度集中在有效类。
人工复核划分完整性是计算之外的必要环节,检查点包括:输入条件是否列全;每个条件的合法区间与非法区间是否都划分;异常输入类型是否单独成类;是否存在只测有效类、未测无效类的条件;边界值是否与等价类配套设计。复核发现缺口时,先补充等价类清单,再补用例,最后重新计算覆盖率。
例子:一个输入表单的覆盖检查演示
以下示例为说明方法而构造,数值和结论不代表任何真实项目数据。假设一个注册表单有三个输入条件:用户名、年龄、手机号。
划分结果如下:用户名有效类为6至20位合法字符,无效类为长度不足6位和超过20位,异常类为空值和含非法特殊字符;年龄有效类为18至60的整数,无效类为小于18和大于60,异常类为非数字输入和空值;手机号有效类为11位合法号码,无效类为位数不足和位数超出,异常类为含字母和空值。按此划分,有效类共3条,无效类共6条,异常类共6条,整体分母为15条。
现有用例映射情况:用户名有效类有2条用例覆盖,无效类中长度不足有1条覆盖、超过20位无覆盖,异常类中空值有1条覆盖、非法特殊字符无覆盖;年龄有效类有1条覆盖,无效类两类各有1条覆盖,异常类中非数字有1条覆盖、空值无覆盖;手机号有效类有1条覆盖,无效类中位数不足有1条覆盖、位数超出无覆盖,异常类两类均无覆盖。
计算过程:有效类已覆盖3条,覆盖率3÷3=100%;无效类已覆盖4条,覆盖率4÷6≈66.7%;异常类已覆盖2条,覆盖率2÷6≈33.3%。整体覆盖率9÷15=60%。
检查发现三类遗漏:用户名超长、用户名非法特殊字符、年龄空值、手机号位数超出、手机号含字母、手机号空值共6条等价类未被任何用例引用,其中异常类占4条。补充方式是先为每条遗漏的等价类设计单类覆盖用例,再检查已有用例中是否存在一条用例同时覆盖多个等价类的情况,若有则拆分为单等价类用例,最后重新计算覆盖率。补充后异常类覆盖率应明显上升,若仍偏低,需要回到划分环节确认异常类型是否列全。
解读与限制:覆盖率数字能说明什么
覆盖率数字回答的是“清单中的等价类有多少被用例引用”,回答不了“清单本身是否完整”。划分时漏掉一个输入条件,或者某个条件的异常类型没有想到,覆盖率仍然可能显示100%。因此覆盖率达标只能作为检查的一个中间结论,划分完整性必须靠人工复核和评审来保证。
异常类覆盖率偏低是常见现象,原因通常有几类:异常输入类型在设计阶段没有被系统梳理,用例设计者习惯围绕正常流程写用例,异常场景的预期结果难以描述导致被跳过,或者异常类与无效类的边界不清导致部分条目被归到无效类统计。发现异常类覆盖率明显低于有效类时,先检查划分口径是否一致,再检查是否存在整类异常输入未被识别。
单一覆盖率指标不能代表整体测试充分性。它不反映用例的断言质量、执行结果和缺陷发现能力,也不反映输入条件之间的组合覆盖情况。把等价类覆盖率与边界值覆盖、组合覆盖、缺陷数据放在一起看,结论才更完整。团队可以设定内部参考线,但参考线应结合业务风险和输入复杂度确定,不宜照搬统一数值。
复核与迭代建议:每次需求变更后重新核对输入条件清单,新增或修改的输入条件要同步更新等价类清单;定期抽查映射表与实际用例是否一致,避免用例修改后映射关系失效;把划分评审记录和补充记录保留下来,作为下一轮检查的输入。ONES 测试管理方案支持为测试活动自动生成多维度测试报告并提供报告模板,团队可以在用例属性完整填写的前提下,把按类别统计的覆盖情况纳入测试报告,与需求、任务和迭代的关联信息一起查看,便于在评审中定位缺口并安排补充。
常见问题
等价类清单里同一个输入既像无效类又像异常类,统计时怎么处理?
先看系统能否按正常规则解析这个输入。能解析、只是取值超出合法范围,归无效类;类型本身不对、格式非法或为空,归异常类。团队在检查开始前把这条界定写进检查说明,同一输入只归一类,避免两边重复计入或两边都漏计。已经归错类的条目,在统计前调整并记录修改原因。
一条用例同时覆盖多个等价类,覆盖率怎么算?
分子按实际被引用的等价类数量计,一条用例覆盖三个等价类就计三次,但同一等价类被多条用例覆盖只计一次。同时在映射表中把覆盖方式标注为多类合并,提示这条用例失败时的定位能力较弱。若某条等价类只有合并用例覆盖,建议补一条单等价类用例,再重新计算覆盖率。
某个输入条件的等价类分母为零,覆盖率应该记成100%吗?
不应记为100%。分母为零说明这个输入条件没有列出任何等价类,覆盖率没有意义,标注为“不适用”,并回到划分环节确认该输入条件是否被整体遗漏。补齐等价类清单后再纳入统计,否则整体覆盖率会被虚高的数字拉偏。
异常类覆盖率明显低于有效类,通常要从哪里查起?
先查划分口径是否一致,确认部分异常输入是否被误归到无效类统计;再查异常类型是否在设计阶段被系统梳理过,是否存在整类异常输入未被识别。常见原因包括用例设计围绕正常流程展开、异常场景的预期结果难以描述而被跳过。定位后先补等价类清单,再补用例,最后重新计算。
等价类清单和用例映射表放在测试管理工具里维护,需要注意什么?
把等价类编号和类别做成用例的自定义属性,清单与用例的对应关系就能在同一套用例库中维护,减少多份表格版本不一致的问题。ONES TestCase 支持自定义用例属性,用例库中的属性支持筛选,便于按类别找出待核对条目;用例模块支持树状结构和拖拽排序,可按输入条件分层组织用例。前提是属性填写完整,否则筛选和统计结果会失真。



