使用 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