每次测试运行都使用不同的内存数据库

时间:2018-01-18 09:04:35

标签: playframework slick scalatest

我有一个Play应用程序,其中一些测试涉及数据库。为此,我将Slick配置为在测试运行期间使用单独的内存中H2实例,如:

slick.dbs.default.db.url="jdbc:h2:mem:play-test"

现在,ScalaTest并行执行套件,这通常不会成为问题,因为为每个套件重新创建了Play应用程序。但是,它们都触及同一个数据库,可能导致意外状态并导致测试失败。

在本地运行时运行良好,但在CI服务器上失败,日志表明测试执行顺序不同,如果不是并行,本身不应该是一个问题,但是数据库状态在开始时一项测试不符合预期。

现在,我将使用Sequential顺序运行这些套件。

但是在我看来,仍然可以并行运行它们,但是使用不同的数据库,例如:

slick.dbs.default.db.url="jdbc:h2:mem:play-test-${UUID.generate()}"

上面的语法是完全组成的,但是在Play配置文件中是否支持UUID(或其他一些随机字符串)生成?

1 个答案:

答案 0 :(得分:0)

感谢marcospereira's comment我最终创建了一个特性,用随机后缀自定义我的内存H2名称:

trait FreshDatabase extends GuiceOneAppPerSuite {
  this: TestSuite =>

  val BaseName = "play-test"
  val UrlConfigKey = "slick.dbs.default.db.url"

  override def fakeApplication(): Application = {
    val defaultUrl = super.fakeApplication().configuration.get[String](UrlConfigKey)

    val random = Random.nextInt(Integer.MAX_VALUE)
    val freshUrl = defaultUrl.replace(BaseName, s"$BaseName-$random")

    GuiceApplicationBuilder().configure(UrlConfigKey -> freshUrl).build()
  }
}

然后在相关的测试套件中使用它,例如:

class AnswerControllerSpec extends PlaySpec
  with GuiceOneAppPerSuite with FreshDatabase {
  // ...
}

我的application.conf(和以前一样):

slick.dbs.default.profile="slick.jdbc.H2Profile$"
slick.dbs.default.db.driver="org.h2.Driver"
slick.dbs.default.db.url="jdbc:h2:mem:play-test"