如何配置ScalaTest以在测试失败时中止套件?

如何配置ScalaTest以在测试失败时中止套件?,scala,scalatest,Scala,Scalatest,我正在使用ScalaTest 2.1.4和SBT 0.13.5。我有一些长时间运行的测试套件,如果单个测试失败(多JVM Akka测试),它们可能需要很长时间才能完成。如果其中任何一个失败,我希望整个套件都被中止,否则套件可能需要很长时间才能完成,尤其是在我们的CI服务器上 如果套件中的任何测试失败,如何配置ScalaTest以中止套件?如果您只需要取消与失败测试相同的规范/套件/测试中的测试,可以使用ScalaTest中的CancelAfterFailure混合。如果要全局取消,请参见以下示例

我正在使用ScalaTest 2.1.4和SBT 0.13.5。我有一些长时间运行的测试套件,如果单个测试失败(多JVM Akka测试),它们可能需要很长时间才能完成。如果其中任何一个失败,我希望整个套件都被中止,否则套件可能需要很长时间才能完成,尤其是在我们的CI服务器上


如果套件中的任何测试失败,如何配置ScalaTest以中止套件?

如果您只需要取消与失败测试相同的规范/套件/测试中的测试,可以使用ScalaTest中的CancelAfterFailure混合。如果要全局取消,请参见以下示例:

import org.scalatest._


object CancelGloballyAfterFailure {
  @volatile var cancelRemaining = false
}

trait CancelGloballyAfterFailure extends SuiteMixin { this: Suite =>
  import CancelGloballyAfterFailure._

  abstract override def withFixture(test: NoArgTest): Outcome = {
    if (cancelRemaining)
      Canceled("Canceled by CancelGloballyAfterFailure because a test failed previously")
    else
      super.withFixture(test) match {
        case failed: Failed =>
          cancelRemaining = true
          failed
        case outcome => outcome
      }
  }

  final def newInstance: Suite with OneInstancePerTest = throw new UnsupportedOperationException
}

class Suite1 extends FlatSpec with CancelGloballyAfterFailure {

  "Suite1" should "fail in first test" in {
    println("Suite1 First Test!")
    assert(false)
  }

  it should "skip second test" in {
    println("Suite1 Second Test!")
  }

}

class Suite2 extends FlatSpec with CancelGloballyAfterFailure {

  "Suite2" should "skip first test" in {
    println("Suite2 First Test!")
  }

  it should "skip second test" in {
    println("Suite2 Second Test!")
  }

}

谢谢你,尤金;以下是我的改进:

trait TestBase extends FunSuite {
  import TestBase._

  override def withFixture(test: NoArgTest): Outcome = {
    if (aborted) Canceled(s"Canceled because $explanation")
    else super.withFixture(test)
  }

  def abort(text: String = "one of the tests failed"): Unit = {
    aborted = true
    explanation = text
  }
}

object TestBase {
  @volatile var aborted = false
  @volatile var explanation = "nothing happened"
}

我想知道它是否可以不用
var
s来完成。

这太棒了。现在,如果我将我的初始化内容(我既设置了数据库,又测试了设置功能是否有效)放在第一个套件中,我能保证它总是首先运行吗?i、 运行顺序是否与源文件中的顺序相同?