2014-07-16 3 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) 
} 

당신은 또한이 Algorithm에 합리적인 toString 방법이 있어야합니다, 오류 보고서가 도움이 확인하십시오.

+0

제안 된 방법에 약간의 불편 함이 있습니다. 모든 실현에 대해 별도의 보고서가 없습니다. 테스트가 실패 할 때 나는 그들 중 하나가 다른 것과 동기화되지 않고 지식이 제공되지 않는다는 것을 안다. 그리고이 접근법에 더 큰 이슈가 있습니다 : 테스트 케이스가 예외로 실패하거나 무한 루프로 타임 아웃되면 모든 테스트 케이스가 중단됩니다. – ayvango