scala – sbt:如果测试失败,如何编写运行testQuick的任务?
这个问题来自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") } 这是可能的,因为无论先前的测试状态如何,我们都可以安全地运行 有关其他排序方法,另请参阅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 } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- scala – 在模板中处理条件内容的首选Lift方法是什么?
- $inject.instantiate VS $inject.get VS $injector.invoke
- mssoap与gsoap访问WebService的使用
- 包括@ fortawesome / fontawesome到angular-cli项目
- 服务器重启后,’docker ps’会永远挂起
- 在vim中将一条线从一个屏幕移动到另一个屏幕
- algorithm – 需要在Scala中实现二进制堆结构的建议
- XFire WebService开发快速起步
- mysql – 如何访问我的docker maria db?
- 在bash中读取文件时忽略第一行/列标题