gpt4 book ai didi

scala - ScalaTest 可以在没有同步调用的情况下检测超时吗(比如在无限循环中?)

转载 作者:行者123 更新时间:2023-12-01 11:29:39 24 4
gpt4 key购买 nike

在下面的代码中,名为 sleep 的测试优雅地失败了,而测试 freeze 导致测试永远不会结束。

import org.scalatest.FunSuite
import org.scalatest.concurrent.TimeLimitedTests
import org.scalatest.time.SpanSugar._
import scala.language.postfixOps

class MainTest extends FunSuite with TimeLimitedTests {
def timeLimit = 1 second

test("sleep") {
Thread.sleep(10000)
}

test("unintentional freeze") {
var i = 100
var j = 0
while (i>0) {
i += 1 // a bug: should be j += 1
i -= 1
}
}

}

我理解这一点是因为 TimeLimitedTests 使用 ThreadInterruptor 中止超时测试的方式。有没有其他方法可以让 ScalaTest 检测到并使此类代码失败?如果没有,是否有一些常见的做法如何避免或检测测试代码中的此类错误?

当我在 IDE 中手动运行测试时,我可以手动中止它们,那些具有无限循环的将被标记为未启动,但我担心在提交的代码中发生这种情况时,Jenkins 构建过程被卡住为结果,需要在构建服务器上手动中止。

最佳答案

首先你的例子是人为的。在现实生活中,即使是无限循环也会调用线程休眠至少毫秒:Thread.sleep(1)。在这种情况下,interrupt 将正常工作。

但假设没有 sleep 。因此,您需要覆盖 defaultInterrruptor 以更“可靠”的方式终止线程。

import org.scalatest.FunSuite
import org.scalatest.concurrent.{Interruptor, TimeLimitedTests, ThreadInterruptor, Timeouts}
import org.scalatest.time.SpanSugar._

import scala.language.postfixOps

class MainTest extends FunSuite with TimeLimitedTests {

override val defaultTestInterruptor: Interruptor = new Interruptor {
override def apply(testThread: Thread): Unit = {
println("Kindly die")
testThread.stop() // deprecated. unsafe. do not use
}
}

def timeLimit = 1 second


test("sleep") {
Thread.sleep(10000)
}

test("freeze") {
while (true) {}
}


}

关于scala - ScalaTest 可以在没有同步调用的情况下检测超时吗(比如在无限循环中?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33742779/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com