You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用不完整Liquibase变更集时如何运行Spring Boot集成测试

可行实现方案(均不影响生产数据库变更逻辑)

方案1:测试环境预执行原生基础脚本 + 完整执行Liquibase变更集

该方案最贴合生产实际运行状态,测试结果可信度最高:

  • 把系统切换到Liquibase之前的所有原生数据库初始化/变更脚本,放到src/test/resources目录下
  • 借助Spring Boot原生数据源初始化能力,在Liquibase执行前先运行这些基础脚本,在测试库生成所有被后续Liquibase变更集引用的基础表
  • 测试配置(src/test/resources/application-test.properties)添加以下配置:
# 开启原生脚本初始化
spring.sql.init.mode=always
# 指定基础脚本位置,支持多文件配置
spring.sql.init.schema-locations=classpath:legacy-init.sql
# 确保原生脚本先于Liquibase执行
spring.liquibase.depends-on=spring.sql.init

生产环境不会加载test目录下的配置和脚本,无任何影响。

方案2:给现有Liquibase变更集增加表存在的前置条件

无需修改配置,仅需给涉及存量表修改的变更集增加前置判断,表不存在时自动跳过执行,完全不影响生产逻辑(生产环境表必然存在,变更集仍会正常执行):

<!-- 示例changeset配置,仅当目标表存在时才执行变更 -->
<changeSet id="xxx" author="xxx">
    <preConditions onFail="MARK_RAN">
        <tableExists tableName="你要修改的存量表名"/>
    </preConditions>
    <!-- 原有变更逻辑,比如加列、加索引等 -->
    <addColumn tableName="你要修改的存量表名">
        <column name="new_col" type="varchar(255)"/>
    </addColumn>
</changeSet>

onFail="MARK_RAN"配置表示表不存在时直接标记该变更集已执行,不会报错阻塞流程。

方案3:测试环境直接关闭Liquibase,独立初始化测试库

如果持久层测试只需要用到部分表,不需要完整模拟生产库结构,可以直接在测试环境禁用Liquibase,用其他方式初始化测试需要的表即可:

  • 测试配置添加:spring.liquibase.enabled=false
  • 可选的测试库初始化方式:
    • 用Hibernate自动生成表:配置spring.jpa.hibernate.ddl-auto=create-drop
    • 自定义测试专用初始化脚本:用spring.sql.init.schema-locations指定测试需要的表结构脚本
    • 用@Sql注解在单个测试类/方法执行前初始化指定表

方案4:用Liquibase上下文过滤测试不需要执行的变更集

给不需要在测试环境执行的变更集指定上下文过滤规则,测试环境运行时只执行必要的变更集:

  • 给涉及存量表修改、测试不需要执行的变更集添加context属性:
    <changeSet id="xxx" author="xxx" context="!test">
      <!-- 变更逻辑 -->
    </changeSet>
    
  • 测试配置指定运行上下文:spring.liquibase.contexts=test
    配置后带context="!test"的变更集只会在非test上下文下执行,生产运行不指定context或者指定其他上下文时不会受影响。

内容的提问来源于stack exchange,提问作者BFR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:36:03