使用 Flyway 进行集成测试

Posted

技术标签:

【中文标题】使用 Flyway 进行集成测试【英文标题】:Integration Testing with Flyway 【发布时间】:2015-12-28 13:26:15 【问题描述】:

我正在使用Flyway 来处理数据库迁移。一切正常:迁移文件的默认位置是:

main/resource/db/migration/V1...

我正在运行集成测试,并且我的设置使用单独的数据库模式进行集成,我也想使用 flyway 进行管理。 但是,集成测试位于 test 文件夹中(不是 main)。当 Flyway bean 执行 migrate() 时,它找不到迁移文件,因为它们位于 main 文件夹中。如果我将迁移文件放在test/resource/db/migration/V1... 中,它就可以工作。

我真的不想将这些文件复制到test 资源文件夹中,因此我不必同时维护两者。有没有办法强制 Flyway 使用与普通应用相同的迁移文件进行集成测试?

【问题讨论】:

【参考方案1】:

我假设您使用的是 Maven?对于单元测试,test/resourcesmain/resources 都被加载到类路径中。 test/resources 文件通常优先,因为它们在类路径中的位置较高 - 如果我没记错的话。无论如何,我不建议您这样做。

相反,我建议您为集成测试创建一个完全不同的 Flyway 配置,该配置位于单独的目录(即 test/resources/integration/migration/)中,并在 main/resources/db/migration 默认目录之后运行。

即便如此,不使用 Flyway 来设置集成数据夹具可能更容易,而是使用其他一些数据库数据加载工具,例如 DbUnit(我相信还有其他工具)。

【讨论】:

感谢您的回复。我不知道为什么,但是是的,您是对的,集成测试“也”从主/资源中获取文件。我可以发誓它没有工作。不过...感谢 DbUnit,我对此一无所知,我可能会开始在测试期间使用它来设置正确的内容(我只是使用 flyway 来创建表格设计等。) 我更喜欢亚当先提出的方法。这是一个如何在 Spring Boot 的属性文件中执行此操作的示例:flyway.locations=classpath:db/migration/postgres,classpath:db/migration/integration-setup【参考方案2】:

另一个提示: 对于数据库单元测试,您还可以使用 Flyway 测试扩展,请参阅 https://github.com/flyway/flyway-test-extensions。

这些扩展还具有用于数据加载的 DbUnit 集成插件,因此您可以控制测试环境中的数据库设置。

Adams 的回答是正确的,请将您的真实数据库设置脚本复制到 test/resources/db/migration/

对于您的集成测试设置,您还可以执行以下选项之一或组合:

    用于集成测试 maven 配置文件,并在此设置中添加特殊的 flyway-maven-plugin 或 gradle 设置,为脚本位置添加特殊文件夹 test/resources/integration/migration/。 在测试中使用相同的文件夹test/resources/db/migration/ 并使用特殊版本,例如V999.0.x__ 或simular。在这种情况下,flyway 将始终填充数据库中所有检测到的脚本。 如果您有 spring 4.x 项目,您也可以将 spring-test 与 SqlScriptsTestExecutionListner 一起使用。在这里您可以为测试用例使用特定的加载函数。 使用 flyway-test-extensions

数据库集成测试提示:

避免为单个测试重置数据库。测试将更快、更可靠。 每个测试数据设置都应该是独立的,并且不应受到其他测试运行的干扰。 如果您需要从现有交付的实例升级,还可以在您的测试设置中添加填充数据库的迁移测试。 => 测试你的迁移脚本。

【讨论】:

“数据库单元测试”感觉像软钻石

以上是关于使用 Flyway 进行集成测试的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot 和 Flyway:集成测试前清除数据库数据

Spring Boot集成Flyway实现数据库版本控制?

在每次测试之前触发 Flyway 迁移

飞路集成到现有系统中

依赖于数据库视图的集成测试

Flyway 持续数据库集成