我有一个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(或其他一些随机字符串)生成?
答案 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"