【问题标题】:Fixtures in Play! 2 for Scala比赛中的赛程! 2 斯卡拉
【发布时间】:2012-09-07 11:14:45
【问题描述】:

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

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

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

我还发现 this project 没有很好的文档记录,而且它似乎比我想要的要复杂一些 - 我什至不清楚夹具数据的实际声明位置。

还有其他选项可以在 Play 中加载固定装置!申请?

【问题讨论】:

    标签: scala testing playframework playframework-2.0 fixtures


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的建议,特别是关于H2兼容模式的问题。当然,我已经在使用FakeApplication 来运行集成测试。但是,我不确定使用进化来加载固定装置。我已经使用进化来让我的实际模式进化。我不想把它和我只在测试中使用的假数据混在一起。也许我可以把夹具进化放在它们不会自动加载的地方,只在测试中加载它们?
    • 您可以在 /evolutions/ 下为您的测试数据库添加一个单独的目录。但这会在两个地方复制您的架构,这会增加维护。
    • 我们使用的方法是将测试数据包含在模式中,这意味着它也存在于我们的生产应用程序中 - 对探索性测试很有用,但可能不是很好的做法,所以我没有将此包含在我的帖子中。更好的方法可能是将测试数据放在单独的 sql 文件中,并使用 Anorm 或 JDBC 从 memDB 方法运行它。我绝对推荐将夹具存储为 SQL,因为您可以设置夹具,使用应用程序的界面或即席 SQL 查询对其进行编辑,然后再次将其转储到 SQL 中 - 比编辑 DSL 方便得多。
    • 你如何指定它在不同时间使用evolutions下的单独/不同目录?
    • 我没有想到答案,但我认为您应该将其作为一个单独的问题发布。
    【解决方案2】:

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

    【讨论】:

    • 好吧,我也认为这应该是真的,但我很谨慎。官方示例使用了不同的方法,他们这样做可能是有原因的。最后,我只是用 Play JSON 库和 Squeryl 编写了一个小包装器,它可以满足我的需求。我必须编写如何从 Json 反序列化我的模型,这有点重复,但由于我的应用程序将具有 JSON 接口,我想它稍后会很有用。
    猜你喜欢
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 2018-04-28
    相关资源
    最近更新 更多