系统化用例编写与复用实战 - 第2节

第二章 用例设计方法论:等价类划分法原理与实战

大家好,我是老张。今天咱们聊聊等价类划分法。

说实话,我刚入行那会儿,写测试用例就是凭感觉。想到什么测什么,结果呢?要么漏测,要么重复测。后来带我的师傅扔给我一句话:「你想想看,如果输入有10万个可能值,你难道要写10万条用例吗?」

嗯,等价类划分法就是来解决这个问题的。

2.1 等价类划分的核心思想

等价类划分,说白了就是「分而治之」。把输入数据分成若干组,每组里挑一个代表来测。如果这个代表没问题,那整组应该都没问题。

为什么会这样?因为同一组里的数据,程序处理它们的逻辑是一样的。你想想看,一个登录框,输入「admin」和输入「user123」,程序走的都是「校验用户名」那一段代码,对吧?

核心原则:每个等价类中,任意一个值都能代表整个类的测试效果。

我在项目中遇到过一件事:有个同事给一个年龄输入框写了200条用例,从1岁测到200岁。我问他为什么,他说「怕漏测」。其实完全没必要,因为程序对年龄的处理逻辑只有三段:小于18、18到60、大于60。你测3个值就够了。

2.2 有效等价类 vs 无效等价类

这里有个关键点:等价类要分两种。

类型 定义 例子(年龄输入框,范围18-60)
有效等价类 符合需求、程序能正常处理的输入 25(在18-60之间)
无效等价类 不符合需求、程序应拒绝的输入 15(小于18)、70(大于60)

很多新手只关注有效等价类,觉得「能跑通就行」。我曾经也犯过这个错——测一个注册功能,所有有效数据都过了,结果上线后用户输入了一个负数,系统直接崩了。从那以后,我每次都会问自己:「无效的情况,我测了吗?」

注意:无效等价类往往比有效等价类更容易发现bug。别只盯着「正常流程」看。

2.3 等价类划分的实战步骤

我个人的习惯是分四步走:

  1. 识别输入条件——搞清楚你要测什么。是文本框?下拉框?还是文件上传?
  2. 划分等价类——每个输入条件,列出所有可能的有效类和无效类。
  3. 编号管理——给每个等价类一个编号,方便后续追踪。
  4. 设计用例——每个等价类至少覆盖一次。

举个例子,一个密码输入框,要求6-12位字母数字组合:

输入条件:密码字符串
有效等价类:
  EC1:6-12位,纯字母(如 abcdef)
  EC2:6-12位,纯数字(如 123456)
  EC3:6-12位,字母+数字混合(如 abc123)
无效等价类:
  EC4:小于6位(如 ab12)
  EC5:大于12位(如 abcdef1234567)
  EC6:包含特殊字符(如 abc@123)
  EC7:为空

你看,7个等价类,7条用例就搞定了。比写几百条强多了吧?

2.4 等价类划分的常见误区

这里我总结几个坑,都是我在项目中踩过的:

  • 误区一:等价类划分太粗——比如把「所有数字」当成一个类。但程序对正数和负数的处理可能完全不同。
  • 误区二:忽略边界——等价类划分不擅长处理边界值。比如18-60这个范围,18和60本身是边界,但等价类划分只关心「在范围内」和「不在范围内」。
  • 误区三:只分一类——有些输入条件可能有多个维度。比如一个搜索框,既要考虑输入长度,又要考虑输入类型(中文、英文、数字)。

小技巧:当你觉得一个输入条件可以分成很多类时,试试「正交实验法」或者「决策表」。等价类划分不是万能的,但它是最基础、最常用的。

第三章 边界值分析法原理与实战

好,接下来咱们聊聊边界值分析法。这个方法和等价类划分是「黄金搭档」。

你想想看,程序最容易在什么地方出bug?边界。比如循环的边界、数组的边界、数值范围的边界。我见过太多bug都是因为「差1」导致的——少了一个等号,或者多了一个加1。

