2012-10-14 2 views
9

는 I는 정렬 출력으로 두 정렬 입력들을 병합 기능하는 QuickCheck 속성을 썼다. 다음과 같이 쓸 수도 있습니다 :조건부 QuickCheck 특성

prop_merge xs ys = not(sorted xs && sorted ys) || (sorted (merge xs ys)) 

그러나 나는 어느 버전이 좋을지 모르겠군요. QuickCheck의 "조건부 속성"에 대한 구문이 더 좋습니까?

답변

27

당신은 당신의 재산에 부울 조건을 첨부합니다 ==> 연산자를 사용할 수 있습니다

prop_merge xs ys = (sorted xs && sorted ys) ==> sorted (merge xs ys) 

이 테스트가 성공적으로 테스트 케이스 및 테스트 케이스를 구분하는 QuickCheck 더 좋은 구문뿐만 아니라,하지만 수 있습니다 전제 조건을 만족시키지 못했습니다. 후자의 경우 테스트는 계산되지 않으며 빠른 검사는 새로운 입력을 생성합니다.

그러나 대부분의 입력이 조건을 충족하지 못하는 경우 테스트가 더 느려지거나 충분한 입력을 버린 경우 빠른 검사가 결국 포기하게됩니다. 임의의 목록이 정렬 될 가능성이 있기 때문에, 이것은 위의 예에서 발생할 가능성이 높다 : 전달되는

> quickCheck (prop_merge :: [Int] -> [Int] -> Property) 
*** Gave up! Passed only 15 tests. 

(대신, QuickCheck에 대한 모든 테스트를 높일 것 ==>를 사용하여 표준 부울 연산자와 그를 참고하면 대부분의 테스트는 전제 조건 실패로 인해 쓸모가 없었습니다.)

이러한 이유로, 필요한 테스트 케이스 만 직접 생성하는 것이 일반적으로 훨씬 낫습니다. 간단한 경우에 대해 Test.QuickCheck.Modifiers 모듈에는 입력이 생성되는 방식을 수정하는 몇 가지 유용한 newtype이 포함되어 있습니다. 예를 들어, OrderedList 수정자는 정렬 된 목록 만 생성하므로 다음과 같이 속성을 간단하게 작성할 수 있습니다.

prop_merge (Ordered xs) (Ordered ys) = sorted (merge xs ys) 
+0

아, 훨씬 좋아 보입니다. – fredoverflow

+2

'==>'는 더 멋진 구문 일뿐만 아니라 QuickCheck가 테스트가 성공한 테스트 케이스와 전제 조건을 충족시키지 못한 테스트 케이스를 구별 할 수 있다는 것을 명시 적으로주의하는 것이 유용 할 것이라고 생각합니다. 후자의 경우 테스트는 계산되지 않으며 빠른 검사는 새로운 입력을 생성합니다. 이것은 QuickCheck에서 "*** Gave up! Passed only 15 tests."를 제공하는 것입니다. 메시지 "라고 말합니다. 전제 조건이 표준 부울 연산자를 통해 표현되는 경우 QuickCheck는 전달 된 모든 테스트에 대해 부스트가 발생합니다. –

+0

@cebewee : 의견을 보내 주셔서 감사합니다. 그것들은 검토자가 거부했기 때문에 수동으로. – hammar