网易首页 > 网易号 > 正文 申请入驻

我删掉了所有手写测试,用线上流量生成了它们

0
分享至

凌晨两点,第17次CI失败后,我终于承认一件事:我写的测试,测的是我对代码的想象,不是代码本身。

这不是某个小团队的困境。每个后端工程师都熟悉这种场景——你对着POST /orders端点,凭记忆拼凑请求体,猜测字段该填什么,然后假装自己在测试API。


真正击穿我的是一次线上事故。用户传了空数组items和过期优惠券EXPIRED2022,系统返回422。这个组合我从未想过,但用户想到了。生产环境成了我的测试盲区。

问题的根源:我们在用错误的"真相"写测试

手动写测试时,我的信息来源是什么?

读代码时的理解、脑子里对端点行为的假设、可能还记得的几个Postman请求。但这些都不是真相。

真相是生产流量——真实用户、真实参数、真实边界情况。数据已经存在,我只是没用。

六个月前我开始想:如果直接捕获流量呢?拦截每个HTTP请求和响应,拿到方法、路径、请求头、请求体、状态码,就有了一切生成测试的原材料。不是猜的测试,是基于真实发生的测试。

架构比想象中简单

整个链路五步走:

进站请求 → 中间件(按X%采样)→ 脱敏PII(邮箱、令牌、卡号)→ 上传收集器 → httrace generate生成测试文件

采样率是关键。100%捕获没必要,开销和成本都扛不住。10%就能拿到统计上有效的样本。

Python ASGI中间件的核心逻辑很直白:初始化时配好api_key、service名、sample_rate;每次请求先判断类型和随机数,不符合采样率直接放行;符合的就捕获请求体、劫持响应流、记录状态码和延迟,最后异步上传。

fire-and-forget的设计让上传不阻塞主请求,latency_ms用time.monotonic()算,避免系统时间跳变的影响。

脱敏不是可选项,是红线

捕获流量最大的阻力从来不是技术,是合规。邮箱、身份令牌、信用卡号必须脱敏,否则就是埋雷。

我的做法是字段级识别:正则匹配邮箱格式、Luhn算法校验卡号、关键字匹配token/auth字段。脱敏后替换为占位符,比如user_123@example.com变成user_@redacted.com,保留结构但销毁内容。

这里有个细节:某些字段看似无害,组合起来却能定位到人。比如user_id + 时间戳 + IP段,足够缩小到个体。所以脱敏策略要覆盖关联风险,不只是单字段。

从原始流量到可运行测试

收集器攒够一批流量后,httrace generate命令启动转换。这一步要解决几个问题:

同一端点的不同参数组合要聚类,避免生成一千个几乎一样的测试;响应体里动态生成的字段(如created_at、uuid)要做模糊匹配,不能硬编码断言;依赖外部服务的调用要mock,否则测试跑不通。

生成的测试长这样:

def test_post_orders_items_empty_coupon_expired(): resp = client.post("/orders", json={ "user_id": "user_abc123", "items": [], "coupon": "EXPIRED2022" }) assert resp.status_code == 422 assert resp.json()["error_code"] == "COUPON_INVALID"

注意user_id被哈希脱敏了,但业务逻辑完整保留。这个测试来自真实用户的失败请求,不是我拍脑袋想的。

采样策略的权衡

10%是起点,不是终点。不同端点应该有不同的采样率:

核心支付链路可以提到50%,因为失败代价高;只读查询可以降到1%,因为行为稳定;新上线的实验功能临时提到100%,快速积累样本。

采样还要考虑时间分布。流量高峰期的样本更能代表真实压力,低谷期的可能全是爬虫和监控探针。我的中间件加了简单的时间权重,高峰样本优先入库。

和手写测试的共存

流量生成的测试覆盖"发生了什么",但不覆盖"应该发生什么"。边界条件的主动设计、业务规则的显式断言,仍然需要人写。

我的混合策略:流量测试保回归,手写测试保正确性。每次部署前,流量测试确保没破坏现有行为,手写测试确保新功能符合预期。

