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

时间:2014-12-24 20:54:42

标签: database scala playframework specs2

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

问题在于没有进行任何改进。测试用例全部爆炸,因为没有创建表格。

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

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

2 个答案:

答案 0 :(得分:1)

默认播放演变只会手动运行。这显然是测试时的一个问题,因为无法提示您运行它们。在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不存在或不一致时才会进行演变。因此,如果您想在每次测试后进行清理,那么您需要自己放弃这些表。

答案 1 :(得分:0)

将以下设置添加到配置文件

applyEvolutions.default=true

其中“default”是数据库的名称。