scala - 使用 scalacheck 测试有效的状态转换

标签 scala state-machine scalacheck property-based-testing

假设我有这个类:

case class Receipt(id: Long, state: String) {
  def transitionTo(newState: String) = {
    if (!canTransitionTo(newState)) {
       throw new IllegalStateExcetion(s"cant transition from $state to $newState")
    }
    this.copy(state = newState)
  }
}

我想测试 canTransitionTo 中的逻辑(为了简单起见,这里不包括)使用 scalachecks 命令,但我在如何开始方面遇到了一些麻烦。有任何想法吗?

最佳答案

some tutorials如何使用此框架测试状态机,但它们测试另一个属性。通常他们会创建一个 Command对于每个有效的转换和触发 scalacheck对它们进行任意组合。此类属性的目标是验证状态机对于任意数量的有效转换是否正常运行。

这种方法不会测试canTransitionTo因为它假设所有转换都是有效的。测试任何一对状态之间的转换将需要根据 scalacheck 重新实现有效和无效转换的概念。 .这可能比原来的更复杂 canTransitionTo功能。

如果转换集之一比其他转换集小得多 scalacheck可以帮助生成另一个。例如,如果只有少数有效转换和十分之一无效转换,那么生成器可以提供帮助。

private val allStates: Gen[String] = Gen.oneOf("State1", "State2", "State3")

private val validTransitions: Set[(String, String)] = Set("State1" -> "State2", "State2" -> "State3", "State3" -> "State1")
private val validTransitionsGen: Gen[(String, String)] = Gen.oneOf(validTransitions.toSeq)

private val invalidTransition: Gen[(String, String)] = for {
  from <- allStates
  to <- allStates
  if !validTransitions.contains(from -> to) //this is reimplementaion of canTransitionTo
} yield from -> to

property("valid transitions") = forAll(validTransitionsGen) { transition =>
  Receipt(0, transition._1).canTransitionTo(transition._2)
}

property("invalid transitions") = forAll(invalidTransition) { transition =>
  !Receipt(0, transition._1).canTransitionTo(transition._2)
}

关于scala - 使用 scalacheck 测试有效的状态转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37558468/

相关文章:

scala - 在 Scala 中使用 forall() 从 Option[String] 中提取字符串

c++ - 线程代码解释器中的手动操作调用(打破正常流程)

amazon-web-services - 如何暂停 AWS 步骤函数并恢复它?

java - 为什么 gradle 命令行不显示 specs2 结果?

scala - Spark Streaming Kafka 中的 DStream 过滤和偏移管理

java - Ruby 和 Scala(或 Java)中的 AES 解密

Scalacheck 收缩

Scalacheck:生成与生成器列表相对应的列表

json - 解析 JSON 并遍历 Scala 中的对象

c# - 如何在接口(interface) C# 中调用事件?