我正在使用 Flyway 来处理数据库迁移。一切正常:迁移文件的默认位置是:
main/resource/db/migration/V1...
我正在运行集成测试,我的设置使用单独的数据库模式进行集成,我也想使用 Flyway 进行管理。 不过,集成测试位于
test
文件夹中(而不是 main
)。当 Flyway bean 执行 migrate()
时,它找不到迁移文件,因为它们位于 main
文件夹中。如果我将迁移文件放入 test/resource/db/migration/V1...
中,它就可以工作。
我真的不想将这些文件复制到
test
资源文件夹中,所以我不必维护这两个文件。有没有办法强制 Flyway 使用与普通应用程序相同的迁移文件进行集成测试?
我假设你正在使用 Maven?对于单元测试,
test/resources
和 main/resources
都会加载到类路径中。 test/resources
文件通常优先,因为它们位于类路径中的较高位置 - 如果我没记错的话。无论如何,我不建议你这样做。
相反,我建议您为集成测试创建一个完全不同的 Flyway 配置,该配置位于单独的目录(即
test/resources/integration/migration/
)中,并在 main/resources/db/migration
默认目录之后运行。
即便如此,不使用 Flyway 来设置集成数据装置,而是使用一些其他数据库数据加载工具,如 DbUnit(我确信还有其他工具)可能会更容易。
另一个提示: 对于数据库单元测试,您还可以使用 Flyway 测试扩展,请参阅 https://github.com/flyway/flyway-test-extensions。
这些扩展还有一个用于数据加载的 DbUnit 集成插件,因此您可以控制测试环境中的数据库设置。
Adams 的答案是正确的,不要将真实的数据库设置脚本复制到
test/resources/db/migration/
中。
对于集成测试设置,您还可以执行以下选项之一或组合:
flyway-maven-plugin
或 gradle 设置,为脚本位置添加特殊文件夹 test/resources/integration/migration/
。test/resources/db/migration/
并使用特殊版本,例如V999.0.x__或类似版本。在这种情况下,flyway 将始终填充数据库中所有检测到的脚本。 数据库集成测试提示:
之前的回答并没有为我们解决问题。为了在两个项目中进行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
}
}