使用Flyway进行集成测试

14

我正在使用Flyway来处理数据库迁移。一切都很顺利: 迁移文件的默认位置为:

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

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

我真的不想把这些文件复制到test资源文件夹中,这样我就不必维护两个副本。是否有一种方法可以强制Flyway在集成测试和正常应用程序中使用相同的迁移文件?

2个回答

13

我假设你正在使用 Maven?在单元测试中,test/resourcesmain/resources 两者都会被加载到类路径中。通常情况下,test/resources文件具有优先级,因为它们位于类路径的较高位置 - 如果我没有记错的话。然而,我不建议你这样做。

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

即使如此,使用 Flyway 设置集成数据夹具可能也比较麻烦,你可以使用其他数据库数据加载工具,如DbUnit (我确定还有其他工具可供选择)。


谢谢您的回复。我不知道为什么,但是您说得对,集成测试确实可以从主资源中获取文件。我本来以为它不起作用。感谢DbUnit,我之前不知道它,现在我可能会开始使用它来在测试期间设置正确的内容(我只是使用flyway来创建表设计等)。 - Johny19
我更喜欢Adam放在第一位的方法。以下是在Spring Boot属性文件中如何实现的示例:flyway.locations=classpath:db/migration/postgres,classpath:db/migration/integration-setup。 - Jacques Koorts

10
另一个提示: 对于数据库单元测试,您还可以使用Flyway Test Extension,请参见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
数据库集成测试提示:
  • 避免为单个测试重置数据库。测试将变得更快,更强大。
  • 每个测试数据设置都应该是独立的,并且不受其他测试运行的干扰。
  • 如果您需要从现有交付实例升级,请在测试设置中添加填充数据库的迁移测试。 =>测试您的迁移脚本。

"数据库单元测试" 就像柔软的钻石一样。 - Gaskoin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接