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 关键路径覆盖

关键路径指从变更应用到数据写入再到数据读取的完整链路。冒烟清单必须覆盖以下路径节点:

  1. DDL 执行路径:Liquibase 解析 changelog → 生成 SQL → 数据库执行 → 元数据更新。
  2. 数据写入路径:INSERT 语句 → 主键生成 → 索引维护 → 约束检查。
  3. 数据读取路径:SELECT 查询 → 索引使用 → 分区裁剪 → 结果返回。
关键路径覆盖检查清单:
  • ✅ 每个新增列是否可被 INSERT 写入?
  • ✅ 每个新增索引是否被查询计划使用?
  • ✅ 每个外键是否在 DELETE 时触发级联?
  • ✅ 每个分区表是否按分区键正确路由?
关键路径覆盖与冒烟验证点映射 关键路径覆盖与冒烟验证点映射 DDL 执行路径 changelog → SQL → 执行 数据写入路径 INSERT → 主键 → 索引 数据读取路径 SELECT → 索引 → 分区 DDL 验证点 • 表结构比对(列名、类型) • 索引存在性检查 • 外键引用完整性 写入验证点 • INSERT 单行成功 • 主键自增/序列正常 • 唯一约束不冲突 读取验证点 • SELECT 返回正确行数 • 索引使用(EXPLAIN) • 分区裁剪生效 冒烟清单至少包含每个路径 1~2 个验证点,确保端到端通路

4.4 幂等性检查

Liquibase 通过 changeSet 的 id + author + file 三元组保证幂等,但实际迁移中仍可能出现非幂等场景。冒烟清单必须验证:

  • 重复执行 changelog:在已应用相同 changeset 的数据库上再次运行 update,不应报错或产生重复对象。
  • 增量列重复添加:使用 addColumn 时,若列已存在,应被 Liquibase 跳过而非报错。
  • 索引重复创建:使用 createIndex 时,若索引已存在,应被跳过。
  • 数据变更幂等:使用 insert 或 update 时,应使用 dbms:unique 或 preConditions 防止重复数据。
常见陷阱:modifyDataType 在部分数据库(如 MySQL)上非幂等,重复执行可能导致数据截断或类型转换失败。冒烟清单中应单独标记此类 changeset 并验证其幂等性。

4.5 回滚能力验证

回滚能力是冒烟清单中最容易被忽视但最关键的一环。验证回滚能力时,应覆盖以下场景:

  1. 自动回滚:Liquibase 内置回滚(如 createTable 对应 dropTable)是否正常工作。
  2. 自定义回滚:使用 rollback 标签定义的 SQL 是否完整且可执行。
  3. 回滚后状态:回滚后表结构、数据、索引、外键是否恢复到变更前状态。
  4. 回滚链完整性:连续多个 changeset 回滚时,依赖关系是否正确处理。
回滚能力验证流程 回滚能力验证流程 1. 记录基线状态 2. 执行迁移变更 3. 执行回滚命令 4. 比对状态 回滚验证检查项 ✅ 表结构是否与基线一致(列数、列名、类型) ✅ 索引、主键、外键是否恢复 ✅ 数据是否回滚(如有数据变更) ✅ DATABASECHANGELOG 表记录是否正确标记为回滚

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 命令配合自动化脚本完成回滚验证。