集成测试中Liquibase迁移数据完整性冒烟验证 - 第4节
4.1 理解 Liquibase 变更集与变更日志
Liquibase 的核心工作单元是 变更集(Changeset),它封装了一次原子性的数据库变更(如建表、加列、改索引)。多个变更集按顺序组织在 变更日志(Changelog) 文件中,形成可版本化、可追溯的数据库迁移脚本。
本章将引导你完成第一个 XML 格式的变更日志,执行 update 命令,并验证 Liquibase 自动维护的数据库变更日志表。
核心概念速览
- Changelog:根文件,定义数据库变更的版本顺序。
- Changeset:一个具体的变更单元,由
id、author、file三要素唯一标识。 - DATABASECHANGELOG:Liquibase 自动创建的表,记录所有已执行的变更集。
- DATABASECHANGELOGLOCK:用于防止并发执行冲突的锁表。
4.2 编写第一个 XML 格式的 Changeset
在项目根目录下创建 db/changelog/db.changelog-master.xml 文件。以下示例创建一张 employee 表,并插入一条初始数据。
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.23.xsd">
<changeSet id="001" author="tester">
<createTable tableName="employee">
<column name="id" type="int" autoIncrement="true">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="name" type="varchar(100)">
<constraints nullable="false"/>
</column>
<column name="email" type="varchar(200)">
<constraints unique="true"/>
</column>
<column name="created_at" type="timestamp" defaultValueComputed="now()"/>
</createTable>
<insert tableName="employee">
<column name="name" value="张三"/>
<column name="email" value="zhangsan@example.com"/>
</insert>
</changeSet>
</databaseChangeLog>
XML 变更集编写要点
- id + author:必须唯一,推荐使用数字序号 + 测试人员标识。
- changeset 内可包含多个操作:如建表、加索引、插入数据,Liquibase 会将其视为一个事务。
- 预置条件(preConditions):可在 changeset 前添加,避免重复执行时报错。
4.3 执行 update 命令
打开终端,在项目根目录下执行以下 Liquibase 命令。假设已配置好数据库连接(URL、用户名、密码)。
liquibase --changeLogFile=db/changelog/db.changelog-master.xml update
命令执行成功后,控制台会输出类似以下信息:
Liquibase: Update has been successful. Applied 1 changeset(s).
Liquibase 会依次执行变更日志中所有 尚未执行 的变更集。执行顺序由 changeSet 在文件中的出现顺序决定。
常用 Liquibase 命令对比
| 命令 | 用途 | 适用场景 |
|---|---|---|
update |
应用所有未执行的变更集 | 日常开发、测试环境迁移 |
rollback |
回滚指定数量的变更集 | 版本回退、错误修复 |
status |
显示待执行的变更集列表 | 迁移前检查、CI 验证 |
tag |
为当前数据库状态打标签 | 版本快照、回滚锚点 |
4.4 验证数据库变更日志表
Liquibase 执行 update 后,会自动在目标数据库中创建两张管理表:DATABASECHANGELOG 和 DATABASECHANGELOGLOCK。
DATABASECHANGELOG 表结构
| 字段名 | 类型 | 说明 |
|---|---|---|
ID |
VARCHAR(255) | 变更集 id |
AUTHOR |
VARCHAR(255) | 变更集作者 |
FILENAME |
VARCHAR(255) | 变更日志文件路径 |
DATEEXECUTED |
TIMESTAMP | 执行时间 |
ORDEREXECUTED |
INT | 执行顺序号 |
MD5SUM |
VARCHAR(35) | 变更集内容校验和 |
TAG |
VARCHAR(255) | 标签(可选) |
COMMENTS |
VARCHAR(255) | 变更说明 |
执行以下 SQL 查询,验证刚才的变更集是否已被记录:
SELECT id, author, filename, dateexecuted, orderexecuted, md5sum
FROM DATABASECHANGELOG
WHERE filename LIKE '%db.changelog-master.xml';
预期结果应返回一行记录,其中 ID 为 001,AUTHOR 为 tester,MD5SUM 为变更集内容的哈希值。
常见验证失败原因
- 表不存在:检查是否连接到了正确的数据库实例。
- 记录为空:确认
update命令是否成功执行,或变更日志文件路径是否正确。 - MD5SUM 不匹配:变更集内容被修改后未重新执行,Liquibase 会拒绝执行并报错。
4.5 变更集执行流程示意图
下图展示了从编写变更日志到验证数据库变更日志表的完整流程:
4.6 冒烟验证检查清单
完成上述步骤后,建议使用以下清单快速确认迁移基础功能正常:
- ✅ 变更日志文件:XML 格式正确,无语法错误。
- ✅ update 命令:执行成功,返回 Applied 1 changeset(s)。
- ✅ 业务表:
employee表已创建,包含 id、name、email、created_at 列。 - ✅ 初始数据:表中存在一条姓名为“张三”的记录。
- ✅ DATABASECHANGELOG:存在对应记录,MD5SUM 与当前变更集内容一致。
- ✅ DATABASECHANGELOGLOCK:表已创建,且锁状态为未锁定。
集成测试中的冒烟验证价值
在集成测试流水线中,每次部署前执行此冒烟验证,可以快速发现 Liquibase 配置错误、数据库连接问题或变更集冲突,避免将损坏的数据库状态带入后续测试阶段。
在集成测试流水线中,每次部署前执行此冒烟验证,可以快速发现 Liquibase 配置错误、数据库连接问题或变更集冲突,避免将损坏的数据库状态带入后续测试阶段。