使用 liquibase 构建测试脚本以使用普通脚本按顺序执行

Posted

技术标签:

【中文标题】使用 liquibase 构建测试脚本以使用普通脚本按顺序执行【英文标题】:Structure test scripts with liquibase to execute in order with normal scripts 【发布时间】:2019-10-12 09:22:58 【问题描述】:

我们正在使用 liquibase 在 Spring Boot 应用程序中迁移数据库。在资源中,我们有主变更日志文件,其中包括其他变更日志(每个版本 1 个)。

我们通常通过 liquibase 的上下文属性来区分环境,但新的我们需要区分仅用于集成测试的数据,并且不希望将其放在普通版本化脚本旁边。是否可以将这些集成测试脚本放在测试的项目范围内,并与普通脚本按顺序执行?

例如:

主要更新日志:

<include file="version-1.xml"/>
<include file="version-2.xml"/>

和版本 1 示例:

<changeSet id="1ver_1" author="xxx">
     <!-- creation of table foo_table -->
</changeSet>

<changeSet id="1ver_2" author="xxx">
     <!-- adding column to table foo_table -->
</changeSet>

版本 2 示例:

<changeSet id="2ver_1" author="xxx">
     <!-- renaming table foo_table to bar_table -->
</changeSet>

我需要,如果集成测试脚本将在脚本 1ver_1 之后编写并且包含插入,那么如果 next 将执行 1ver_2 和 2ver_1 就可以了。

所以当集成测试的 db 启动时,脚本将按正确的顺序执行:

    1ver_1 1ver_1 的测试数据 1ver_2 2ver_1

这样做的最佳做法是什么?

【问题讨论】:

【参考方案1】:

我认为您应该改变保存变更集的方式。看看Liquibase Best Practices。 所以你的主变更日志应该是这样的:

<include file="version-1.1.xml"/>
<include file="version-1.2.xml"/>
<include file="version-2.1xml"/>

如果您这样做,您可以拥有专门的主变更日志文件用于集成测试。您的集成测试的 changelog-master.xml 将如下所示:

<include file="version-1.1.xml"/>
<include file="test_data_version-1.1.xml"/>
<include file="version-1.2.xml"/>
<include file="version-2.1xml"/>

之后,您只需在集成测试中覆盖属性:

liquibase.change-log=classpath:integration-liquibase-changeLog.xml

您还应该将integration-liquibase-changeLog.xml 和所有“test_data_xx.xml”放入集成测试模块资源或测试资源中(取决于项目结构)。它的主要思想不应该提供给生产工件。

【讨论】:

我认为我们正在使用这个概念。来自文档:The most common way to organize your changelogs is by major release. 其中Version X 是我们的版本,每个版本都包含多个更改集。但是,当有人为版本 1 编写变更集 1,以及当前数据库状态的数据,而其他人在版本 1 的变更集 2 中更改数据库结构时,如何处理这种情况?它需要在版本 1 的同一文件中的变更集之间运行测试数据。 看看更新的答案。如果您遵循最佳实践,您可以找到示例主变更集的外观。如果是这样,您可以创建集成测试 chanelog。在您的集成测试中,您必须检查来自 version-1.2.xml 的更改是否不会损坏甚至截断上一个 (version-1.1.xml) 版本中的数据。您不需要为 changeSet 之间的集成测试插入数据,因为这不是真实案例。您不会在生产中遇到这种情况。因为 liquibase 应用了来自 version-1.1xml 的所有变更集,但不是其中的一部分。 但是数据库结构可能会在变更集之间发生变化。例如,您可以想象有 2 个开发人员正在开发 1.5 版。首先创建一些结构,并希望为 hist 集成测试添加一些数据。其次将更改 1.5 更改日志,并添加一些更改第一个开发人员结构的更改集。在这种情况下,需要在这两个开发人员的更改之间执行带有测试数据的脚本,以将第二个开发人员的更改应用于第一个开发人员的插入数据。 两者都必须在 1.4 之后的 1.5 之前添加数据,但不能在 1.5 中间添加数据。因为您的集成测试应该检查开发人员的更改如何影响在 1.4 上添加的数据。 (1.5迁移前系统中存在的数据)。 您应该在集成测试中模拟系统的真实案例和状态。系统在迁移 1.5 期间没有添加数据。因此,两个开发人员都应该将测试数据添加到 1.5 之前和 1.4 之后应用的单独文件中(您可以在我的答案中找到示例)。

以上是关于使用 liquibase 构建测试脚本以使用普通脚本按顺序执行的主要内容,如果未能解决你的问题,请参考以下文章

当我使用 liquibase 更改模型数据时,JHipster 集成测试失败

OneToMany 关系不能在春天用 liquibase 保存

使用 H2 数据库和 Liquibase 配置 Spring Boot

必须在 Liquibase 上指定 changeLogFile 错误

Liquibase 脚本失败

在生产环境中执行 liquibase 更新