我有同一个功能合同的多个实现。有些是天真和直接的,有些是更复杂和优化的。我想使用PropSpec
.
问题是如何运行所有冗余实现并成对比较输出。如果计算值与另一种实现不同,则应将测试标记为失败。如果有两个以上的实现,应该可以根据投票决定哪一个失败,就像在TMR系统中一样
我有同一个功能合同的多个实现。有些是天真和直接的,有些是更复杂和优化的。我想使用PropSpec
.
问题是如何运行所有冗余实现并成对比较输出。如果计算值与另一种实现不同,则应将测试标记为失败。如果有两个以上的实现,应该可以根据投票决定哪一个失败,就像在TMR系统中一样
您的测试方法必须编排调用所有单独的实现,然后进行投票。这是确保每个实现都使用相同的输入进行测试并确保将输出与所有其他实现进行比较的唯一方法。
为你的函数实现创建一个生成器,让 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
.