集成测试中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 变更集执行流程示意图

下图展示了从编写变更日志到验证数据库变更日志表的完整流程:

Liquibase 变更集执行与验证流程 编写 XML 变更日志文件 执行 update 命令 创建业务表 employee 记录变更日志 DATABASECHANGELOG 验证查询 SELECT 检查 验证要点 检查 MD5SUM 是否匹配 确认 ORDEREXECUTED 顺序

4.6 冒烟验证检查清单

完成上述步骤后,建议使用以下清单快速确认迁移基础功能正常:

  • ✅ 变更日志文件:XML 格式正确,无语法错误。
  • ✅ update 命令:执行成功,返回 Applied 1 changeset(s)。
  • ✅ 业务表:employee 表已创建,包含 id、name、email、created_at 列。
  • ✅ 初始数据:表中存在一条姓名为“张三”的记录。
  • ✅ DATABASECHANGELOG:存在对应记录,MD5SUM 与当前变更集内容一致。
  • ✅ DATABASECHANGELOGLOCK:表已创建,且锁状态为未锁定。
集成测试中的冒烟验证价值
在集成测试流水线中,每次部署前执行此冒烟验证,可以快速发现 Liquibase 配置错误、数据库连接问题或变更集冲突,避免将损坏的数据库状态带入后续测试阶段。