2011-01-23 5 views
8

QuickCheck를 통해 테스트했을 때 실패한 속성 테스트의 이유를 표시하는 가장 좋은 방법은 무엇입니까? quickcheck로 테스트 속성에 실패한 이유를 표시하는 방법은 무엇입니까?

예를 들어 고려 :

prop a b = res /= [] 
    where 
     (res, reason) = checkCode a b 

는 그 다음 세션의 모습 수 :

> quickCheck prop 
Falsifiable, after 48 tests: 
42 
23 

그러나 디버깅을위한 quickCheck의 falsifable의 일환으로 실패에 대한 이유를 보여주기 위해 정말 편리 할 것 보고서.

나는이처럼 해킹 :

prop a b = if res /= [] then traceShow reason False else True 
    where 
     (res, reason) = checkCode a b 

이 그것을 할 수있는 더 좋은/더 좋은 이상의 quickcheckish 방법이 있습니까?

답변

9

"이유"변수에 문제에 대한 테스트 관련 데이터가 포함되어 있다고 가정합니다. 대신 성공/실패/잘못된 조건과 잘못된 것을 설명하는 문자열을 모두 포함하는 "결과"를 반환 할 수 있습니다. Results를 반환하는 속성은 Bool을 반환하는 속성과 정확히 같은 방식으로 QuickCheck에서 처리합니다. 이처럼

(편집) : 그것은 당신이 원하는 Test.QuickCheck.Property에 정의 된 "결과"유형이다

module QtTest where 

import Test.QuickCheck 
import Test.QuickCheck.Property as P 


-- Always return success 
prop_one :: Integer -> P.Result 
prop_one _ = MkResult (Just True) True "always succeeds" False [] [] 


-- Always return failure 
prop_two :: Integer -> P.Result 
prop_two n = MkResult (Just False) True ("always fails: n = " ++ show n) False [] [] 

참고.

또한 내가 그 사람들을 사용하는 것이 더 스타일이 될 것 같아요 같은

prop_three :: Integer -> Property 
prop_three n = printTestCase ("always fails: n = " ++ show n) False 

로 오히려 직접 생성자를 호출하는 것보다 결과를 구성하는 데 도움이 Test.QuickCheck.Property에서 정의 된 일부 콤비가 있습니다.

+0

"reason"변수 (일부 문자열 또는 표시 가능한 값이라고 가정)가 실패한 경우에 표시되도록 Result를 정확하게 반환하는 방법에 대한 간단한 예제를 제공 할 수 있습니까? – maxschlepzig

+0

업데이트 해 주셔서 감사합니다. 나는 http://www.cse.chalmers.se/~rjmh/QuickCheck/manual.html에 너무 고정되어 있으며 최신의 포괄적 인 모듈 문서 http://hackage.haskell.org/packages/를 보지 않았다. archive/QuickCheck/2.4.0.1/doc/html/Test-QuickCheck-Property.html - 'printTestCase'는 최근 추가 된 것 같습니다. quickCheck 2.1에는 포함되어 있지 않습니다. – maxschlepzig

2

QuickCheck는 함수에 대한 입력을 제공하고 테스트중인 코드가 순수하므로 (바로?), 해당 입력을 함수에 공급하고 결과를 얻을 수 있습니다. 이 입력을 사용하면 올바른 때까지 원래 함수의 조정을 반복적으로 테스트 할 수 있기 때문에 더욱 유연합니다.

+2

글쎄, 질문의 요점은 편의입니다. 성공적인 테스트는 가능한 한 자동화하는 것입니다. ghci 세션을 열고 잠재적 인 비싼 기능을 다시 계산하는 것은 의미가 없습니다. QuickCheck는 이미 '수집', '분류'를 제공하여 * 실패하지 않은 속성 테스트의 출력을 풍부하게 만들 수 있습니다. 이러한 농축은 선택적이며 전혀 유연성을 감소시키지 않습니다. – maxschlepzig

+1

내 말은 실용적인 이유가 있습니다. QuickCheck 속성은 임의로 복잡 할 수 있기 때문에 특정 테스트의 "출력"이 무엇인지는 분명하지 않습니다. 코드를 "hey , 여기에 내가 관심있는 중간 값들이있다! " 이 재 작성을 기꺼이 수행한다고 가정 할 때, IIRC QuickCheck에는 이러한 목적으로 구운 것이 없지만이 기능을 제공 할 수없는 이유는 없습니다. –

관련 문제