我正在尝试在Play中进行一些集成测试! 2用于Scala应用程序。为此,我需要加载一些灯具,以便在每次测试之前让DB处于已知状态。
目前,我只是调用一个执行一堆Squeryl语句来加载数据的方法。但是声明性地声明灯具,无论是使用Scala DSL还是使用JSON或YAML这样的语言,都更容易理解。
在Java应用程序的this example中,我看到夹具是从YAML文件加载的,但equivalent Scala应用程序采用manula加载,就像我现在正在做的那样。
我还发现this project没有很好的记录,而且看起来比我想要的要复杂得多 - 我甚至不清楚夹具数据的实际声明位置。
还有其他选项可以在Play中加载灯具!应用
答案 0 :(得分:15)
使用进化。在SQL中编写夹具的设置和拆卸脚本,或使用mysqldump(或数据库的等效脚本)将现有测试DB导出为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具有许多dbs的兼容模式,这可以减少你遇到的问题:
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 {
.....
}
}
每个测试都会启动一个虚假的应用程序,运行你的夹具设置evolutions脚本,运行测试,然后再将它全部拆掉。祝你好运!
答案 1 :(得分:0)
为什么不在Scala中使用java示例?那些确切的代码也应该在Scala中没有修改的情况下工作......