scala - 比赛中的赛程! 2 斯卡拉

标签 scala testing playframework playframework-2.0 fixtures

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

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

this example在 Java 应用程序中,我看到固定装置是从 YAML 文件加载的,但是 equivalent Scala应用程序诉诸手册加载,就像我现在所做的那样。

我还找到了this project这没有很好的记录,而且似乎比我想要的要复杂一些——我什至不清楚 fixture 数据实际声明的位置。

Are there any other options to load fixtures in a Play! application?

最佳答案

使用进化。在 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() 函数的默认实现会创建一个随机命名的新数据库,并且不会在测试运行之间清理旧数据库。如果您正确编写了 evolution 拆卸脚本,则没有必要这样做,因为数据库将在每次测试之间清空并重新填充。所以我们覆盖了这个行为以使用相同的数据库并且内存问题消失了。

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 {
    .....
  }
}

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

关于scala - 比赛中的赛程! 2 斯卡拉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12421976/

相关文章:

scala - 使用 Scala "fromURL"的结果会引发异常

scala - Scala 中带有构造函数参数的抽象类

ruby-on-rails - Ruby on Rails 2.3.8 : How do I set up my unit tests such that when there is an error, 我可以打印当前作用域中的所有变量吗?

Laravel API 测试单元与功能

java - 使用 Ebean NullPointerException 玩 2.4

java - 如何从 Play Framework 中的另一个模板调用一个模板?

Scala "not found: type"错误

scala - 以编程方式中断 REPL ILoop

go - -coverprofile 从覆盖百分比中排除未测试的文件

playframework - 在java中填充@select下拉列表