使用 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 构建测试脚本以使用普通脚本按顺序执行的主要内容,如果未能解决你的问题,请参考以下文章