【问题标题】:Setting to get SBT to fail fast (stop) on an error设置让 SBT 在错误时快速失败(停止)
【发布时间】:2015-10-21 08:28:50
【问题描述】:

我正在运行一个多项目 SBT (v0.13) 构建,并希望它在子项目中遇到的第一个错误(编译)时快速失败(停止)

当前的行为是,当子项目中的某些内容无法编译时,会继续构建(以编译所有其他子项目)。

有没有办法/设置让 SBT 在遇到第一个编译错误的子项目时立即停止并退出?

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    简而言之,据我所知,不,SBT 不能在编译器或测试错误上“快速失败”。

    据我所知,SBT 无法控制这一点。 SBT 在检查您的单元测试时只会调用适当的测试框架。然后测试框架可以决定以什么顺序运行测试、同时运行它们、如何报告问题等。当然,每个测试框架都有自己的特性、配置和约定。 Scala 使用最广泛的两个测试框架是 ScalaTest 和 Specs2。

    幸运的是,您可以在 Specs2 或 ScalaTest 中获得您所要求的行为。我在下面提供了简单的单元测试示例,这些示例很早就失败了。

    ScalaTest

    您可以通过混合 CancelAfterFailure 特征在 ScalaTest 中为单个测试套件获得快速失败的行为。例如,此测试将执行第一个测试,第二个失败,第三个显示为取消。

    class SomeSuite extends FunSuite with CancelAfterFailure with Assertions {
    
      test("first") {
        println("first")
      }
    
      test("second") {
        assert(false)
      }
    
      test("third") {
        println("third")
      }
    }
    

    规格2

    与 ScalaTest 类似,您可以在每个规范的基础上控制 Specs2 中的行为。要获得类似快速失败的行为,您需要在规范中添加两个参数:sequentialstopOnFail。有关可以设置的参数的完整列表,请参阅 the docs。 (如果你想要一个明显的线性排序,你确实需要两者,因为默认情况下 Specs2 会同时执行你的测试!)

    class SomeSpec extends Specification {
    
      sequential
      stopOnFail
    
      "specs2" should {
        "first" in {
          println("first")
          ok
        }
    
        "second" in {
          "foo" must equalTo ("bar")
        }
    
        "third" in {
          println("third")
        }
      }
    }
    

    【讨论】:

    • OP 询问的是在编译时快速失败,而不是在测试时。
    猜你喜欢
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    相关资源
    最近更新 更多