如何使用ScalaTest以编程方式忽略/跳过测试?

时间:2015-09-08 14:23:03

标签: scala scalatest

我正在使用ScalaTest运行一些测试,这些测试依赖于连接来测试服务器是否存在。我目前创建了自己的Spec,类似于:

abstract class ServerDependingSpec extends FlatSpec with Matchers {

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

当此方法返回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的源代码,我不明白应该如何插入自定义实现。

我该如何做到这一点?

3 个答案:

答案 0 :(得分:19)

您可以使用assume

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

  // my test code
}

您还可以使用cancel

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

  // my test code
}

答案 1 :(得分:10)

您可以使用标记来实现此目的:

有关如何使用代码的文档: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
}

运行测试

运行测试是一件非常棘手的事情。它仅适用于 testOnly testQuick 而非测试。 在示例 testOnly testOnly *

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

答案 2 :(得分:5)

以下是根据条件跳过测试的一些技巧:

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

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