4. 冒烟清单设计原则:最小化验证集、关键路径覆盖、幂等性检查、回滚能力验证
在集成测试环境中,Liquibase 迁移的冒烟测试并非全量回归,而是以极低成本快速暴露阻断性故障。设计冒烟清单时,必须遵循四项核心原则:最小化验证集、关键路径覆盖、幂等性检查、回滚能力验证。这四项原则共同构成冒烟清单的骨架,确保每次迁移变更都能在 5 分钟内完成基础可信验证。
4.1 四项原则概览
| 原则 | 核心目标 | 典型验证点 | 故障发现类型 |
|---|---|---|---|
| 最小化验证集 | 用最少用例覆盖最高风险 | 核心表结构、索引、外键 | DDL 执行失败、列缺失 |
| 关键路径覆盖 | 保障业务主流程数据通路 | 主键生成、唯一约束、分区键 | 数据写入阻塞、约束冲突 |
| 幂等性检查 | 重复执行不产生副作用 | changelog 重复运行、增量列重复添加 | 重复索引、重复列、重复数据 |
| 回滚能力验证 | 变更可逆、数据可恢复 | rollbackSQL 生成、回滚后表结构比对 | 回滚失败、数据残留、外键断裂 |
4.2 最小化验证集
冒烟清单不应超过 10~15 个验证点。选择验证集时,遵循 80/20 法则:20% 的验证点覆盖 80% 的迁移故障风险。优先选择以下对象:
- 核心业务表:订单表、用户表、账户表等高频访问表。
- 关键索引:主键索引、唯一索引、联合索引首列。
- 外键约束:引用完整性依赖的外键关系。
- 分区表结构:分区函数、分区方案、文件组。
实践建议:从生产环境 TOP 10 查询涉及的表中提取验证对象,而非随机选择。使用
pg_stat_user_tables(PostgreSQL)或 sys.dm_db_index_usage_stats(SQL Server)辅助筛选。
4.3 关键路径覆盖
关键路径指从变更应用到数据写入再到数据读取的完整链路。冒烟清单必须覆盖以下路径节点:
- DDL 执行路径:Liquibase 解析 changelog → 生成 SQL → 数据库执行 → 元数据更新。
- 数据写入路径:INSERT 语句 → 主键生成 → 索引维护 → 约束检查。
- 数据读取路径:SELECT 查询 → 索引使用 → 分区裁剪 → 结果返回。
关键路径覆盖检查清单:
- ✅ 每个新增列是否可被 INSERT 写入?
- ✅ 每个新增索引是否被查询计划使用?
- ✅ 每个外键是否在 DELETE 时触发级联?
- ✅ 每个分区表是否按分区键正确路由?
4.4 幂等性检查
Liquibase 通过 changeSet 的 id + author + file 三元组保证幂等,但实际迁移中仍可能出现非幂等场景。冒烟清单必须验证:
- 重复执行 changelog:在已应用相同 changeset 的数据库上再次运行
update,不应报错或产生重复对象。 - 增量列重复添加:使用
addColumn时,若列已存在,应被 Liquibase 跳过而非报错。 - 索引重复创建:使用
createIndex时,若索引已存在,应被跳过。 - 数据变更幂等:使用
insert或update时,应使用dbms:unique或preConditions防止重复数据。
常见陷阱:
modifyDataType 在部分数据库(如 MySQL)上非幂等,重复执行可能导致数据截断或类型转换失败。冒烟清单中应单独标记此类 changeset 并验证其幂等性。
4.5 回滚能力验证
回滚能力是冒烟清单中最容易被忽视但最关键的一环。验证回滚能力时,应覆盖以下场景:
- 自动回滚:Liquibase 内置回滚(如
createTable对应dropTable)是否正常工作。 - 自定义回滚:使用
rollback标签定义的 SQL 是否完整且可执行。 - 回滚后状态:回滚后表结构、数据、索引、外键是否恢复到变更前状态。
- 回滚链完整性:连续多个 changeset 回滚时,依赖关系是否正确处理。
4.6 冒烟清单模板示例
以下是一个符合四项原则的冒烟清单模板(以订单系统为例):
| 验证编号 | 验证项 | 对应原则 | 预期结果 |
|---|---|---|---|
| SMK-01 | orders 表结构比对(列数、列名、类型) | 最小化验证集 | 与 changelog 定义一致 |
| SMK-02 | orders_pkey 主键索引存在 | 最小化验证集 | 索引状态 Valid |
| SMK-03 | INSERT 一条订单记录成功 | 关键路径覆盖 | 影响行数 = 1 |
| SMK-04 | SELECT 按主键查询返回正确数据 | 关键路径覆盖 | 返回 1 行 |
| SMK-05 | 重复执行 changelog 无报错 | 幂等性检查 | Liquibase 跳过已执行 changeset |
| SMK-06 | 回滚 orders 表变更后结构恢复 | 回滚能力验证 | 表结构与基线一致 |
| SMK-07 | 回滚后 DATABASECHANGELOG 标记正确 | 回滚能力验证 | 回滚记录写入 |
执行建议:将冒烟清单封装为独立测试套件,集成到 CI/CD 流水线的
pre-deploy 阶段。每次 Liquibase 迁移前自动运行,失败则阻断部署。使用 liquibase --rollback-count 或 liquibase rollbackToDate 命令配合自动化脚本完成回滚验证。