7

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

举个简单的例子:

一个特征:

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中的示例,我怀疑它提供了一种逐步传递数据的方法,而无需将其临时存储在变量中。

由于您无法val在 Scala 中重新分配 a,因此我能想到的最接近您摆脱可变变量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)
}

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

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

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

这样您就可以在GlobalTestData.

于 2013-01-18T21:51:47.227 回答
0

尽管在 CucumberJVM 的 ScalaDSL 中,一个步骤是一个函数f:List[Any] => Any,但当前的实现丢弃了每一步执行的结果,这意味着您无法在下一步中使用上一步的结果。

目前,共享一步结果的唯一方法是通过一些共享状态,无论是在步骤定义类还是像子浩宇建议的更全局的上下文(顺便说一句,我们在大型项目中也使用共享可变映射方法)

于 2013-10-09T14:27:11.077 回答