使用进化。为 SQL 中的固定装置编写设置和拆卸脚本,或使用 mysqldump(或您的数据库的等效项)将现有的测试数据库导出为 sql。
http://www.playframework.org/documentation/1.2/evolutions
我发现最轻松的测试方法是将所有内容设置在内存数据库中,这意味着测试运行速度快,并使用 JUnit 从 Java 驱动测试。我使用 H2DB,但您需要注意一些问题。我很难学到这些,所以这应该可以节省你一些时间。
Play 有一个很好的系统,可以使用 running(FakeAplication()) { .. } 设置和拆除您的应用程序以进行集成测试,您可以将其配置为使用内存数据库与 FakeApplication(additionalConfiguration = inMemoryDatabase()) 见:
http://www.playframework.org/documentation/2.0/ScalaTest
OutOfMemory 错误:但是,在我的机器上多次运行相当大的测试夹具会导致 OutOfMemory 错误。这似乎是因为 inMemoryDatabase() 函数的默认实现创建了一个新的随机命名的数据库,并且不会在测试运行之间清理旧的数据库。如果您正确编写了进化拆解脚本,则没有必要这样做,因为数据库将在每次测试之间清空并重新填充。所以我们覆盖了这种行为以使用相同的数据库并且内存问题消失了。
DB Dialect:另一个问题是我们的生产数据库是 MySQL,它与 H2DB 有许多不兼容的地方。H2DB 具有许多数据库的兼容模式,这应该会减少您遇到的问题的数量:
http://www.h2database.com/html/features.html#compatibility
将所有这些放在一起使得在每次测试之前添加它有点笨拙,所以我将它提取到一个函数中:
def memDB[T](code: =>T) =
running( FakeApplication( additionalConfiguration = Map(
"db.default.driver" -> "org.h2.Driver",
"db.default.url" -> "jdbc:h2:mem:test;MODE=MySQL"
) ) )(code)
然后您可以像这样使用它(规格示例):
"My app" should {
"integrate nicely" in memDB {
.....
}
}
每个测试都会启动一个假应用程序,运行您的夹具设置进化脚本,运行测试,然后再次将其全部拆除。祝你好运!