边界值分析
边界值分析是在有序取值中,重点检查处理规则交界处及其附近取值的方法。它适合发现上限下限写错、开闭区间理解不一致,以及长度和时间判断差一个单位的问题。
边界不是一组固定数字。先明确范围、是否包含端点、取值单位和取整规则,才能推导出有意义的输入。
1. 面试核心
先记住这几条,再读正文- 边界来自处理规则发生变化的位置。整数范围、文件字节数和到期时刻都有边界,格式类别本身则未必存在大小顺序。卡 · 有序范围与取点
- 取点要核对端点及相邻规则。“前一个”和“后一个”取决于最小有效单位,不能对所有类型都简单加减 1。卡 · 单位、表示与精度
- 空值、缺失和错误类型不是普通数值边界;它们需要独立的输入分类。长度为零也不等于字段不存在。卡 · 空值与特殊输入
- 多个条件同时限制结果时,分别触发每条限制,再检查交界和组合。商品上限通过不代表库存限制也正确。卡 · 综合题
2. 有序范围与取点
边界值分析建立在 等价类划分之上。若数量只允许 1 到 99 的整数,就有低于下限、合法区间和高于上限三个有序类别。
围绕合法区间的两个端点,可以先选择:
| 位置 | 输入 | 预期 |
|---|---|---|
| 下限外侧 | 0 | 拒绝 |
| 下限本身 | 1 | 接受 |
| 下限内侧 | 2 | 接受 |
| 上限内侧 | 98 | 接受 |
| 上限本身 | 99 | 接受 |
| 上限外侧 | 100 | 拒绝 |
再保留一个普通有效值,例如 25,用来区分“只支持边缘值”和“整个范围的正常行为”。这些期望都还要以库存、身份等其他条件满足为前提。
这六个值针对示例中的两个合法端点,不是所有系统的固定答案。如果规则改成 1 < quantity < 99,则 1、99 的期望都改变;如果只允许偶数,合法值之间的间隔和类别又不同。
使用“两值边界”“三值边界”等覆盖口径时,应先列出到底把哪些类别端点算作边界,再计算覆盖项。不同题设对类别和可取值范围的定义会影响取点,不能仅凭一个公式给出数量。
3. 单位、表示与精度
相邻输入要能被系统准确表示,并且符合约定单位。下面几个约束看起来都是一个“上限”,取点方式却不同:
| 约束 | 需要明确 | 可以选择的检查 |
|---|---|---|
| 文件不超过 5 MiB | 1 MiB = 1,048,576 字节 | 5,242,879、5,242,880、5,242,881 字节 |
| 金额最低 0.01 元 | 以分存储,还是允许更多小数位 | 0 分、1 分、2 分,另测非法精度 |
| 密码长度 8 到 64 | 字符、码点、字节还是可见字符 | 对明确的长度计量构造 7、8、9、63、64、65 |
now < expires_at 有效 | 时间精度、时区与判定使用的时钟 | 到期前一个可表示单位、恰好到期、之后 |
浮点数不能一律用 x ± 0.01 表示最近邻。数学上的连续区间没有紧邻的前后两个实数,而计算机的数值表示和业务精度都有限。应先确定实际输入与比较方式,再选择能揭示舍入和端点问题的数值。
时间测试也应控制时钟。若规定 now == expires_at 已过期,就需要可靠地产生这个状态;让测试线程睡到大约那个时刻,再依赖调度碰中毫秒边界,很难得到可重复证据。
4. 多条件边界
购物车的数量可能同时受单品限购、库存和单次购买上限约束。假设三者分别为 5、3、99,直接提交 6 得到拒绝,并不能说明系统正确校验了限购 5:库存 3 就足以先拒绝。
可以分开建立环境:
| 验证目标 | 其他条件 | 取点思路 |
|---|---|---|
| 单品限购 5 | 库存大于 5,其他限制不生效 | 4、5、6 |
| 库存 3 | 限购大于 3 | 2、3、4 |
| 两个限制恰好相同 | 库存与限购都为 5 | 核对允许数量、拒绝原因及一致性 |
| 结算时库存减少 | 加入购物车后再改变库存 | 检查重新校验与提示,不只看旧页面 |
如果两个用户同时购买最后一件商品,还需要控制并发时序并检查最终库存和订单。这属于共享状态竞争,不会因为单线程已经测过 0 和 1 就自动覆盖。
5. 空值与特殊输入
长度为零属于长度范围,字段缺失属于输入结构,null 属于显式空值。只有契约明确赋予它们相同含义时,才可以讨论合并;它们不是“都在下限附近”就可以只测一个。
边界检查还要看副作用。非法数量被拒绝后,库存、价格和已有购物车记录应该保持什么状态,需要分别核对。只检查页面出现提示,可能漏掉后台已经写入错误数量的实现。
6 · 面试题卡片
本页题目与参考回答
6.1 什么是边界值分析,怎样为 1 到 99 的整数范围选值?
考察重点:有序类别、端点含义及取点依据。
相关内容:有序范围与取点。
参考回答
重点验证规则切换处及其附近值,先确认 1 和 99 是否包含在合法范围内。 若二者都包含,可以围绕合法端点选择 0、1、2、98、99、100,分别核对拒绝与接受,再保留普通有效值。
取点数量来自具体类别和覆盖目标。存在步长、额外阈值或开区间时,需要重新推导,而不是机械使用同一组数。
6.2 文件大小、金额和时间的边界都可以用加减 1 来测试吗?
考察重点:业务单位、可表示值与精度。
相关内容:单位、表示与精度。
参考回答
必须先说明这个 1 是什么单位,以及系统实际接受和比较什么表示。 字节大小可以加减 1 字节,以分存储的金额可以加减 1 分;时间则要根据秒、毫秒等精度和端点包含规则取值。
浮点数没有统一的十进制最近邻间隔。边界测试还需考虑舍入、非法精度和可控时钟,避免数据实际上没有落在计划检查的位置。
6.3 已经测试了空字符串,还需要测字段缺失和 null 吗?
考察重点:长度边界与结构、类型类别的区别。
相关内容:空值与特殊输入。
参考回答
需要根据契约分别判断,空字符串只覆盖长度为零的字符串。 缺失可能触发默认值,null 可能表示清空,也可能因类型不符被拒绝。
三种表示可能走不同路径,不能因为都没有可见文字就认为同一个测试足够。
6.4 购物车数量应测试哪些边界,只有最大购买数量够吗?
题型:综合题
考察重点:单个限制、组合限制与状态变化。
参考回答
除最小值和最大值,还要区分限购、库存、数据类型以及加入购物车后的状态变化。 分别让每条限制成为真正生效的条件,检查边界内外的返回与副作用。
例如库存低于限购时,不能用一次超限拒绝证明限购逻辑正确。还应检查结算前库存变化和并发购买最后一件商品;单线程数值边界不能替代并发一致性验证。
7. 参考资料
来源:Coding 101 原文 · 免费阅读,引用请保留出处。内容使用说明