使用 scala play specs2 针对测试 mysql 数据库的演变

Posted

技术标签:

【中文标题】使用 scala play specs2 针对测试 mysql 数据库的演变【英文标题】:evolutions against test mysql database with scala play specs2 【发布时间】:2014-12-24 20:54:42 【问题描述】:

我使用 specs2 与 Scala Play (2.3) 进行集成测试,并且我使用 mysql 数据库进行测试,而不是 H2 数据库。我的测试用例使用 WithApplication 和 FakeApplication 以及 db.default.url 的配置覆盖来指定测试(mysql)数据库。

问题是没有运行任何进化。因为没有创建表,所以测试用例全部爆炸。

如果我正常运行应用程序,而不是在测试中,然后应用 Evolutions,然后转储这个数据库并加载到测试数据库中,所有测试都可以通过(我在测试运行之间清理所有表以确保每个测试的数据库都是干净的)。

为什么进化不自动运行?我该怎么做才能让他们跑起来?注意:我不想使用 H2 和 InMemoryDatabase。我想使用 mysql 进行测试,就像我在生产中一样。我在网上找到了各种用于手动定位和运行进化的解决方案,但是这些解决方案都没有维护“play_evolutions”表,我也没有设法让它们在 Play 2.3 中正常工作。

【问题讨论】:

嗨,你能提供一个如何使用 mysql 数据库运行假应用程序的代码示例吗? 【参考方案1】:

默认情况下,Play Evolutions 只会手动运行。这显然是测试时的一个问题,因为无法提示您运行它们。在您的FakeApplication 中,您可能需要在additionalConfiguration 下设置以下内容:

"evolutionplugin" -> "enabled",
"applyEvolutions.default" -> true, 
"applyDownEvolutions" -> true

所以你的FakeApplication 可能看起来像这样:

val app = FakeApplication(additionalConfiguration = Map(
    "db.default.driver" -> "com.mysql.jdbc.Driver",
    "db.default.url" -> "jdbc:mysql://localhost/test"
    "db.default.user" -> "...",
    "db.default.password" -> "...",
    "evolutionplugin" -> "enabled",
    "applyEvolutions" -> "false"
))

或者,您也可以删除自定义 FakeApplication 并回退到 application.conf 中的内容。

请注意,这只会在它说play_evolutions 不存在或不一致时运行演变。因此,如果您想在每次测试后清理它,您需要自己删除这些表。

【讨论】:

【参考方案2】:

将以下设置添加到您的配置文件中

applyEvolutions.default=true

其中“默认”是您的数据库的名称。

【讨论】:

以上是关于使用 scala play specs2 针对测试 mysql 数据库的演变的主要内容,如果未能解决你的问题,请参考以下文章

如何将 IntelliJ 与 Play Framework 和 Scala 一起使用

Play 2.4.0 功能测试中的 Specs2/Guice 问题

使用 Slick、specs2 和 Postgresql 进行 2.4 测试

在scala play 2.4中以函数作为参数调用doAnswer

排除 specs2 作为 sbt 中 play 框架的传递依赖

Specs2 测试无法在 IntelliJ 中原生运行