使用进化。为 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 方言: 另一个问题是我们的生产数据库是 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 {
.....
}
}
每个测试都会启动一个假应用程序,运行您的夹具设置进化脚本,运行测试,然后再次将其全部拆除。祝你好运!