等价类划分法:原理、有效等价类与无效等价类、设计步骤、实战案例
等价类划分法,说白了就是「偷懒的艺术」。
你想想看,测试一个输入框,难道要把所有可能的数字都试一遍吗?从0试到100万?那项目工期得排到明年去。我刚开始做测试那会儿,就犯过这种傻——对着一个年龄输入框,手动敲了二十多个数字,结果被组长骂了一顿:「你这是在测试,还是在练打字?」
后来我才明白,等价类划分法的核心思想其实很简单:把输入数据分成几个「类」,每个类里随便挑一个值来测,就能代表整个类的行为。因为同一个类里的数据,程序对它们的处理逻辑是一样的。
核心定义:等价类是指输入域中具有相同处理方式的数据集合。只要测试了其中一个代表值,就相当于测试了整个集合。
有效等价类 vs 无效等价类
这里有个关键点,我当年踩过坑——很多人只关注「能用的数据」,忽略了「不能用的数据」。其实后者往往更容易出bug。
- 有效等价类:符合需求规格说明书的、程序期望接收的合法输入。比如年龄输入框要求1-120岁,那25岁、60岁、1岁、120岁都属于有效等价类。
- 无效等价类:不符合需求规格说明书的、程序应拒绝的非法输入。比如0岁、-5岁、121岁、abc、空值等。
我个人的习惯是:先列有效等价类,再列无效等价类。而且无效等价类往往比有效等价类多得多,因为「错误的方式」总是比「正确的方式」多。
避坑指南:我曾经在一个项目中只测了有效等价类,结果上线后用户输入了「0.5岁」(半岁婴儿),系统直接崩溃了。因为开发只处理了整数,没考虑小数。所以记住:无效等价类不是「可有可无」,而是「必须覆盖」。
设计步骤
等价类划分法的设计步骤,我总结为四步走:
- 分析输入条件:搞清楚输入框接受什么类型的数据?数值、字符串、布尔值?有没有长度限制?
- 划分等价类:根据需求,把输入域分成若干有效等价类和无效等价类。注意边界值要单独拎出来(下一章会细讲)。
- 编号并列表:给每个等价类一个编号,方便后续写测试用例时引用。
- 设计测试用例:每个等价类至少覆盖一次。尽量用最少的用例覆盖最多的等价类。
嗯,这里要注意:一个测试用例可以覆盖多个有效等价类,但只能覆盖一个无效等价类。为什么?因为如果同时输入多个无效数据,你没法判断是哪个触发了错误提示。
实战案例一:年龄输入框
假设需求是:年龄输入框,接受1-120之间的整数。
我们先划分等价类:
| 输入条件 | 有效等价类 | 无效等价类 |
|---|---|---|
| 数值范围 | 1-120之间的整数(如25、60) | 小于1(如0、-5)、大于120(如121、200) |
| 数据类型 | 整数 | 小数(如3.5)、非数字(如abc、@#) |
| 空值 | (无有效等价类) | 空字符串、null |
对应的测试用例可以这样设计:
用例1:输入25(有效等价类,整数且在范围内)→ 预期:通过
用例2:输入0(无效等价类,小于最小值)→ 预期:提示「年龄必须大于1」
用例3:输入121(无效等价类,大于最大值)→ 预期:提示「年龄不能超过120」
用例4:输入3.5(无效等价类,小数)→ 预期:提示「请输入整数」
用例5:输入abc(无效等价类,非数字)→ 预期:提示「请输入有效数字」
用例6:留空(无效等价类,空值)→ 预期:提示「年龄不能为空」
小技巧:我在项目中习惯把等价类编号写在用例备注里,比如「覆盖有效等价类E1、E2」。这样评审时一目了然,也方便后续补充用例。
实战案例二:手机号验证
手机号验证比年龄输入框复杂一些。假设需求是:中国大陆手机号,11位数字,以1开头,第二位是3、5、7、8、9。
等价类划分如下:
| 输入条件 | 有效等价类 | 无效等价类 |
|---|---|---|
| 长度 | 11位数字 | 少于11位(如10位)、多于11位(如12位) |
| 首位 | 以1开头 | 以0或其他数字开头 |
| 第二位 | 3、5、7、8、9 | 0、1、2、4、6等 |
| 字符类型 | 纯数字 | 包含字母、特殊符号、空格 |
| 空值 | (无有效等价类) | 空字符串 |
对应的测试用例:
用例1:输入13812345678(有效等价类,符合所有条件)→ 预期:通过
用例2:输入1381234567(无效等价类,10位)→ 预期:提示「手机号必须为11位」
用例3:输入138123456789(无效等价类,12位)→ 预期:提示「手机号必须为11位」
用例4:输入23812345678(无效等价类,首位不是1)→ 预期:提示「手机号格式错误」
用例5:输入13012345678(无效等价类,第二位是0)→ 预期:提示「手机号格式错误」
用例6:输入138abc5678(无效等价类,包含字母)→ 预期:提示「请输入数字」
用例7:留空(无效等价类)→ 预期:提示「手机号不能为空」
你可能会问:为什么有效等价类只写一个用例就够了?因为只要手机号符合「1开头、第二位是3/5/7/8/9、11位数字」这三个条件,程序的处理逻辑是一样的。你测13812345678和13912345678,结果不会有区别。
知识体系结构图
下面这张图,是我自己梳理等价类划分法时画的。它把整个知识脉络串起来了:
我的经验之谈:等价类划分法不是万能的。它擅长处理「输入域明确」的场景,但对于「输入域模糊」的场景(比如搜索关键词、文本描述),效果就没那么好了。这时候需要结合其他方法,比如边界值分析、场景法。
另外,我建议你在设计用例时,把等价类编号写在用例标题或备注里。这样评审时别人一眼就能看出你的覆盖情况,也方便后续补充遗漏的等价类。
好了,等价类划分法就讲到这里。记住一句话:测一个类,胜过测一百个点。这是测试效率的起点,也是你从「手工测试」走向「测试设计」的第一步。
可可精品资料库