我在Bitbucket上设置了CI管道并运行
sbt "project api" "testOnly core.entities.UserSpec"
它在我的笔记本电脑上运行顺畅,耗时约2秒。但是当我尝试在CI服务器上运行它时,花了大约4分钟来运行一半的测试。
UserSpec是用Spec2编写的,它没有任何数据库或繁重的计算。以下是大多数测试的样子:
def addCredential_nonConfirmedEmail_notAllowed = {
val emailAddress: EmailAddress = Fixture.emailAddress("unconfirmed")
val user: User = Fixture.user().copy(emailAddresses = Set(emailAddress))
val result = user.addCredential(emailAddress, Fixture.password())
val exception = result.failed.get.asInstanceOf[DomainException]
exception.code mustEqual DomainExceptionType.Validation
exception.message mustEqual "Email address must be confirmed before it can be used as part of credential"
}
CI使用" bigtruedata / sbt:0.13.15-2.11.11"在docker上运行图片。 为了解决这个问题,我在墙上撞了两天。首先,我责备CI并尝试:
但仍然没有运气。
你能帮我解决这个问题吗?这就是我的sbt设置的样子
val projectSettings = Seq(
version := "1.0-SNAPSHOT",
scalaVersion := "2.11.11",
resolvers ++= Dependencies.resolvers,
fork in Test := false,
parallelExecution in Test := false)
答案 0 :(得分:1)
最后,我找到了罪魁祸首!这是我,而不是CI,码头工人或SBT。
我在测试中使用了Fixture.password()方法,该方法使用val salt = BCrypt.gensalt(10, SecureRandom.getInstanceStrong)
中的SecureRandom.getInstanceStrong。如果根据this reference没有足够的随机性,它将阻塞线程。删除SecureRandom.getInstanceStrong
后,它就像往常一样正常工作。
我应该在使用之前了解Random和SecureRandom之间的差异,并因此浪费了3天。学习它很难:-D