等价类划分法:从理论到实战

大家好,我是你们的老朋友。今天我们来聊聊测试设计里一个特别基础、但又特别实用的方法——等价类划分法。

说实话,我刚入行那会儿,觉得测试就是点点点。后来被一个线上bug狠狠教育了一回,才明白:测试不是靠蛮力,而是靠脑子。等价类划分,就是帮你用脑子省力气的。

什么是等价类?

先问大家一个问题:一个年龄输入框,范围是1到120。你要测多少个值?

1、2、3……一直到120?别闹了,那得测到猴年马月去。

等价类的核心思想很简单:把输入数据分成若干组,每组里随便挑一个代表来测就行。因为同一组里的数据,程序处理逻辑是一样的。

举个例子。年龄1到120,那1到120这个范围里的所有整数,程序处理方式都一样——都是合法年龄。你测了18,就没必要再测19、20了。这就是等价类。

等价类的定义:将输入域划分成若干个互不相交的子集,每个子集中的任意一个值,对揭露程序错误来说都是等效的。

有效等价类 vs 无效等价类

这里有个坑,我当年踩过。很多人只关注“能输入什么”,却忽略了“不能输入什么”。

等价类分两种:

  • 有效等价类:符合需求、程序应该正常处理的数据。比如年龄1-120。
  • 无效等价类:不符合需求、程序应该拒绝或报错的数据。比如年龄0、年龄121、年龄abc。

我曾经在一个项目中,只测了有效等价类,结果上线后用户输入了负数,系统直接崩了。嗯,从那以后,我每次设计用例都会问自己一句:无效的,我测了吗?

注意:无效等价类往往比有效等价类更容易发现bug。别偷懒,每个无效等价类都要覆盖到。

划分原则

等价类怎么划分?我总结了几条原则,都是实战中摸爬滚打出来的:

  1. 按取值范围划分:比如年龄1-120,那1-120是一个有效类,小于1和大于120各是一个无效类。
  2. 按数据类型划分:比如输入要求是整数,那整数是有效类,小数、字母、特殊字符各是一个无效类。
  3. 按数据长度划分:比如密码6-16位,那6-16位是有效类,小于6位和大于16位各是一个无效类。
  4. 按数据格式划分:比如邮箱必须包含@和.,那符合格式的是有效类,缺少@或.的是无效类。
  5. 按业务规则划分:比如会员等级,普通会员和VIP会员处理逻辑不同,那就各算一个有效类。

你想想看,这些原则其实就是在回答一个问题:程序到底在哪些地方会走不同的分支?

实战案例一:登录模块

咱们拿登录模块来练练手。假设需求是这样的:

  • 用户名:6-12位字母或数字
  • 密码:8-16位,必须包含字母和数字

先划分等价类:

输入项 有效等价类 无效等价类
用户名 6-12位字母数字组合(如abc123) 小于6位、大于12位、包含特殊字符、包含中文、为空
密码 8-16位,含字母和数字(如pass1234) 小于8位、大于16位、纯字母、纯数字、为空
组合 用户名和密码都有效 用户名有效密码无效、用户名无效密码有效、两者都无效

然后设计测试用例。每个等价类至少选一个代表值:

用例1:用户名 abc123(6位有效),密码 pass1234(8位有效)→ 预期:登录成功
用例2:用户名 ab(小于6位),密码 pass1234 → 预期:提示用户名格式错误
用例3:用户名 abc1234567890(大于12位),密码 pass1234 → 预期:提示用户名格式错误
用例4:用户名 abc@123(含特殊字符),密码 pass1234 → 预期:提示用户名格式错误
用例5:用户名 abc123,密码 pass(小于8位)→ 预期:提示密码格式错误
用例6:用户名 abc123,密码 pass123456789012345(大于16位)→ 预期:提示密码格式错误
用例7:用户名 abc123,密码 12345678(纯数字)→ 预期:提示密码格式错误
用例8:用户名 abc123,密码 abcdefgh(纯字母)→ 预期:提示密码格式错误
用例9:用户名 空,密码 pass1234 → 预期:提示用户名不能为空
用例10:用户名 abc123,密码 空 → 预期:提示密码不能为空

你看,10个用例就把登录模块的核心逻辑覆盖了。要是用穷举法,那得测到天荒地老。

实战案例二:年龄输入框

再来一个更贴近生活的例子——年龄输入框。需求:

  • 年龄范围:1-120
  • 输入类型:整数
  • 必填项

等价类划分如下:

类别 等价类 代表值
有效 1-120之间的整数 1、60、120
无效-边界外 小于1的整数 0、-1
无效-边界外 大于120的整数 121、200
无效-类型 小数 18.5、3.14
无效-类型 字母 abc、十八
无效-类型 特殊字符 @、#、$
无效-空值 为空 (空)

对应的测试用例:

用例1:输入 1 → 预期:成功
用例2:输入 60 → 预期:成功
用例3:输入 120 → 预期:成功
用例4:输入 0 → 预期:提示年龄范围错误
用例5:输入 -1 → 预期:提示年龄范围错误
用例6:输入 121 → 预期:提示年龄范围错误
用例7:输入 18.5 → 预期:提示请输入整数
用例8:输入 abc → 预期:提示请输入数字
用例9:输入 @ → 预期:提示请输入数字
用例10:输入 空 → 预期:提示年龄不能为空

小技巧:我个人习惯在有效等价类里选3个值——最小值、中间值、最大值。这样既能覆盖边界,又能覆盖典型值。当然,边界值分析法会更系统地处理边界,那是下一章的内容。

知识体系总览

下面这张图,是我自己整理的等价类划分法的核心逻辑。你看一眼,就能明白整个方法是怎么串起来的。

等价类划分法知识体系 等价类划分法 核心概念 等价类分类 划分原则 输入域划分成互不相交的子集 同子集内数据等效 有效等价类(符合需求) 无效等价类(不符合需求) 按取值范围、数据类型划分 按数据长度、格式划分 按业务规则划分 实战案例 测试用例设计 登录模块(用户名+密码) 年龄输入框(1-120整数)

避坑指南

最后,分享几个我踩过的坑:

  • 别漏了无效等价类。我曾经只测了有效类,结果用户输入了空格,系统没做trim,直接报错。从那以后,我每个输入框都会加一个“前后带空格”的用例。
  • 注意组合场景。等价类划分主要针对单个输入项。多个输入项的组合,需要用判定表或正交法来补充。别指望一个方法解决所有问题。
  • 等价类不是万能的。它适合输入域明确、规则清晰的场景。如果需求模糊,或者涉及复杂的状态转换,那就要结合其他方法了。

好了,等价类划分法就讲到这里。说白了,它就是帮你用最少的用例,覆盖最多的场景。下次写用例的时候,不妨先问问自己:这个输入,能分成几类?

可可精品资料库