2014-07-16 48 views
0

我有相同功能合同的多个实现。有些是幼稚和直接的,有些则更加复杂和优化。我想通过使用PropSpec从输入域随机选取的点运行它们。冗余和投票属性检查

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

回答

0

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

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

+0

建议的方法存在一些不便之处。它没有针对每个实现的单独报告。当测试失败时,我只知道其中一个与另一个不同步,并且我不知道哪一个知道。这种方法存在更大的问题:如果测试用例失败并出现异常,或者用无限循环超时,所有测试用例都会中止。 – ayvango