9

我可以在 scalaTest 规范之间建立依赖关系,这样如果测试失败,所有依赖于它的测试都会被跳过?

4

4 回答 4

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
  // ...
}
于 2011-08-10T20:00:29.647 回答
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
    }
  }
}
于 2012-12-28T14:03:23.093 回答
0

我不知道现成的解决方案。但是您可以相当轻松地编写自己的 Fixtures。

请参阅Suite trait的 javadoc 中的“组合可堆叠夹具特征”

例如,这样的夹具可以将第一个测试执行之后的所有测试执行替换为调用pending

于 2011-08-10T12:06:31.473 回答
0

您可以使用 traitorg.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") {
    // ...
  }
}
于 2017-02-03T14:22:43.457 回答