编码前的边界情况检查清单

边界情况不提前写,开发阶段一定会靠默认假设补齐。

快速结论

至少检查空值、重复请求、数量上限、权限差异、并发冲突、外部依赖失败和回滚成本。把这些项写入规格后,很多线上事故会在评审时就消失。

你应该先看什么

可直接复用的示例

边界清单
- Null / Empty / Unknown
- Duplicate / Retry / Reorder
- Permission / Visibility
- Timeout / Partial Failure / Rollback

高风险领域示例

以下示例涵盖三个边界情况代价最高的领域:支付处理、身份认证和文件摄入。在这些场景中,晚发现边界情况的修复成本极高。

# 支付处理边界情况
- amount = 0.00 → 校验错误拒绝,不调用支付网关
- 购物车与银行卡币种不匹配 → 400,不扣款
- 扣款发起后网关超时 → 记录模糊状态,触发对账任务,返回 503 含 retryable 标记
- 10 秒内重复支付请求 → 返回原始收据,不二次扣款

# 身份认证边界情况
- token 过期后 1ms 使用 → 401,非 403
- 有效 token 但账号已停用 → 403 含 account_suspended 错误码
- 同时从 3 个会话登录 → 最早会话失效,新会话签发,审计日志记录全部三个事件
- 重置密码链接首次点击后再次使用 → 410 Gone

# 文件上传边界情况
- 文件大小恰好达到上限(10MB)→ 接受
- 文件大小超过上限 1 字节 → 413 含明确大小提示
- 文件类型伪造(PDF 扩展名但内容为可执行文件)→ 内容检测拒绝,非扩展名检测
- 上传中途中断 → 丢弃不完整文件,不创建记录

支付边界情况到达生产通常导致双重扣款或未对账交易——两者修复成本均高。认证边界情况未文档化会产生不一致的安全行为,在审计前不可见。文件边界情况是内容检测缺失时最常见的安全漏洞来源。

优先级排序:风险 × 可发现性

并非每个边界情况都需要相同程度的规格细节。实用的优先级排序使用两个维度:出错后的后果(风险),以及 QA 或监控在生产中发现它的难易程度(可发现性)。高风险叠加低可发现性,要求在实现前明确写入规格并映射测试用例。

这个优先级排序的输出不是所有可能边界情况的完整列表——那既不可能也适得其反。而是团队在编码前达成共识的优先列表,每项均标明测试责任人和解决时限。

跨系统层的边界情况

边界情况在不同系统层的分布规律各异。一个用户操作可能同时在 API 层、服务层、数据库层和后台任务层暴露各自的边界情况。规格应标明每个边界情况所在的层次,以确保正确的工程师负责对应的测试。

任务层的边界情况是最常见的覆盖盲区。由于任务异步运行,其失败对用户在请求时不可见——这正是它们需要明确规格覆盖的原因。一个静默丢弃记录的未文档化任务失败模式,比用户可以重试的同步错误危害更大。

落地建议

拿最近一个上线后出问题的功能做回溯:这份清单里哪几项当时没覆盖?大多数时候答案是空值处理、重试幂等或并发写冲突。找到了就在下一个功能的规格里提前写进去。

如果团队觉得边界情况太多,可以先只记录“高风险且低可发现性”的项。这样不会让规格膨胀,同时能优先覆盖最可能造成生产损失的路径。

评审时也可以给每个边界情况标记处理方式:立即实现、写成非目标、加监控观察,或放入后续版本。没有分类的边界情况很容易在实现中被遗忘。

分类后的清单更容易进入测试计划和发布检查。

它也能防止团队把所有边界情况都当成同等优先级。

更新日期:2026-03-10

相关文章

评审时如何使用这份清单

建议在实现前把清单拆给不同角色:产品检查空状态和用户期望,研发检查并发、幂等和数据边界,QA 检查每个边界是否有可执行用例,运维或值班负责人检查异常是否可观测、可告警、可回滚。

如果某个边界暂时不处理,也要写清理由和风险接受人。未处理的边界不一定阻止上线,但它应该是一个明确决策,而不是评审时漏看的空白。

把边界条件接回测试和发布

边界条件只有进入测试和发布判断,才算真正完成。评审结束后,应把高风险项分别落到自动化测试、手工验证、监控指标或发布观察清单里。无法验证的边界条件,需要改写成可观察状态,例如错误码、空状态文案、审计日志或告警阈值。

如果某个边界条件暂时不处理,也要写进非目标或后续任务。这样上线后出现相关问题时,团队能判断这是有意延期,还是评审时遗漏。

编辑说明

本指南涵盖 编码前的边界情况检查清单,面向 Spec-First 工程团队。示例为说明性场景,非生产代码。