加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – sbt:如果测试失败,如何编写运行testQuick的任务?

发布时间:2020-12-16 18:52:39 所属栏目:安全 来源:网络整理
导读:这个问题来自Martin Grotzke,Twitter. 他想写一个任务(或者我认为的命令)可以: 首次运行测试,如果失败,请跟进testOnly 聚合构建中的多个子项目 有效模拟Bash: $sbt test || sbt testQuick 动机是两次运行失败的测试来解决片状测试. 解决方法 项目/ TestExt
这个问题来自Martin Grotzke,Twitter.

他想写一个任务(或者我认为的命令)可以:

>首次运行测试,如果失败,请跟进testOnly
>聚合构建中的多个子项目

有效模拟Bash:

$sbt test || sbt testQuick

动机是两次运行失败的测试来解决片状测试.

解决方法

项目/ TestExtraShotPlugin.scala

如果您想要快速回答,可以使用以下代码实现运行测试两次行为.

import sbt._
import Keys._

object TestExtraShotPlugin extends AutoPlugin {
  override def requires = plugins.JvmPlugin
  override def trigger = allRequirements
  object autoImport {
    val testNoFail = taskKey[Unit]("test but don't fail")
  }
  import autoImport._

  override def buildSettings = {
    addCommandAlias("testExtraShot",";testNoFail;testQuick")
  }

  override def projectSettings = {
    Test / testNoFail := (Test / test).result.value
  }
}

如果您想了解更多信息,请继续阅读.

错误处理

首先,我们需要停止测试以暂停任务执行.任务的错误处理在文档的Tasks页中描述.但快速的要点就是你打电话给.result.value.您可以通过模式匹配来获取值,但我们并不需要它.

我用它来定义一个名为testNoFail的替代测试任务.

Ad-hoc插件

接下来,我们希望testNoFail在多项目构建中工作.向所有子项目注入设置的一种方法是在project / * .scala中定义触发的AutoPlugin.

override def requires = plugins.JvmPlugin
  override def trigger = allRequirements

命令组成

如果你想告诉sbt做某事然后做其他事情,可能一种自然的方式就是使用命令.这类似于人类连续地将东西输入壳中.

命令可以用分号组成;

override def buildSettings = {
    addCommandAlias("testExtraShot",";testNoFail;testQuick")
  }

这是可能的,因为无论先前的测试状态如何,我们都可以安全地运行testQuick task.

有关其他排序方法,另请参阅Sequencing How to系列.

怎么用这个

跑:

> testExtraShot

在sbt shell里面.这将运行testNoFail,然后运行testQuick.

附录:处理有条件的延续

请注意,我通过运行testQuick来规避马丁的“在测试失败的情况下”的原始规范.可以实现这一点,但它更先进一些.

Monadic延续

我们可以定义一个首先运行正常测试的任务,然后根据返回的结果值,更改下一个任务的延续.在sbt中,可以使用dynamic task实现这种类型的monadic延续.

我们通常会尝试避免这种组合,因为它会阻止任务引擎并行化并发任务,但是当我们需要if-then-do-something时它很方便.

project / TestExtraShotPlugin.scala替代版本

以下实现了一个定义动态任务的ad-hoc插件:

import sbt._
import Keys._

object TestExtraShotPlugin extends AutoPlugin {
  override def requires = plugins.JvmPlugin
  override def trigger = allRequirements
  object autoImport {
    val testExtraShot = taskKey[Unit]("test then testQuick only on failure")
  }
  import autoImport._

  override def projectSettings = {
    testExtraShot := (Def.taskDyn {
      val t = (Test / test).result.value
      if (t.toEither.isLeft) (Test / testQuick).toTask("")
      else
        Def.task {
          val s = streams.value
          s.log.info("ok!")
        }
    }).value
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读