如何最好地使用嵌入式数据库处理Flyway进行集成测试?

时间:2015-09-25 16:01:04

标签: mysql spring-boot flyway embedded-database

我有一个现有的应用程序,我最近开始使用Flyway,并且在大多数情况下一直运行良好。

我一直在为我的开发环境运行本地MySQL数据库,这与QA和Prod中使用的相匹配。

但是,我希望能够直接针对嵌入式数据库(如H2)运行至少一些集成测试。我天真地希望,因为MySQL似乎在special comments中包含(大多数?)特殊声明(例如/*! SET @foo = 123 */;)。

然而,似乎当Flyway解析我的第一次迁移时,它最终会跳过我的所有CREATE TABLE语句,因此它最终只会应用一些参考数据的INSERT,因为表永远不会被创建,所以它会失败。

我已经尝试提高日志记录级别,但是我没有看到为什么Flyway刚刚跳过我迁移的前2228行的任何迹象......

有没有人对如何最好地处理这种情况有任何建议?我曾尝试过对/*! ... */之类的内容进行大量ENGINE=InnoDB次评论,但似乎Flyway仍在跳过这些陈述。

我是否最好只使用the FAQ中提到的使用特定于数据库的flyway.locations重新组织和复制大部分(如果不是全部)迁移?或者,我是否可以通过某种方式进行最小的更改,至少是我从用于基线迁移的现有数据库的初始mysqldump获得的更改,以维护两个数据库的单个迁移?

或者......是否有推荐的方法来对MySQL运行我的集成测试?我遇到了MySQL Connector/MXJ,但似乎已停止......

1 个答案:

答案 0 :(得分:2)

这是一个老问题“现在没有SQL标准”。

Flyway可能正在跳过你的陈述,因为它们包含H2不理解的语法。请查看H2文档,了解H2 CREATE TABLE语法的哪一部分与MySQL CREATE TABLE语法不同。如果幸运的话,甚至可能存在两个数据库都理解的语法变体。

如果不是,则必须将SQL语句分成两个不同的位置。请记住,您可以同时告诉Flyway多个位置。因此,您可以拥有一个通用脚本的核心,并且只移动db特定文件中不同的部分。然后,您可以使用common + H2作为位置开始本地测试,使用common + MySQL开始生产脚本。

如果您正在使用可以为您创建表的技术(如Hibernate),您可能希望在本地执行测试时不使用Flyway,以避免必须处理两组迁移文件。只需让您的测试生成最新版本的数据库。这可能也有好处,因为它可能比以后运行大量迁移脚本要快得多(比如在几年内)。

你必须对真正的MySQL数据库运行一些集成测试,就像你看到H2可能表现得完全不同。这样,您可以考虑使用可用于数据库的备份解决方案,使用某些数据来侧载数据库。这可能比使用Flyway从头开始初始化数据库要快。 (再次完成这一行,您不希望在测试之前运行多年的迁移脚本。)您可能只想测试最新的脚本集,因为旧的脚本确实在新的时候工作(并且Flyway将确保它们没有改变)。