我正在运行一个多项目SBT(v0.13)构建,并希望它在子项目中遇到的第一个错误(编译)快速失败(停止).
当前的行为是,当某个子项目无法编译时,构建继续(编译所有其他子项目).
有遇到编译错误的第一个子项目,是否存在使SBT停止和退出的方法/设置?
简而言之,据我所知,不,SBT不能在编译器或测试错误上"快速失败".
据我所知,SBT无法控制这一点.SBT在检查您的单元测试时会调用相应的测试框架.然后,测试框架可以决定运行测试的顺序,同时运行它们,如何报告问题等.当然,每个测试框架都有自己的特性,配置和约定.ScalaTest和Specs2是Scala最常用的两个测试框架.
幸运的是,您可以在Specs2或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)
与ScalaTest类似,您可以在每个规范的基础上控制Specs2中的行为.要获得类似故障的快速行为,您需要在规范中添加两个参数:sequential
和stopOnFail
.有关可以设置的参数的完整列表,请参阅文档.(如果你想要一个明显的线性排序,你需要两个,因为默认情况下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)