2. Liquibase 核心概念:changelog、changeset、databaseChangeLog表、rollback机制、context与label
在集成测试中,Liquibase 的迁移脚本是数据库状态变更的“唯一真相来源”。要编写可靠的冒烟验证用例,必须透彻理解其六大核心概念。本章逐一拆解这些概念,并说明它们在测试中的关键作用。
2.1 changelog:变更清单的主文件
changelog 是 Liquibase 的入口文件,采用 XML、YAML、JSON 或 SQL 格式编写,按顺序记录所有数据库变更。集成测试中,changelog 是冒烟验证的扫描起点。
| 属性 | 说明 | 测试关注点 |
|---|---|---|
| logicalFilePath | 逻辑路径,用于唯一标识 changelog | 避免因物理路径变化导致重复执行 |
| include / includeAll | 引用子 changelog 或目录 | 验证引用顺序与依赖关系 |
| context / label | 运行环境过滤条件 | 冒烟测试需确认正确上下文被激活 |
2.2 changeset:原子变更单元
每个 changeset 代表一次不可分割的数据库变更,由 id、author 和 filePath 三元组唯一标识。changeset 的 runAlways、runOnChange 属性直接影响测试行为。
<changeSet id="1" author="dev">
<createTable tableName="user">
<column name="id" type="int">
<constraints primaryKey="true"/>
</column>
<column name="name" type="varchar(50)"/>
</createTable>
</changeSet>
<changeSet id="2" author="dev" runOnChange="true">
<addColumn tableName="user">
<column name="email" type="varchar(100)"/>
</addColumn>
</changeSet>
| 属性 | 默认值 | 冒烟验证影响 |
|---|---|---|
| runAlways | false | 设为 true 时每次迁移都会执行,需验证幂等性 |
| runOnChange | false | checksum 变化时重新执行,测试需校验 checksum 计算 |
| failOnError | true | 冒烟测试应捕获失败场景,验证回滚行为 |
2.3 databaseChangeLog 表:执行记录追踪
Liquibase 在目标数据库中维护 DATABASECHANGELOG 和 DATABASECHANGELOGLOCK 两张表,记录每次 changeset 的执行状态。这是冒烟验证判断“哪些变更已执行”的核心依据。
-- 查询已执行 changeset 的典型 SQL
SELECT id, author, filename, dateexecuted, md5sum, orderexecuted
FROM DATABASECHANGELOG
ORDER BY orderexecuted;
冒烟测试中,通过对比 DATABASECHANGELOG 的记录与 changelog 定义,可以快速发现遗漏执行、重复执行或 checksum 不匹配的问题。
2.4 rollback 机制:可逆的变更策略
Liquibase 支持三种回滚方式:自动回滚(DDL 类操作)、手动指定回滚 SQL、以及 rollback 标签。集成测试中,rollback 是验证数据完整性的关键环节。
<changeSet id="3" author="test">
<createTable tableName="temp_data">
<column name="id" type="int"/>
</createTable>
<rollback>
DROP TABLE temp_data;
</rollback>
</changeSet>
| 回滚方式 | 适用场景 | 测试验证点 |
|---|---|---|
| 自动回滚 | CREATE TABLE、ADD COLUMN 等 DDL | 验证回滚后表结构完全恢复 |
| 手动 rollback 标签 | 数据迁移、复杂 DML | 验证回滚 SQL 正确还原数据 |
| rollbackCount / rollbackToDate | 按数量或时间点回滚 | 验证部分回滚的边界行为 |
2.5 context 与 label:环境隔离过滤器
context 和 label 是 Liquibase 控制变更执行范围的两种机制,在集成测试的多环境管理中至关重要。
| 机制 | 定义位置 | 匹配逻辑 | 测试场景 |
|---|---|---|---|
| context | changeset 或 changelog 上 | 逗号分隔的 OR 逻辑;!context 表示排除 |
验证 test 环境只执行 test 上下文的变更 |
| label | changeset 或 changelog 上 | AND 逻辑,必须全部匹配 | 验证同时满足多个标签的变更才被执行 |
<changeSet id="4" author="qa" context="test" labels="smoke,integration">
<insert tableName="config">
<column name="key" value="test_mode"/>
<column name="value" value="true"/>
</insert>
</changeSet>
冒烟测试中,必须显式验证:当指定 --contexts=test --labels=smoke 时,只有同时满足条件的 changeset 被执行,其余变更被正确跳过。
2.6 核心概念关系图
下图展示了六大核心概念在 Liquibase 迁移流程中的协作关系,帮助测试人员建立整体认知。
2.7 冒烟验证清单
基于上述核心概念,集成测试的冒烟验证应覆盖以下检查点:
- changelog 完整性: 所有 include 文件可解析,无循环引用,无语法错误。
- changeset 唯一性: id+author+filepath 三元组无重复,checksum 稳定。
- DATABASECHANGELOG 一致性: 记录数量与 changelog 定义一致,无缺失或多余条目。
- rollback 覆盖率: 至少 80% 的 changeset 提供回滚逻辑,关键变更必须覆盖。
- context/label 隔离性: 指定上下文后,非匹配 changeset 确实被跳过。
- 幂等性: 重复执行迁移,DATABASECHANGELOG 无新增记录,数据库状态不变。