使用不完整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注解在单个测试类/方法执行前初始化指定表
- 用Hibernate自动生成表:配置
方案4:用Liquibase上下文过滤测试不需要执行的变更集
给不需要在测试环境执行的变更集指定上下文过滤规则,测试环境运行时只执行必要的变更集:
- 给涉及存量表修改、测试不需要执行的变更集添加context属性:
<changeSet id="xxx" author="xxx" context="!test"> <!-- 变更逻辑 --> </changeSet> - 测试配置指定运行上下文:
spring.liquibase.contexts=test
配置后带context="!test"的变更集只会在非test上下文下执行,生产运行不指定context或者指定其他上下文时不会受影响。
内容的提问来源于stack exchange,提问作者BFR
相关产品推荐
相关产品推荐