有个意外收获:流量测试暴露了手写测试的盲点。比如我发现某个端点对Content-Type的容错比文档写的更宽松,文档说必须application/json,实际上text/plain也能过,因为代码里做了自动转换。这个行为被流量测试捕获后,我决定不修复代码——而是更新文档。

成本核算:比你想象的便宜

很多人问存储开销。按日均100万请求、平均请求响应体各10KB、10%采样算:

每日原始数据:100万 × 10% × 20KB = 2GB

压缩后约400MB,云端存储月成本几十块。脱敏和聚类后的测试代码更小,Git仓库无压力。

真正的成本是认知:团队要接受"测试不是人写的"这件事。我见过最强烈的抵触来自资深工程师,他们担心失去对测试质量的控制。我的说服方式是并排跑一个月,对比流量测试和手写测试的漏报率,数据说话。

失败案例:我踩过的坑

第一次上线时没做请求体大小限制,一个用户上传了50MB的JSON数组,直接把中间件内存打爆。后来加了10MB硬上限,超限的请求只记元数据不记body。

还有一次脱敏规则漏了手机号,测试代码里出现了真实号码,被安全扫描拦下。现在脱敏模块有强制审计日志,每次生成报告列明识别出的敏感字段类型和数量。

最尴尬的是时区问题。流量里的created_at是UTC,生成测试时没转换,CI服务器在另一个时区,断言失败。现在所有时间字段统一用ISO 8601带时区格式,比较时做归一化。

为什么这件事值得做

手动写集成测试的本质矛盾:你在用静态代码去验证动态系统,用有限想象去覆盖无限组合。流量驱动测试把这个关系倒过来——让系统的真实行为告诉你它需要被验证什么。

这不是说工程师可以偷懒。你仍然要理解业务、设计架构、写出能捕获流量的代码。但测试的维护成本,从"每个变更都要人工更新一堆假设"变成了"系统自愈式地跟随生产环境"。

六个月下来,我的测试覆盖率从62%升到89%,但更重要的是覆盖质量。那些89%里,有37%来自我永远不会手动想到的参数组合。它们在线上发生了,被捕获了,现在被保护了。

最后说个冷笑话:我现在写测试的时间确实少了,但调试测试生成器的时间多了。自动化这件事,总是把一种工作变成另一种工作,只是后者可以批量解决罢了。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

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.

相关推荐
热点推荐
贵州一大学生户外瀑降死亡!梦想:爬雪山;赚钱让爸妈过上好生活

贵州一大学生户外瀑降死亡!梦想:爬雪山;赚钱让爸妈过上好生活

追月数星
2026-04-29 15:13:43
马頔一句玩笑话,孙杨妈妈怒骂节目组2小时,全网围观"妈宝男"

马頔一句玩笑话,孙杨妈妈怒骂节目组2小时,全网围观"妈宝男"

乌娱子酱
2026-04-29 13:30:44
刚刚,直线拉升!美伊谈判,大消息!

刚刚,直线拉升!美伊谈判,大消息!

中国基金报
2026-04-29 18:48:19
深圳:爆涨173.8%背后的信号

深圳:爆涨173.8%背后的信号

功夫财经
2026-04-24 08:31:43
中国羽毛球协会主席、南京体育学院副院长张军接受审查调查

中国羽毛球协会主席、南京体育学院副院长张军接受审查调查

界面新闻
2026-04-29 16:03:51
辣眼!侃爷澳洲妻子再穿暴露连体衣,大方展示...!外媒都看不下去了

辣眼!侃爷澳洲妻子再穿暴露连体衣,大方展示...!外媒都看不下去了

澳洲红领巾
2026-04-29 14:44:16
太美了!梅州粉红拉拉队出圈,麻花辫造型,戳中不少观众怀旧情怀

太美了!梅州粉红拉拉队出圈,麻花辫造型,戳中不少观众怀旧情怀

火山詩话
2026-04-29 13:29:57
霸王茶姬奶茶中喝出水银?官方通报:奶茶中异物系购买人投放

霸王茶姬奶茶中喝出水银?官方通报:奶茶中异物系购买人投放

