7

Cucumber テストではGivenWhenと表現される機能Thenは、通常、3 つの個別のメソッドとして実装されます。これらのメソッドは多くの場合、値を共有する必要があり、可変変数がそれを行う方法のようです。

次の簡単な例を見てください。

特徴:

Given the digit 2
When it is multiplied by 3
Then the result is 6

そしてキュウリのメソッド:

class CucumberRunner extends ScalaDsl with EN with ShouldMatchers {

  var digitUnderTest: Int = -1

  Given("""^the digit (\d)$""") { digit: Int =>
    digitUnderTest = digit
  }

  When("""^it is multiplied by 3$""") {
    digitUnderTest = digitUnderTest * 3
  }

  Then("""^the result is (\d)$""") { result: Int =>
    digitUnderTest should equal (result)
  }
}

おそらく、Scala テストまたは Scala の Cucumber-jvm に組み込まれている方法でdigitUnderTest、可変変数として表現できないようにする方法はありますか?

4

2 に答える 2

2

javascalacucumber-jvmの例を見ると、変数に一時的に格納せずにデータをステップからステップへと渡す方法が提供されているとは思えません。

scala でa を再割り当てすることはできないためval、ミュータブルを取り除くために私が考えることができる最も近いことは、var一時的なテスト データを保持するグローバル マップを用意することです。

class CucumberRunner extends ScalaDsl with EN with ShouldMatchers {

  Given("""^the digit (\d)$""") { digit: Int =>
    GlobalTestData.save("my_unique_key_1", digit)
  }

  When("""^it is multiplied by 3$""") {
    GlobalTestData.load("my_unique_key_1") match {
      case Some(obj) => {
        val result = obj.asInstanceOf[Int] * 3
        GlobalTestData.save("my_unique_key_2", result)
      }
      case None => // throw exception or fail test
    }
  }

  Then("""^the result is (\d)$""") { result: Int =>
    GlobalTestData.load("my_unique_key_2") match {
      case Some(obj) => obj.asInstanceOf[Int] should equal (result)
      case None => // throw exception or fail test
    }
  }
}

そして、GlobalTestData

object GlobalTestData {
  val map = scala.collection.mutable.Map.empty[String, Any];

  def save(key: String, value: Any) {
    map.put(key, value)
  }

  def load(key: String): Option[Any] = map.get(key)
}

この場合、キーを慎重に生成して、ステップ全体で同じになるようにする必要があります。もちろん、いくつかvalの s を使用して、これらのキーの値を保持できます。

また、この特定の機能では、次のステップを組み合わせGivenてみませんか。When

When the digit 2 is multiplied by 3
Then the result is 6

このようにして、 のスロットを 1 つ節約できますGlobalTestData

于 2013-01-18T21:51:47.227 に答える
0

CucumberJVM の ScalaDSL ではステップは関数ですf:List[Any] => Anyが、現在の実装では各ステップの実行結果が破棄されます。つまり、前のステップの結果を次のステップで使用する方法がありません。

現在、1 つのステップの結果を共有する唯一の方法は、ステップ定義クラスまたは zihaoyu が提案したようなよりグローバルなコンテキストのいずれかで、共有状態を使用することです (ところで、共有可変マップ メソッドも大規模プロジェクトで使用します)。

于 2013-10-09T14:27:11.077 に答える