软件测试用例设计与覆盖率闭环 - 第3节

等价类划分法:原理与定义

等价类划分,说白了就是「把输入数据分堆」。

你想想看,测试一个登录框,难道要把所有可能的用户名和密码都试一遍吗?那得试到猴年马月去。我刚开始做测试那会儿,就犯过这种傻——恨不得把每个字符都测一遍,结果累得半死,覆盖率还没上去。

后来我明白了,很多输入其实「等效」的。比如用户名长度在6-20位之间,那6位和7位,本质上属于同一类。我们只需要从每一类里挑一个代表去测,就能覆盖所有情况。

这就是等价类划分的核心思想:把无穷的输入,变成有限的几类。

等价类划分的定义

将输入域划分成若干个互不相交的子集,每个子集中的任意一个输入值,对于揭露程序中的错误来说,都是等效的。我们只需要从每个子集中选取一个代表值进行测试。

等价类的两个基本类型

这里有个关键点,很多人一开始会搞混——等价类其实分两种。

  • 有效等价类:符合需求规格说明的、合理的、有意义的输入数据
  • 无效等价类:不符合需求规格说明的、不合理的、无意义的输入数据

为什么要分这两种?我遇到过不少测试新人,只盯着「正常情况」测,觉得用户不会乱输。结果上线第一天,就有人在密码框里输入了表情符号,系统直接崩了。嗯,这就是忽略了无效等价类的后果。

注意:无效等价类往往比有效等价类更容易发现缺陷。我个人的经验是,至少70%的线上bug都来自无效输入的处理不当。

有效等价类与无效等价类

咱们拿一个具体的例子来说。假设有个年龄输入框,需求写的是「年龄必须在1到120之间的整数」。

那有效等价类是什么?很简单,就是1到120之间的任意整数。比如18、35、99,都属于这一类。

无效等价类呢?那就多了:

  • 小于1的数:0、-5、-100
  • 大于120的数:121、200、999
  • 非整数:3.14、2.5、0.99
  • 非数字:abc、你好、@#¥
  • 空值:什么都不输入

你看,有效等价类就一个区间,但无效等价类能分出好几种。这就是为什么我总说,无效等价类的设计,才是测试用例设计的重头戏。

我的一个小习惯:每次设计等价类时,我会先列有效等价类,再列无效等价类。无效等价类我会刻意多花点时间,想想「用户还能怎么折腾这个输入框」。

实战案例:登录模块

好了,理论说完了,咱们直接上手一个真实案例。登录模块,每个测试都测过,但你真的测全了吗?

需求描述

假设一个登录模块的规则如下:

字段 规则
用户名 6-20位字母或数字组合,区分大小写
密码 8-16位,必须包含字母和数字,区分大小写
验证码 4位数字,不区分大小写

第一步:划分等价类

咱们先对用户名做等价类划分:

输入项 有效等价类 无效等价类
用户名 6-20位纯字母(如 abcdef) 长度小于6位(如 abc)
6-20位纯数字(如 123456) 长度大于20位(如 21个a)
6-20位字母数字组合(如 test123) 包含特殊字符(如 test@123)

密码的等价类划分:

输入项 有效等价类 无效等价类
密码 8-16位字母+数字(如 pass1234) 长度小于8位
8-16位数字+字母(如 1234pass) 长度大于16位
纯字母(如 password)

第二步:设计测试用例

有了等价类,设计用例就简单了。每个等价类挑一个代表值就行。

我个人的做法是:先覆盖所有有效等价类,再逐个覆盖无效等价类。注意,无效等价类要一条用例只测一个无效项,这样才能准确定位问题。

// 有效等价类测试用例
用例1:用户名=testuser,密码=Pass1234,验证码=1234
预期:登录成功

// 无效等价类测试用例
用例2:用户名=abc(长度不足),密码=Pass1234,验证码=1234
预期:提示「用户名长度需为6-20位」

用例3:用户名=testuser,密码=pass(长度不足),验证码=1234
预期:提示「密码长度需为8-16位」

用例4:用户名=testuser,密码=Pass1234,验证码=12(长度不足)
预期:提示「验证码为4位数字」

用例5:用户名=test@user(含特殊字符),密码=Pass1234,验证码=1234
预期:提示「用户名只能包含字母和数字」

关键提醒:无效等价类测试时,每次只引入一个无效输入。如果同时输入无效用户名和无效密码,报错时你根本不知道是哪个字段出了问题。这是我踩过的坑,分享给你。

等价类划分的核心逻辑

为了让你更直观地理解,我画了一张流程图:

等价类划分法核心逻辑 输入域 等价类划分 有效等价类 无效等价类 选取代表值 逐个测试无效项

等价类划分的注意事项

最后,分享几个我这些年总结出来的要点:

  • 边界值要单独处理:等价类划分通常和边界值分析法配合使用。比如6-20位,6和20这两个边界值,我建议单独拿出来测。
  • 不要遗漏空值:很多系统在空值处理上都有bug。我遇到过最离谱的一次,空用户名直接导致数据库查询报错,页面白屏了。
  • 组合情况要留意:等价类划分主要针对单个输入项。多个输入项的组合情况,需要用判定表或正交实验法来补充。

避坑指南:我曾经在一个支付模块的测试中,只测了有效等价类,觉得没问题就上线了。结果用户输入了负数金额,系统不仅没拦截,还真的给用户账户扣了钱。那次事故让我明白——无效等价类不是「锦上添花」,而是「保命底线」。

等价类划分法,说白了就是用最少的用例,覆盖最多的场景。它不复杂,但需要你养成「分类思维」的习惯。每次拿到需求,先问自己一句:这个输入,能分成几类?

养成这个习惯,你的测试设计能力会上一个台阶。

可可精品资料库