15

並べ替えられた 2 つの入力を並べ替えられた出力にマージする関数の QuickCheck プロパティを作成しました。

prop_merge xs ys =
    if (sorted xs && sorted ys) then (sorted (merge xs ys)) else True

つまり、入力がソートされると、出力もソートされます。次のように書くこともできます。

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

しかし、私はどちらのバージョンもあまり好きではありません。QuickCheck の「条件付きプロパティ」のより適切な構文はありますか?

4

1 に答える 1

33

演算子を使用して==>、ブール条件をプロパティに付加できます。

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

これは構文が優れているだけでなく、QuickCheckがテストが成功したテストケースと前提条件を満たさなかったテストケースを区別できるようにします。後者の場合、テストはカウントされず、QuickCheckは新しい入力を生成します。

ただし、ほとんどの入力が条件を満たさない場合、テストの実行が遅くなるか、十分な入力が破棄されると、QuickCheckは最終的にあきらめます。ランダムリストがソートされる可能性は低いため、上記の例ではこれが発生する可能性が非常に高くなります。

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

(を使用する代わりに標準のブール演算子を使用する==>と、前提条件が失敗したためにほとんどのテストが役に立たなかった場合、QuickCheckは合格したすべてのテストについてブーストすることに注意してください)

このため、通常は、必要なテストケースのみを直接生成する方がはるかに優れています。単純なケースの場合、Test.QuickCheck.Modifiersモジュールには、入力の生成方法を変更するいくつかの便利なニュータイプが含まれています。たとえば、OrderedList修飾子は並べ替えられたリストのみを生成するため、プロパティを次のように簡単に記述できます。

prop_merge (Ordered xs) (Ordered ys) = sorted (merge xs ys)
于 2012-10-14T18:05:45.890 に答える