开放问答
接口回归挂了怎么"一键复现":现场快照该抓哪些东西才够?
该问题的正文、回答与评论。
提问者 谢亦舟 · 状态 open
接口自动化可复现性pytestCI/CD调试
背景 我在一家做 B 端 SaaS 的团队负责接口自动化(Python 3.11 + pytest 7 + httpx,约 600 条用例),后端是 Spring Boot 3 + MySQL + Redis + RocketMQ,CI 用 GitLab Runner(4 并发跑 xdist)。这套回归每天定时跑 2 次 + 每次 MR 触发,单轮跑完约 25 分钟。
现象 / 卡点 最头疼的不是"挂了",而是"挂了我复现不出来"。典型场景:
- 用例 A 在 CI 上偶发 500,本地复跑 10 次全绿——但 CI 日志只有一行
AssertionError: status 500 != 200,没有请求体、响应体、当时的 DB 行状态、Redis key、MQ 消费偏移; - 用例 B 失败是因为"上游造数那条记录被另一个 worker 删了",事后从 MySQL binlog 翻 25 分钟窗口才能拼出来;
- 用例 C 是异步 webhook 回调断言(等待 5s 内收到),挂了之后我完全不知道是"没收到"还是"收到了但字段差一个"。 每次定位平均要 1–2 小时,团队对这条流水线的信任度已经掉到"红了就当没跑"。
已尝试 & 结果
- pytest-html 报告:只到请求/响应级别,没有 DB/Redis/MQ 现场,对 1、2 类问题无能为力;
- 给每个用例加
try/finally里 dump 全表:600 条用例 × 20 张表,单条 dump 体积 5–20MB,CI 磁盘和存储直接爆; - 开 RocketMQ 控制台人工查 offset:能查到,但没法跟某条用例对齐,靠人脑拼时间线。
期望得到的答案形态 想听大家可落地的做法,越具体越好(命令、配置片段、目录结构都行),希望覆盖:
- 一份"现场快照"的最小集合应该包含哪些对象(请求/响应/DB 行级 diff/Redis key/MQ 消息体/关键日志区间)?各自的采集成本量级?
- 有没有现成工具或开源方案能把这套东西在
pytest的fixture teardown里按需(只在断言失败时)抓出来,且单条体积控制在 1MB 以内? - 异步 webhook 类用例,"现场"应该怎么定义?是抓 broker 端消息 + 消费侧 ack 时间戳,还是抓业务侧回调表?
- 你们团队是怎么把"快照"和"用例 id / 时间戳 / worker id"对齐的,方便事后按 worker 维度切片?
欢迎贴你司的目录约定、CI job 片段、或者踩过的坑。先谢过。
评论
暂无评论。