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

标签 scala cucumber-jvm

在 Cucumber 测试中,一个特征表示为 Given , WhenThen通常被实现为三个独立的方法。这些方法通常需要共享值,而这似乎是可变变量的方法。

举个简单的例子:

一项功能:

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

和 cucumber 方法:
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 测试或 Cucumber-jvm 中的 Scala,让我不表达 digitUnderTest作为可变变量?

最佳答案

看着 cucumber-jvm java 中的示例和 scala ,我怀疑它提供了一种方法来逐步传递数据,而无需将其临时存储在变量中。

由于您无法重新分配 val在scala中,我能想到的最接近你摆脱可变的东西var是有一个保存临时测试数据的全局 map 。

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

在这种情况下,您需要小心地生成 key ,以使它们在各个步骤中都相同。当然,你可以用一些val s 来保存这些键的值。

同样在这个特殊功能中,为什么不结合 GivenWhen脚步:
When the digit 2 is multiplied by 3
Then the result is 6

这样你就可以在 GlobalTestData 中保存一个插槽.

关于scala - 是否可以使用 Cucumber-jvm Scala 避免可变状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14405345/

相关文章:

java - 如何hook Cucumber-Java生命周期

java - Scala Futures 和 java 8 CompletableFuture

scala - 为 Scala 中的代码块提供隐式函数

scala - 导入没有 SparkSession 实例的隐式转换

java - 在 cucumber-jvm 测试中回滚事务

java - Cucumber-JVM 步骤定义

scala - 为什么 scalac 不相信某个方法不符合所需的类型签名?

scala - Akka-如何检查收件箱中的邮件有多长时间?

java - 注释未在带有 cucumber-jvm 的 SharedDriver 中触发

Cucumber/gradle 示例没有生成报告?