财产检查有冗余和投票

时间:2014-07-16 19:44:42

标签: scala unit-testing scalatest scalacheck

我有多个相同功能合约的实现。有些是天真和直接的,有些更复杂和优化。我想使用PropSpec从输入域中随机选取的点来运行它们。

问题是如何运行所有冗余实现并成对比较输出。如果计算值从一个实现到另一个实现不同,则应将测试标记为失败。如果有两个以上的实现,则应该可以根据投票决定哪一个失败,例如TMR系统

2 个答案:

答案 0 :(得分:0)

您的测试方法必须编排调用所有单独的实现,然后进行投票。这是确保使用相同输入测试每个实现的唯一方法,并确保将输出与所有其他实现进行比较。

答案 1 :(得分:0)

为函数实现创建一个生成器,让ScalaCheck随机化实现和输入。像这个概念代码:

type Input = ...
type Output = ...

trait Algorithm {
  def apply(input: Input): Output
}

val funA: Algorithm = ...
val funB: Algorithm = ...
val funC: Algorithm = ...
val funD: Algorithm = ...

import org.scalacheck._
import Prop.BooleanOperators // for the ==> operator

genInput: Gen[Input] = ...

genAlgorithm: Gen[Algorithm] = Gen.oneOf(funA, funB, funC, funD)

propAlgorithm = Prop.forAll(genAlgorithm, genAlgorithm, genInput) {
  case (f, g, x) => (f != g) ==> f(x) == g(x)
}

要使错误报告有用,您应该在toString上使用合理的Algorithm方法。