设置以使SBT在出错时快速(停止)失败

Tim*_*imT 29 scala sbt

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

当前的行为是,当某个子项目无法编译时,构建继续(编译所有其他子项目).

有遇到编译错误的第一个子项目,是否存在使SBT停止和退出的方法/设置?

Mar*_*gel 7

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

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

幸运的是,您可以在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")
  }
}
Run Code Online (Sandbox Code Playgroud)

Specs2

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

class SomeSpec extends Specification {

  sequential
  stopOnFail

  "specs2" should {
    "first" in {
      println("first")
      ok
    }

    "second" in {
      "foo" must equalTo ("bar")
    }

    "third" in {
      println("third")
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • OP在编译时询问是否快速失败,而不是在测试时. (3认同)