使用 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/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 集成插件,因此您可以控制测试环境中的数据库设置。
亚当斯的回答是正确的不要将您的真实数据库设置脚本复制到test/resources/db/migration/
。
对于您的集成测试设置,您还可以执行以下选项之一或组合:
- 用于集成测试 Maven 配置文件并在此设置中添加一个特殊的
flyway-maven-plugin
或 gradle 设置,为脚本位置添加特殊文件夹 test/resources/integration/migration/
。
- 在测试中使用相同的文件夹
test/resources/db/migration/
并使用特殊版本,例如 V999.0.x__ 或类似的。在这种情况下,flyway 将始终填充数据库中所有检测到的脚本。
- 如果您有 spring 4.x 项目,您还可以使用 spring-test 和 SqlScriptsTestExecutionListner。在这里你可以使用特定的加载函数来测试用例。
- 使用 flyway-test-extensions
数据库集成测试提示:
- 避免为单个测试重置数据库。测试会更快更稳健。
- 每个测试数据设置都应该是独立的,不应被其他测试干扰运行。
- 如果您需要从现有的交付实例升级,请在您的测试设置中为已填充的数据库添加迁移测试。 => 测试您的迁移脚本。
我正在使用 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 集成插件,因此您可以控制测试环境中的数据库设置。
亚当斯的回答是正确的不要将您的真实数据库设置脚本复制到test/resources/db/migration/
。
对于您的集成测试设置,您还可以执行以下选项之一或组合:
- 用于集成测试 Maven 配置文件并在此设置中添加一个特殊的
flyway-maven-plugin
或 gradle 设置,为脚本位置添加特殊文件夹test/resources/integration/migration/
。 - 在测试中使用相同的文件夹
test/resources/db/migration/
并使用特殊版本,例如 V999.0.x__ 或类似的。在这种情况下,flyway 将始终填充数据库中所有检测到的脚本。 - 如果您有 spring 4.x 项目,您还可以使用 spring-test 和 SqlScriptsTestExecutionListner。在这里你可以使用特定的加载函数来测试用例。
- 使用 flyway-test-extensions
数据库集成测试提示:
- 避免为单个测试重置数据库。测试会更快更稳健。
- 每个测试数据设置都应该是独立的,不应被其他测试干扰运行。
- 如果您需要从现有的交付实例升级,请在您的测试设置中为已填充的数据库添加迁移测试。 => 测试您的迁移脚本。