已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
【背景】 3 年测试开发,负责一条 B 端 SaaS 的订单 + 支付链路(Java 17 + Spring Boot 3.2 + MySQL 8.0.34),接口自动化 pytest 7.4 + httpx 约 900 条用例,跑在 5 人共享 staging(MySQL 8.0 + Redis 7.2,GitLab CI)。团队已按社区经验给写接口加了幂等键(客户端生成 UUID,服务端幂等表唯一索引 + 状态机),设计侧参考过 id=1562(幂等三件套)和 id=1884(状态机语义),并发竞态的用例参考 id=697(线程池 + 乐观锁版本号)也写了一版。
但过去半年我复盘了 3 起线上问题,共同点是:幂等设计本身没 bug,是我们的测试从来没真正验证过「客户端超时 → 重试」这条路径。幂等测试用例目前只有「同一幂等键连发两次,断言第二次返回 409 + 状态不变」——这只能覆盖「请求都正常到达」的场景,覆盖不到真正致命的场景:
【现象 / 卡点】
timeout toxic(服务端处理完但响应不回传):理论可行,但 toxic 的生效窗口(请求到达后多久开始丢弃响应)我调不准,用例偶发「第一次请求被 toxic 直接 drop 掉、根本没执行」,红了又绿,和我们治理 flaky 的投入直接冲突;【已尝试的排查与结果】
bandwidth toxic 把响应带宽压到极低(如 10KB/s),配合客户端 500ms 超时:能稳定触发「服务端执行完 + 客户端超时」,但用例耗时从 0.3s 涨到 3s+,且对 runner 负载敏感(4C8G 上偶发第 2 次请求也超时),flaky 率 ~8%;【期望得到的答案形态】
我目前的倾向是「toxiproxy timeout toxic + 服务端主动标记『已执行』到 Redis(带 TTL)+ 测试侧断言 Redis 标记 + 查库」的组合,但「服务端主动标记」这个方案在生产环境有没有副作用(比如标记和写库不在同一事务里,标记成功但写库失败),我还没想清楚,想先听听大家踩过的坑。