与 Flyway 集成测试

问题描述 投票:0回答:3

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

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

我正在运行集成测试,我的设置使用单独的数据库模式进行集成,我也想使用 Flyway 进行管理。 不过,集成测试位于

test
文件夹中(而不是
main
)。当 Flyway bean 执行
migrate()
时,它找不到迁移文件,因为它们位于
main
文件夹中。如果我将迁移文件放入
test/resource/db/migration/V1...
中,它就可以工作。

我真的不想将这些文件复制到

test
资源文件夹中,所以我不必维护这两个文件。有没有办法强制 Flyway 使用与普通应用程序相同的迁移文件进行集成测试?

spring flyway integration-testing
3个回答
13
投票

我假设你正在使用 Maven?对于单元测试,

test/resources
main/resources
都会加载到类路径中。
test/resources
文件通常优先,因为它们位于类路径中的较高位置 - 如果我没记错的话。无论如何,我不建议你这样做。

相反,我建议您为集成测试创建一个完全不同的 Flyway 配置,该配置位于单独的目录(即

test/resources/integration/migration/
)中,并在
main/resources/db/migration
默认目录之后运行。

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


10
投票

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

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

Adams 的答案是正确的,不要将真实的数据库设置脚本复制到

test/resources/db/migration/
中。

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

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

数据库集成测试提示:

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

0
投票

之前的回答并没有为我们解决问题。为了在两个项目中进行flyway搜索:project-root/src/main/resources/db/migration/postgresql和project-root/src/test/resources/db/migration/postgresql。

执行以下步骤:

1 - 添加您的测试数据库脚本,例如V999__DUMMY_DATA_FOR_INTEGRATION_TESTS.sql 位于项目根/src/test/resources/db/migration/postgresql

2 - 将以下配置放入 application-test.yml 中,并将其放置在 project-root/src/test/resources 目录中。

spring:
  flyway:
    schemas: public
    locations: ['classpath:db/migration/postgresql', 'classpath:test/resources/db/migration/postgresql']

3 - 使用测试配置文件 bij 执行测试,在测试类上放置 @ActiveProfiles("test") 注释,这将告诉 spring 在类路径上使用 application-test.yml 文件:

@ActiveProfiles("test")
class IntegrationTestsWithFlyway {

    @Test
    void testSavingOneRecordToDb() {
        // Some test code
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.