使用 Flyway 进行集成测试

Integration Testing with Flyway

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

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

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

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

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

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

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

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

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

亚当斯的回答是正确的不要将您的真实数据库设置脚本复制到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

数据库集成测试提示:

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