我有多个相同功能合约的实现。有些是天真和直接的,有些更复杂和优化。我想使用PropSpec
从输入域中随机选取的点来运行它们。
问题是如何运行所有冗余实现并成对比较输出。如果计算值从一个实现到另一个实现不同,则应将测试标记为失败。如果有两个以上的实现,则应该可以根据投票决定哪一个失败,例如TMR系统
答案 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
方法。