7

我正在尝试在 Play 中进行一些集成测试!2 用于 Scala 应用程序。为此,我需要在每次测试之前加载一些固定装置以使数据库处于已知状态。

目前,我只是在调用一个执行一堆 Squeryl 语句来加载数据的方法。但是以声明方式声明固定装置,无论是使用 Scala DSL 还是使用 JSON 或 YAML 等语言,都更具可读性和易于维护性。

这个Java 应用程序示例中,我看到固定装置是从 YAML 文件加载的,但等效的 Scala应用程序采用手动加载,就像我现在正在做的那样。

我还发现这个项目的文档记录不是很好,而且它似乎比我想要的要复杂一些——我什至不清楚夹具数据的实际声明位置。

是否有任何其他选项可以在 Play 中加载固定装置!应用?

4

2 回答 2

15

使用进化。为 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 {
    .....
  }
}

每个测试都会启动一个假应用程序,运行您的夹具设置进化脚本,运行测试,然后再次将其全部拆除。祝你好运!

于 2012-09-16T09:33:31.627 回答
0

为什么不在 Scala 中使用 java 示例?确切的代码也应该在 Scala 中无需修改就可以工作......

于 2012-09-14T10:26:34.253 回答