如何以编程方式 ignore/skip 使用 ScalaTest 进行测试?

How to programmatically ignore/skip tests with ScalaTest?

我正在 运行 使用 ScalaTest 进行一些测试,这些测试依赖于与测试服务器的连接。我目前创建了自己的规范,类似于:

abstract class ServerDependingSpec extends FlatSpec with Matchers {

  def serverIsAvailable: Boolean = {
    // Check if the server is available
  }
}

使用此方法时是否可以忽略(但不会失败)测试 returns false

目前我以"hackish"的方式进行:

"Something" should "do something" in {
  if(serverIsAvailable) {
    // my test code
  }
}

但我想要类似

的东西
whenServerAvailable "Something" should "do something" in { 
  // test code
}

"Something" should "do something" whenServerAvailable { 
  // test code
}

我想我应该定义我的自定义标签,但我只能参考 inignore 的源代码,我不明白我应该如何插入我的自定义实现。

我该如何完成?

您可以使用标签来实现:

有关如何使用标签的文档:http://www.scalatest.org/user_guide/tagging_your_tests

使用命令行参数添加和删除标记测试:http://www.scalatest.org/user_guide/using_the_runner#specifyingTagsToIncludeAndExclude

示例代码:

import org.scalatest.Tag

object ServerIsAvailable extends Tag("biz.neumann.ServerIsAvailable")

"Something" should "do something" taggedAs(ServerIsAvailable) in { 
  // your test here
}

运行 测试

运行 测试有点棘手。它只适用于 testOnlytestQuick 而不是 test。 在示例中 testOnlytestOnly *

的缩写
 sbt "testOnly -- -l biz.neumann.ServerAvailable"

您可以使用 assumeconditionally cancel a test:

"Something" should "do something" in {
  assume(serverIsAvailable)

  // my test code
}

或者您可以自己测试一些条件,然后使用 cancel:

"Something" should "do something" in {
  if(!serverIsAvailable) {
    cancel
  }

  // my test code
}

这里有一些根据条件跳过测试的技巧:

object WhenServerAvailable extends Tag(if (serverIsAvailable) "" else classOf[Ignore].getName)

"Something" should "do something" taggedAs WhenServerAvailable in { ... }