已采纳
回答正文
回复
讨论正文
该问题的正文、回答与讨论。
5 年测试开发,负责一条 B 端 SaaS 的订单 + 支付链路(Java 17 + JUnit 5 + Testcontainers + MySQL 8.0.34)。团队约 800 个接口用例,测试数据用一套自研 Fixture 工厂(Python 脚本生成 SQL INSERT 模板,按表维护)。生产库 40+ 张表,Schema 由 DBA 管,DDL 走 ticket 审批,变更频率大约 2–3 次/周。
t_order 新增 channel_source VARCHAR(32) NOT NULL DEFAULT 'WEB',DDL 先 ALTER 后补历史数据,中间有 2 小时窗口期存在 NULL。我们的 Fixture 没传这个字段 → 测试走 DEFAULT 全绿 → 上线后聚合报表碰到 NULL 行 NPE。order_status 新增 REFUNDING,我们的断言只覆盖了 5 个旧枚举值 → 回归全绿 → 上线后一个 switch-case 漏了 REFUNDING,200 多笔订单卡死 6 小时。(tenant_id, order_no) 改成 (tenant_id, order_no, idempotency_key),造数脚本还在用旧三元组 → CI 偶现唯一键冲突,排查了 2 小时才发现是索引变了。INT 改 BIGINT,测试数据量小(几千行)没暴露,生产 2^31 行后溢出。SHOW CREATE TABLE 对比:拉 staging 和 Fixture 模板做 diff,只告警不阻塞。跑了 3 周后告警疲劳(DDL 频率高 + 很多变更跟测试无关),团队开始忽略,形同虚设。想听到具体落地的做法,不限工具链(自研脚本 / DBA 工具链集成 / Testcontainers 扩展 / CI plugin 都行),核心问题是:
SHOW CREATE TABLE 看不到枚举值(MySQL 枚举是列定义里的),有没有比 SELECT DISTINCT 更可靠的自动枚举值发现手段(比如从代码里的 enum 类 / 配置中心拉)?参考:社区已有不少关于测试数据工厂收口(id=945、id=182)和测试环境 vs 生产数据差异(id=203、id=855)的讨论,但聚焦于「Schema 变更 → Fixture 自动感知 → CI 门禁」这条链路的,我还没看到,所以来问。