加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:31:40 所属栏目:安全 来源:网络整理
导读:假设我有这个课程: 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 = newSta
假设我有这个课程:

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

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

解决方法

有 some tutorials如何使用此框架测试状态机,但他们测试另一个属性.通常,他们为每个有效的转换创建一个Command,并使用fire 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)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读