3. 边界值分析法:为什么边界最容易出错

做测试这么多年,我有个很深的体会——Bug 特别喜欢扎堆在边界上。你想想看,开发写代码的时候,if (x >= 6 && x <= 16) 这种判断,多写一个等号、少写一个等号,太常见了。边界值分析法,就是专门抓这类问题的。

3.1 为什么边界最容易出错

说白了,原因就三点:

  • 开发习惯:写条件判断时,< 和 <= 容易搞混。我见过一个老手,愣是把 >= 18 写成了 > 18,结果未成年人全能注册。
  • 逻辑漏洞:边界上的逻辑分支往往最复杂,容易遗漏。
  • 数据溢出:数值类型在边界附近,容易触发溢出或精度问题。

核心观点:边界值分析不是测所有值,而是测最容易出问题的那些值。

3.2 上点、内点、离点的概念

这三个概念,是边界值分析法的灵魂。我刚开始学的时候也绕了一阵,后来用个例子就记住了。

假设一个输入条件要求:值在 1 到 100 之间(包含 1 和 100)。

概念 定义 例子
上点 边界上的点(有效或无效) 1、100(有效上点);0、101(无效上点)
内点 有效范围内的任意一点 50(随便选一个)
离点 离边界最近的那个无效点 0(离 1 最近)、101(离 100 最近)

我的小技巧:上点就是「门槛」,内点是「屋里随便一个位置」,离点是「门槛外面一步」。这样记,永远不会乱。

3.3 实战案例一:密码长度 6-16 位

这个需求太常见了。我们直接看测试用例怎么设计。

需求:密码长度必须为 6 到 16 位(包含 6 和 16)。

按照边界值分析法,我们需要测这些值:

  • 上点:5 位(无效)、6 位(有效)、16 位(有效)、17 位(无效)
  • 内点:10 位(有效)
  • 离点:5 位(离 6 最近)、17 位(离 16 最近)

等等,你发现没?5 位既是无效上点,又是离点。这种情况,只测一次就行,不用重复。

用例编号 输入(密码长度) 预期结果 覆盖点
TC-01 5 位 提示「密码长度不足」 无效上点 / 离点
TC-02 6 位 验证通过 有效上点
TC-03 10 位 验证通过 内点
TC-04 16 位 验证通过 有效上点
TC-05 17 位 提示「密码长度超限」 无效上点 / 离点

注意:如果需求是「6 到 16 位,不包含 6 和 16」,那上点和离点就完全不一样了。一定要先搞清楚边界是开还是闭。

3.4 实战案例二:温度范围 -20~60°C

这个案例来自我之前做的一个物联网项目。设备的工作温度范围是 -20°C 到 60°C(包含两端)。

边界值分析后,测试用例是这样的:

用例编号 输入(温度°C) 预期结果 覆盖点
TC-06 -21 设备报警「温度过低」 无效上点 / 离点
TC-07 -20 设备正常运行 有效上点
TC-08 0 设备正常运行 内点
TC-09 60 设备正常运行 有效上点
TC-10 61 设备报警「温度过高」 无效上点 / 离点

嗯,这里要注意:温度是连续值,但测试时我们只能选离散的点。边界值分析帮我们找到了最关键的 5 个点。

3.5 边界值分析法的知识体系

下面这张图,是我自己总结的边界值分析法的完整流程。你看一遍,基本就全通了。

边界值分析法知识体系 边界值分析法 上点(边界上的点) 内点(有效范围内的点) 离点(边界外的最近点) 有效上点 无效上点 任意一个有效值即可 边界外紧邻的那个值 案例1:密码长度 6-16 位 案例2:温度范围 -20~60°C 常见误区:混淆开闭区间 / 遗漏离点 核心原则:用最少的用例,覆盖最多的边界风险

3.6 常见误区

这些坑,我几乎都踩过。分享出来,你们就别再踩了。

误区一:混淆开区间和闭区间

我曾经有个项目,需求写的是「年龄大于 18 岁」。我按闭区间测了 18 岁,结果上线后 18 岁的人全注册成功了。后来才发现,需求是开区间,18 岁不应该通过。记住:开闭区间不同,上点和离点完全不同。

误区二:只测上点,不测离点

很多人觉得测了边界值就够了。其实离点才是最容易漏测的。比如密码长度 6-16 位,你测了 6 位和 16 位,但没测 5 位和 17 位。结果开发写了个 if (len > 6 && len < 16),6 位和 16 位反而成了无效输入。离点就是用来揪这种错误的。

误区三:内点随便选一个就行

内点虽然不用像边界那么精确,但也不能太随意。我建议选一个远离所有边界的中间值。比如 1-100 的范围,选 50 就比选 2 好。因为 2 离边界太近,可能无意中覆盖了边界附近的逻辑。

我的经验总结:边界值分析法不是万能的,但它能帮你用最少的用例,发现最多的边界 Bug。我一般会在等价类划分之后,立刻做边界值分析。两者配合,效果最好。