3.1 边界值分析的核心思想

边界值分析,说白了就是「专测边界」。它假设程序在边界处最容易出错,所以我们要重点测试边界值及其附近的值。

举个例子,一个输入框要求输入1-100的整数。等价类划分会告诉你:测一个有效值(比如50),再测一个无效值(比如0和101)。但边界值分析会告诉你:测1、2、99、100、0、101。

为什么?因为程序在处理边界值时,最容易出现「大于等于」写成「大于」这种低级错误。

核心原则:取边界值、边界值相邻的值、以及边界值两侧的值。

3.2 边界值的选取规则

我个人的习惯是遵循「7点法」:

边界类型 取值 例子(范围1-100)
最小值 min 1
最小值+1 min+1 2
最大值 max 100
最大值-1 max-1 99
最小值-1 min-1(无效) 0
最大值+1 max+1(无效) 101
中间值 任意有效值 50

注意,中间值其实不是必须的,但加上它可以让用例更完整。我记得有一次,一个同事只测了边界值,没测中间值,结果中间值触发了另一个bug——因为程序在中间值处有一个特殊的分支逻辑。

3.3 边界值分析 + 等价类划分 = 黄金搭档

这两个方法不是二选一,而是配合使用。我通常的做法是:

  1. 先用等价类划分,把输入分成有效类和无效类。
  2. 再对每个等价类的边界,用边界值分析法补充用例。

比如前面那个密码框的例子(6-12位字母数字组合):

等价类划分的用例:
  EC1:8位纯字母(有效)
  EC2:10位纯数字(有效)
  EC3:9位混合(有效)
  EC4:4位(无效,小于6)
  EC5:15位(无效,大于12)
  EC6:包含@(无效)
  EC7:空(无效)

边界值补充的用例:
  BV1:6位(有效边界)
  BV2:7位(有效边界+1)
  BV3:12位(有效边界)
  BV4:11位(有效边界-1)
  BV5:5位(无效边界-1)
  BV6:13位(无效边界+1)

你看,原本7条用例,加上边界值后变成了13条。虽然多了几条,但覆盖度提升了一个档次。

小技巧:如果时间紧,优先测边界值。因为边界值发现bug的概率远高于中间值。我统计过自己项目的数据,大约70%的输入类bug都出在边界上。

3.4 边界值分析的实战案例

咱们来个完整的例子。假设有一个订单金额输入框,要求输入0.01到9999.99元,精确到两位小数。

先划分等价类:

  • 有效:0.01-9999.99之间的任意两位小数
  • 无效:小于0.01、大于9999.99、超过两位小数、非数字、空

再取边界值:

  • 最小值:0.01
  • 最小值+0.01:0.02
  • 最大值:9999.99
  • 最大值-0.01:9999.98
  • 最小值-0.01:0.00(无效)
  • 最大值+0.01:10000.00(无效)

嗯,这里要注意:边界值不一定是整数。如果是小数,边界值也要精确到小数点后两位。

注意:边界值分析不适用于所有场景。比如布尔类型(true/false)、枚举类型,边界值分析就没啥意义。这时候用等价类划分就够了。

3.5 两种方法的综合运用

最后,我画了一张图,帮你理清这两个方法的关系:

等价类划分 + 边界值分析 综合流程 识别输入条件 等价类划分 边界值分析 有效/无效等价类 边界值及相邻值 完整测试用例集

这张图表达的意思很简单:先识别输入条件,然后同时做等价类划分和边界值分析,最后把两边的结果合并,就得到了完整的测试用例集。

我个人习惯在写用例时,先画这么一张图,把思路理清楚再动手。你也不妨试试。

好了,等价类划分和边界值分析就讲到这里。这两个方法是最基础、最实用的用例设计方法。下次你写用例时,不妨先问问自己:「我用了等价类划分吗?边界值测了吗?」——养成这个习惯,你的用例质量会提升一大截。

可可精品资料库