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
相关产品推荐
相关产品推荐

