《“这不是Bug,是Feature”?——一文终结测试圈这场吵了十年的争论》 你“支付按钮连点5下用户被扣了3次钱。”开发“需求文档写的是‘点击按钮发起支付’没写连点啊。”你每个测试工程师都经历过这样的场景你提了个Bug开发轻飘飘回一句“文档里没写”然后三方拉群、会议battle、最后不了了之。这篇文章帮你把这仗打赢。一、先说结论Bug到底怎么定义Bug软件缺陷指软件中任何不符合预期行为的问题。满足以下任一条件即可认定为Bug与需求不符—— 程序行为和需求文档、设计文档不一致与合理预期不符—— 普通用户不需要懂技术也知道“这不对劲”规格有遗漏—— 文档没写但按行业惯例和常识判断这个行为是错的注意第三条——这就是无数争端的根源也是本文的重点。文档只覆盖了“明示需求”但Bug的判定边界还覆盖“隐式需求”。二、别小看“文档没写”那些天价的隐式Bug觉得“没写就不算”是小事历史上几大翻车现场全是“文档没写”的场景Ariane 5火箭爆炸1996新火箭沿用了旧火箭的代码没人写过“新环境下数值可能溢出”这条需求。64位浮点数塞进16位整数升空37秒后爆炸损失数亿美元。Knight Capital2012部署遗漏导致旧代码被意外激活45分钟亏损4.4亿美元这家老牌金融公司直接濒临倒闭。电商超卖并发下单没做库存一致性校验秒杀活动库存扣成负数强制砍单引发公关灾难。看出规律了吗炸掉项目甚至公司的往往不是文档里的功能而是没人想到要写的场景。三、核心战场文档没写的怎么判定没有文档不代表没有标准。核心逻辑一句话程序在正常使用场景下是否合理稳定、是否符合用户合理预期、是否符合行业惯例与安全底线。3.1 五维判断表建议收藏判断维度倾向于是 Bug倾向于不是 Bug典型案例行业惯例与同类产品或平台规范明显相悖是有意的差异化设计且已说明所有App点“返回”都回上一级你的直接闪退用户合理预期正常用户认为“理所当然该这样”却没实现需要专业知识才能预期百项下拉框没搜索筛选让用户硬翻自身一致性同一功能在不同入口/环境表现不一致行为一致且符合定位同一按钮在A页能点、在B页没反应历史版本对照老版本正常新版本退化产品已明确公告变更上个版本能导出PDF这版突然导不了健壮性与安全底线极端输入/并发下崩溃、丢数据、越权第三方系统故障且不可控输入emoji就崩溃、特殊字符导致SQL报错3.2 实操五步走先复现排除环境因素—— 确认不是误操作、网络抖动或第三方故障问题能稳定重现查行业惯例—— 看同类成熟产品、平台规范Apple HIG、Material Design怎么处理找一致性参照—— 对比自身其他模块、上一版本、其他平台评估用户感知—— 换位成不懂技术的普通用户会不会困惑、误操作、丢数据评估影响后果—— 涉及资金、数据、安全、崩溃等“硬红线”直接一票认定为Bug3.3 一套“投票口诀”评审吵架时心里默念这个投票机制硬红线钱、数据、安全、崩溃——一票通过直接定Bug用户预期 行业惯例—— 两票确认一致性对照—— 佐证材料锦上添花四、实战还原三个经典Battle现场 现场一连点下单测试“支付按钮连点5下用户被扣了3次钱。”开发“用户自己手抖连点这不算吧”测试反击① 主流电商App的支付按钮点击后都置灰或转loading——行业惯例② 重复扣款是资金问题——硬红线③ 防重复提交本来就是“下单功能”的一部分——隐式需求。✅判定P0级Bug 现场二来电中断支付测试“用户人脸支付时来电话接完回来App白屏钱扣了订单没生成。”开发“文档没写‘来电中断’这个场景。”测试反击① 真实世界不是实验室——付款时来电话、弹推送、切出去回微信是高频日常场景② 主流App都有中断恢复机制——行业惯例③ “扣款成功但订单丢失”——数据一致性硬红线。✅判定P0/P1级Bug。中断测试是移动端标配不是可选项。 现场三跨零点边界测试“23:59:59下单支付成功时已过零点过期优惠券还被使用了财务对不上账。”开发“谁半夜59秒下单极端case。”测试反击① 双11零点几百万用户蹲点59秒下单——这不是极端case是峰值场景② 账务不一致——硬红线。✅判定Bug且大促前必须修复。五、十大“文档没写也要测”重灾区清单这是隐式Bug最爱出没的地方建议直接存成测试用例检查单#场景典型翻车现场1连点/双击提交按钮没防重一秒生成3个订单、抽奖多发3份奖品2中断场景来电、弹通知、切后台被杀、锁屏、低电量关机——支付中断后订单状态错乱3弱网/断网/网络切换电梯里、地铁过隧道、WiFi切4G——弱网下重复请求、超时后页面数据和实际不一致4时间边界23:59:59、闰年2月29日、手动改手机时间——会员提前过期、签到奖励重复领5并发/多端两台手机同时登录、网页和App同时改购物车——数据互相覆盖、库存扣负6输入法与特殊字符emoji昵称导致个人页崩溃真实高发案例数据库utf8存不了4字节emoji、粘贴10万字、空白字符绕过校验7权限拒绝之后拒绝相机/定位权限后直接闪退而不是友好引导去设置8深色模式/横竖屏/折叠屏深色模式白字白底、横屏后按钮消失、折叠屏展开布局错乱9数据量极端0条数据没有空状态提示、1万条列表滑动卡死、缓存占满后功能失效10版本升级/数据迁移老版本升级后本地数据丢失、历史订单打不开每一条都有两个共同点文档几乎不会写出了事全是P0。六、反方向提醒这些别乱提Bug判定标准是双向的提单前先过一遍个人习惯 ≠ 合理预期用户希望按钮放左边但全行业都放右边 → 这是需求建议不是Bug极端刁钻输入 ≠ 健壮性缺陷正常人根本不会构造的输入导致异常可酌情降级但涉及安全注入、越权必须算“就是这样设计的” ≠ 有效澄清开发一句“故意的”不能闭单需产品确认并留档第三方故障 ≠ 本程序Bug支付网关挂了不是你的锅但缺少友好的失败提示和降级逻辑这部分仍然是Bug回到开头那个场景。下次再有人说“文档没写就不算Bug”你可以把这篇文章甩过去然后补一句“文档没写 不是Bug”是唯文档论的单边结论。用户合理预期、行业惯例、稳定性底线都是需求的组成部分——它们只是没被写下来而已。当然实战中最好的做法永远是有分歧时拉上测试、开发、产品三方评审用标准说话而不是用嗓门说话。送大家一句口诀收尾用户没骂过不代表没问题文档没写过不代表不需要。毕竟我们的目标从来不是“谁赢”而是——别让Ariane 5的故事在你的项目里重演。如果这篇文章帮你赢下过一次评审battle欢迎点赞收藏。也欢迎在评论区分享你遇到过的最离谱的“这不是Bug”现场。