You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SBT如何在test阶段自动重跑失败测试(无需修改测试代码)

在SBT中自动重跑失败测试(无需修改测试代码)

方案一:自定义SBT任务实现

你可以通过编写自定义任务,让SBT在跑完所有测试后自动识别失败案例并重新执行:

  • 在项目根目录的build.sbt中添加以下代码:
lazy val retryFailedTests = taskKey[Unit]("自动重跑失败的测试用例")

retryFailedTests := {
  // 先执行完整测试
  (test in Test).value
  // 读取测试报告文件
  val failedReport = target.value / "test-reports" / "TESTS-TestSuites.xml"
  if (failedReport.exists()) {
    import scala.xml.XML
    val reportXml = XML.loadFile(failedReport)
    // 提取有失败/错误的测试类名
    val failedTestClasses = (reportXml \\ "testsuite")
      .filter(suite => (suite \ "@failures").text.toInt > 0 || (suite \ "@errors").text.toInt > 0)
      .map(_ \ "@name").mkString(" ")
    if (failedTestClasses.nonEmpty) {
      // 重跑所有失败的测试类
      (testOnly in Test).toTask(s" $failedTestClasses").value
    }
  }
}

// 让test阶段自动触发重试逻辑
test in Test := (test in Test).dependsOn(retryFailedTests).value
  • 执行sbt test时,SBT会先跑完全部测试,自动找出失败的测试类并重新运行一次。

方案二:使用第三方插件

借助sbt-retry插件可以更简洁地实现该功能:

  • 在project/plugins.sbt中添加插件依赖:
addSbtPlugin("com.eed3si9n" % "sbt-retry" % "0.1.0")
  • 在build.sbt里配置重试规则:
// 设置失败测试的最大重试次数
retryMaxRetries := 2
// 将重试逻辑绑定到test任务
test in Test := (retry in Test).value

这样每次执行test阶段,插件会自动重跑失败的测试,直到达到设定的重试次数。

以上两种方案都不需要修改任何测试代码,完全通过SBT配置实现自动重跑,和Maven Surefire的重跑功能效果一致。

内容的提问来源于stack exchange,提问作者andreoss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 23:07:05