通过使用最烂的Flatspec和TimeLimits特性,我可以为一行代码设置超时,如下所示:

import org.scalatest.time.SpanSugar._
import org.scalatest.concurrent.TimeLimits
import org.scalatest.FlatSpec

class MyTestClass extends Flatspec with TimeLimits {
  "My thread" must "complete on time" in {
    failAfter(100 millis) { infiniteLoop() }
    // I have also tried cancelAfter
  }
}

由于超时,此操作将失败。但是,当我在Intellij中运行此测试时,它将永远运行。

此外,我不想为每个方法重写超时,而是为整个类配置一次。 PatienceConfig声称可以这样做,但是似乎什么也没做。该测试仍将永远运行。
import org.scalatest.FlatSpec
import org.scalatest.time.{Millis, Span}
import org.scalatest.concurrent.{Eventually, IntegrationPatience}

class MyTestClass extends Flatspec with Eventually with IntegrationPatience {
 implicit val defaultPatience = PatienceConfig(timeout=Span(100, Millis))

 "My thread" must "complete on time" in {
   inifiniteLoop()
 }
}

最佳答案

我自己寻找解决方案。来了一个this交叉答案,对我有用。
我正在使用flatspec,添加了特征TimeLimitedTests

with TimeLimitedTests

然后在代码中,我为每个测试val timeLimit: Span = Span(2000, Millis)编写了限制
由特征定义(我们将其覆盖)。

最后,直到我按照Rumoku在引用的答案中的建议覆盖了中断器之后,它才起作用。
override val defaultTestInterruptor: Interruptor = new Interruptor {
override def apply(testThread: Thread): Unit = {
  println("Kindly die")
  testThread.stop() // deprecated. unsafe. do not use
}}

我希望这有帮助

关于最恐怖的Flatspec : Timeout for entire class,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47379756/

10-12 22:19