是否可以使用Cucumber-jvm Scala避免可变状态?

Noe*_*l M 7 scala cucumber-jvm

随着黄瓜测试,功能表现为Given,When并且Then通常为三个独立的方法来实现.这些方法通常需要共享值,这似乎是可变变量的方法.

采用以下简单示例:

一项功能:

Given the digit 2
When it is multiplied by 3
Then the result is 6
Run Code Online (Sandbox Code Playgroud)

和黄瓜方法:

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

是否有任何方法,可能是内置于Scala测试或者Scala的Cucumber-jvm,这使我不能表达digitUnderTest为可变变量?

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

然后是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)
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您需要仔细生成密钥,以便它们在各个步骤中都相同。当然,你可以使用一些vals 来保存这些键的值。

同样在这个特定的功能中,为什么不组合GivenWhen步骤:

When the digit 2 is multiplied by 3
Then the result is 6
Run Code Online (Sandbox Code Playgroud)

这样您就可以在 中节省一个插槽GlobalTestData