版本注册表
把所有存本地的数据模块登记在清单里,通过版本递增检查和漏登记扫描确保数据格式变更不会搞炸用户数据——“最好的测试不是测功能对不对,而是测我有没有忘了某件事”
简介
版本注册表是 Shawn 在开发阿布时发明的一种测试机制,专门解决 AI 编程中一个高频灾难性问题:AI 在修改代码时”遗忘”了数据格式变更需要配套的数据迁移(migrate)。
背景是阿布会把用户设置、对话历史、定时任务等 10 类数据存在用户本地。每次改格式(加字段、改字段名),必须同时写”把老格式转成新格式”的迁移代码。Shawn 曾因一次发版漏了迁移导致用户打开是空白,之后发明了版本注册表机制:把所有数据模块登记在清单里,跑两个自动检查——版本号是否递增、是否有漏登记的新数据类型。
这个机制在 6 周里拦截了 16 次设置数据格式变更中的潜在遗漏。其核心启发超越了测试本身:最好的测试不是测”功能对不对”,而是测”我有没有忘了某件事”。
关键信息
- 类型:概念 / 测试实践
- 领域:AI 编程 / 数据持久化 / 质量保障
- 解决问题:AI 修改代码时遗忘配套的数据迁移
- 灵感来源:用户数据搞炸事故
- 相关概念:Claude Code、阿布 Abu
核心特性
机制设计
注册清单:把所有存本地的数据模块登记在清单里
| 数据模块 | 格式变更次数 |
|---|---|
| 设置 | 16 次 |
| 对话 | 4 次 |
| 定时任务 | 3 次 |
| 触发器 | 4 次 |
两个自动检查:
- 版本号递增检查:每次改格式必须将版本号 +1。改了格式但忘了 +1 → 报错
- 漏登记扫描:自动扫描所有存在本地的数据,发现有数据不在清单里(新加的数据类型但忘了登记和写 migrate)→ 立刻报错
为什么这个机制重要
第二个检查(漏登记扫描)是真正救命的——它意味着只要 Claude 悄悄加了一个新的会被存到本地的数据类型,但忘了登记和写 migrate,提交代码的时候就会被自动拦下来。
在 6 周里,“设置”这类数据改了 16 次格式。如果没有注册表,这 16 次中任何一次忘了写格式转换,都会让一批用户的本地数据崩溃。
不同素材中的观点
- 2026-05-29-woshipm-shawn-abu-claude-code-6-weeks:版本注册表是 Shawn 认为阿布测试实践中最有价值的一个。核心启发:AI 会把之前的修复”无意识地”撤销——它没有那次修复的记忆。版本注册表的作用不是测功能对不对,而是测”我有没有忘了某件事”。这是一种从事故中生长出来的测试模式,与传统测试思维(测功能正确性)有本质区别——它测的是完整性(有没有遗漏)而非正确性(做得对不对)
实用信息
快速上手步骤
- 识别项目中所有”存本地”的数据模块(设置/缓存/历史/配置等)
- 创建一张注册清单,每个模块登记名称和当前格式版本号
- 写两个自动检查脚本:①检查版本号是否递增 ②扫描是否有没有登记的新数据
- 把这两个检查加入提交前的 CI 检查流程
注意事项
- 核心价值在于”测完整性”——不是每个测试都适合这个模式
- 特别适合有本地数据持久化的桌面/移动应用
- AI 编程场景下尤为重要——AI 会遗忘配套的迁移代码