![]()
100%测试覆盖率,生产环境照样崩。这不是段子,是Reddit上一位Python开发者上周的真实经历——他花了2小时给邮箱验证函数写测试,全部通过,部署上线,用户数据瞬间变成垃圾场。
那个看似无害的5行代码
他的验证逻辑简单到可笑:检查字符串里有没有「@」和「.」,有就返回True,没有就False。测试用例也配得很「工整」:一个标准邮箱[email protected]验证通过,一个乱写的「notanemail」验证失败。全部绿灯,提交,部署。
然后生产环境的用户开始表演:有人填「user@domain」没写顶级域名,有人填「@domain.com」没写用户名,有人填「user.name@」后面直接断了。这些全都被他的函数放行,数据库里塞满了永远无法送达的邮箱地址。
问题根本不在代码复杂度,而在测试用例的「想象力」太贫瘠。
![]()
他的测试只问「有没有@和点」,从没问过「@前面有没有东西」「点后面有没有东西」「这些东西组合起来像不像个邮箱」。这就像检查一把锁有没有钥匙孔和锁舌,却不试试钥匙能不能转动。
15分钟的补救 vs 2小时的自信
回滚之后,他换了email-validator库,重写了测试。这次花了15分钟,专门盯着各种「怪东西」:缺用户名的、缺域名的、带空格的、格式残缺的。这些测试用例加起来,比他之前2小时写的「标准测试」更有价值。
他总结了三条教训,每条都是血泪:
第一,用户破坏假设的方式永远比你想象的多。空字符串、null值、特殊字符、Unicode、超长输入——这些不是「极端情况」,是日常。
![]()
第二,别重复造验证轮子。邮箱、手机号、URL、信用卡号,都有成熟的库。它们的存在不是因为开发者懒,是因为它们见过你还没想到的边界情况。
第三,覆盖率是幻觉。100%覆盖率只代表你的测试跑过了每一行代码,不代表你的测试问过「这行代码该不该存在」。
测试的幻觉与生产的真相
这件事最讽刺的地方在于:开发者的直觉和测试的质量经常成反比。他坦承自己「还在改进」,因为总会发现自以为「完整」的测试,被生产环境证伪。
测试数据通常是干净的——开发者手动构造,逻辑清晰,格式规范。生产数据是用户从Excel粘贴的、浏览器自动填充错的、手指滑屏按错的。两种数据之间的鸿沟,才是bug的真正温床。
他最后没有给出什么「终极解决方案」,只是留下一个开放的提醒:下次写测试时,先问自己「用户会怎么搞砸这个」,而不是「这个功能正常时该长什么样」。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.