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

rab*_*ens 14 scala scalatest

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

abstract class ServerDependingSpec extends FlatSpec with Matchers {

  def serverIsAvailable: Boolean = {
    // Check if the server is available
  }
}
Run Code Online (Sandbox Code Playgroud)

当此方法返回时,是否可以忽略(但不会失败)测试false

目前我是以"hackish"方式做到的:

"Something" should "do something" in {
  if(serverIsAvailable) {
    // my test code
  }
}
Run Code Online (Sandbox Code Playgroud)

但我想要类似的东西

whenServerAvailable "Something" should "do something" in { 
  // test code
}
Run Code Online (Sandbox Code Playgroud)

要么

"Something" should "do something" whenServerAvailable { 
  // test code
}
Run Code Online (Sandbox Code Playgroud)

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

我该怎么做到这一点?

Hol*_*ndl 23

你可以使用assume:

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

  // my test code
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用cancel:

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

  // my test code
}
Run Code Online (Sandbox Code Playgroud)

  • 也为此提供了假设:`assume(server.isAvailable)` (2认同)

And*_*ann 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
}
Run Code Online (Sandbox Code Playgroud)

运行测试

运行测试有点棘手.它仅适用于testOnlytestQuick测试.在示例testOnlytestOnly*缩写

 sbt "testOnly -- -l biz.neumann.ServerAvailable"
Run Code Online (Sandbox Code Playgroud)


小智 7

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

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

"Something" should "do something" taggedAs WhenServerAvailable in { ... }
Run Code Online (Sandbox Code Playgroud)