web-dev-qa-db-ja.com

ScalaTestを使用してプログラムでテストを無視/スキップする方法は?

テストサーバーへの接続が存在することに依存するScalaTestでいくつかのテストを実行しています。私は現在、次のような独自の仕様を作成しました。

abstract class ServerDependingSpec extends FlatSpec with Matchers {

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

このメソッドがfalseを返す場合、テストを無視することはできますか(失敗することはありません)?

現在、私は「ハック」な方法でそれを行っています。

"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
}

カスタムタグを定義する必要があると思いますが、参照できるのはinまたはignoreのソースコードのみであり、カスタム実装をプラグインする方法がわかりません。

これをどのように達成する必要がありますか?

16
rabejens

これを実現するには、タグを使用できます。

タグの使用方法に関するドキュメント: 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では機能しませんテスト。この例では、testOnlytestOnly *の略です。

 sbt "testOnly -- -l biz.neumann.ServerAvailable"
9
Andreas Neumann

assumeを使用できます:

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

  // my test code
}

cancelを使用することもできます。

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

  // my test code
}
26
Holger Brandl

条件に基づいてテストをスキップするためのトリックを次に示します。

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

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