【发布时间】:2015-10-21 08:28:50
【问题描述】:
我正在运行一个多项目 SBT (v0.13) 构建,并希望它在子项目中遇到的第一个错误(编译)时快速失败(停止)。
当前的行为是,当子项目中的某些内容无法编译时,会继续构建(以编译所有其他子项目)。
有没有办法/设置让 SBT 在遇到第一个编译错误的子项目时立即停止并退出?
【问题讨论】:
我正在运行一个多项目 SBT (v0.13) 构建,并希望它在子项目中遇到的第一个错误(编译)时快速失败(停止)。
当前的行为是,当子项目中的某些内容无法编译时,会继续构建(以编译所有其他子项目)。
有没有办法/设置让 SBT 在遇到第一个编译错误的子项目时立即停止并退出?
【问题讨论】:
简而言之,据我所知,不,SBT 不能在编译器或测试错误上“快速失败”。
据我所知,SBT 无法控制这一点。 SBT 在检查您的单元测试时只会调用适当的测试框架。然后测试框架可以决定以什么顺序运行测试、同时运行它们、如何报告问题等。当然,每个测试框架都有自己的特性、配置和约定。 Scala 使用最广泛的两个测试框架是 ScalaTest 和 Specs2。
幸运的是,您可以在 Specs2 或 ScalaTest 中获得您所要求的行为。我在下面提供了简单的单元测试示例,这些示例很早就失败了。
您可以通过混合 CancelAfterFailure 特征在 ScalaTest 中为单个测试套件获得快速失败的行为。例如,此测试将执行第一个测试,第二个失败,第三个显示为取消。
class SomeSuite extends FunSuite with CancelAfterFailure with Assertions {
test("first") {
println("first")
}
test("second") {
assert(false)
}
test("third") {
println("third")
}
}
与 ScalaTest 类似,您可以在每个规范的基础上控制 Specs2 中的行为。要获得类似快速失败的行为,您需要在规范中添加两个参数:sequential 和 stopOnFail。有关可以设置的参数的完整列表,请参阅 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")
}
}
}
【讨论】: