有没有类似于TestNg dependsOnMethods注释的scalaTest机制

时间:2011-08-10 10:53:40

标签: scala scalatest

我是否可以在scalaTest规范之间存在依赖关系,以便在测试失败时,会跳过所有依赖于它的测试?

4 个答案:

答案 0 :(得分:3)

我没有添加TestNG的这个功能,因为我当时没有任何引人注目的用例来证明它的合理性。我已经收集了一些用例,并且正在为下一版本的ScalaTest添加一个功能来解决它​​。但它不是依赖测试,只是一种基于未满足的前提条件“取消”测试的方法。

与此同时,你可以做的只是使用Scala if语句只在​​满足条件时注册测试,或者如果你想看到输出则将它们注册为忽略。如果您使用Spec,它看起来像:

if (databaseIsAvailable) {
  it("should do something that requires the database") {
     // ...
  }
  it ("should do something else that requires the database") {
  }
 }

只有在测试施工时才能满足条件,这才有效。例如,如果数据库应该由beforeAll方法启动,那么您可能需要在每个测试中进行检查。在这种情况下,你可以说它正在等待。类似的东西:

it("should do something that requires the database") {
  if (!databaseIsAvailable) pending
  // ...
}
it("should do something else that requires the database") {
  if (!databaseIsAvailable) pending
  // ...
}

答案 1 :(得分:1)

如果任何测试失败,这是一个Scala特征,它使测试套件中的所有测试都失败 (感谢您的建议,Jens Schauder(他发布了这个问题的另一个答案)。)

优点:易于理解的测试依赖性。
缺点:不太可定制。

我将它用于我的自动浏览器测试。如果某些内容失败,那么通常没有必要继续与GUI进行交互,因为它处于“混乱”状态。

许可:公共领域(Creative Common的CC0),或(根据您的选择)MIT许可。

import org.scalatest.{Suite, SuiteMixin}
import scala.util.control.NonFatal


/**
 * If one test fails, then this traits cancels all remaining tests.
 */
trait CancelAllOnFirstFailure extends SuiteMixin {
  self: Suite =>

  private var anyFailure = false

  abstract override def withFixture(test: NoArgTest) {
    if (anyFailure) {
      cancel
    }
    else try {
      super.withFixture(test)
    }
    catch {
      case ex: TestPendingException =>
        throw ex
      case NonFatal(t: Throwable) =>
        anyFailure = true
        throw t
    }
  }
}

答案 2 :(得分:0)

我不知道现成的解决方案。但是你可以很容易地编写自己的灯具。

参见Suite trait

的javadoc中的“编写可堆叠夹具特征”

这样的工具可以例如在第一个测试执行后用pending

调用替换所有测试执行

答案 3 :(得分:0)

您可以使用特质org.scalatest.CancelAfterFailure取消首次失败后的剩余测试:

import org.scalatest._

class MySpec extends FunSuite with CancelAfterFailure {
  test("successfull test") {
    succeed
  }

  test("failed test") {
    assert(1 == 0)
  }

  test("this test and all others will be cancelled") {
    // ...
  }
}