界面新闻
2026-04-29 17:41:51
广东一科技公司18岁员工在厕所长时间玩手机被开除,照片被发到400人员工群,公司称没拍到脸,负责人称通过门缝拍摄而得,当地人社局回应

广东一科技公司18岁员工在厕所长时间玩手机被开除,照片被发到400人员工群,公司称没拍到脸,负责人称通过门缝拍摄而得,当地人社局回应

大风新闻
2026-04-29 09:59:11
绝了!霍福德娶环球小姐冠军!生6个孩子!网友:这才是人生赢家

绝了!霍福德娶环球小姐冠军!生6个孩子!网友:这才是人生赢家

罗氏八卦
2026-04-29 18:10:03
受贿数额特别巨大,广西壮族自治区党委原副书记、自治区政府原主席蓝天立被提起公诉

受贿数额特别巨大,广西壮族自治区党委原副书记、自治区政府原主席蓝天立被提起公诉

界面新闻
2026-04-29 10:03:28
竞拍者叫价6003万元抢到深圳高端别墅后悔拍,758万元保证金打水漂,竞拍时曾一次性加价达2211万元,拍卖方回应

竞拍者叫价6003万元抢到深圳高端别墅后悔拍,758万元保证金打水漂,竞拍时曾一次性加价达2211万元,拍卖方回应

极目新闻
2026-04-29 12:45:06
Meta被曝决定撤销对Manus的收购!

Meta被曝决定撤销对Manus的收购!

穿透
2026-04-29 13:16:12
华为乾崑升级背后:智能汽车竞争的终局,是安全与可靠

华为乾崑升级背后:智能汽车竞争的终局,是安全与可靠

IT168
2026-04-24 10:17:50
不打了!确认退出G5!曝火箭或交易杜兰特

不打了!确认退出G5!曝火箭或交易杜兰特

篮球实战宝典
2026-04-29 17:49:17
中央定调点名!广东突然在深圳宣布一个10万亿大蛋糕!

中央定调点名!广东突然在深圳宣布一个10万亿大蛋糕!

深圳梦
2026-04-28 21:56:14
汤杯小组头名战!战略性放弃8-21饮恨,李诗沣2-1复仇拉克什亚

汤杯小组头名战!战略性放弃8-21饮恨,李诗沣2-1复仇拉克什亚

钉钉陌上花开
2026-04-29 17:24:30
世锦赛战报:墨菲被罚了28分,仍完成黑球绝杀,4分险胜赵心童

世锦赛战报:墨菲被罚了28分,仍完成黑球绝杀,4分险胜赵心童

吴朑爱游泳
2026-04-29 02:22:54
华为 FreeBuds Pro 5 众测试听挑战!到底什么才是好音质?

华为 FreeBuds Pro 5 众测试听挑战!到底什么才是好音质?

极果酷玩
2026-04-28 15:21:42
刚刚,证监会重磅信号!

刚刚,证监会重磅信号!

成方街哨兵
2026-04-29 17:42:30
2026-04-29 20:43:00
全栈遛狗员
全栈遛狗员
白天跟需求对线,晚上在小区遛狗。
1969文章数 51关注度
往期回顾 全部

科技要闻

今晨庭审纪实|马斯克当庭讲述OpenAI被偷走

头条要闻

男子诈骗熟人350万 朋友圈发文"我跑路了 你们报案吧"

头条要闻

男子诈骗熟人350万 朋友圈发文"我跑路了 你们报案吧"

体育要闻

一场九球狂欢,各路神仙批量下凡

娱乐要闻

马頔一句话,孙杨妈妈怒骂节目组2小时

财经要闻

苏州,率先进入牛市

汽车要闻

技术天花板再摸高 全能型的奕境X9首秀

态度原创

数码
本地
艺术
家居
公开课

数码要闻

追觅智能家电首秀硅谷!从空调到洗衣机,中国智造硬刚全球巨头

本地新闻

用青花瓷的方式,打开西溪湿地

艺术要闻

这些女神,竟然都是摄影师切尔尼亚季耶夫的复古作品!

家居要闻

寂然无界 简洁风格

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版