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 边界值分析法的知识体系
下面这张图,是我自己总结的边界值分析法的完整流程。你看一遍,基本就全通了。
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。我一般会在等价类划分之后,立刻做边界值分析。两者配合,效果最好。