QuickCheck >= 2.6 のロープを学んでいますが、シュリンクとは何かを理解していません。タイプ シグネチャを見ると、shrink は expand のように見えます。私を照らしてください:)
2 に答える
QuickCheck がプロパティに違反する入力を見つけると、開発者に失敗の性質についてより適切なメッセージを与えるために、最初にプロパティに違反するより小さな入力を見つけようとします。
もちろん、「小さい」とはどういう意味かは、問題のデータ型によって異なります。shrink
QuickCheck には、関数から出てくるものすべてです。
これは、QuickCheck セッションで最もよく説明されています。
Prelude Test.QuickCheck> let prop l = all (/= 5) l プレリュード Test.QuickCheck> quickCheck prop *** 失敗した!反証可能 (10 回のテストと 2 回の縮小後): [5]
したがって、ここで QuickCheck は最小の反例を示すことができましたが、コメントから判断すると、最初はより大きなリストを念頭に置き、次に を使用して縮小しましたshrink
。何が起こっているかを詳しく見るために、以下を使用しますverboseCheck
。
プレリュード Test.QuickCheck> verboseCheck prop 合格した: [] 合格した: [0] 合格した: [-2,1] 合格した: [-2,2,-2] 合格した: [-4] 失敗した: [-1,-2,5,4,2] *** 失敗した!合格した: [] 失敗した: [5,4,2] 合格した: [] 合格した: [4,2] 失敗した: [5,2] 合格した: [] 合格した: [2] 失敗した: [5] 合格した: [] 合格した: [0] 合格した: [3] 合格した: [4] 反証可能 (6 回のテストと 3 回の縮小後): [5]
QuickCheck は、命題が成立するいくつかのリストを試してから、 を見つけ[-1,-2,5,4,2]
ます。リストのサブリストを試すことで、リストを減らします。GHCi で自分自身を納得させることができshrink [-1,-2,5,4,2] == [[],[5,4,2],[-1,-2,2],...
、2 番目のエントリはまだテストに失敗する最初のエントリです。その後、QuickCheck はそれを続行し、さらに縮小します: shrink [5,4,2] == [[],[4,2],[5,2],...
、さらにshrink [5,2]
[[],[2],[5],...
. 最後に、さらに縮小しようとします[5]
が、いずれもshrink [5] ==
[[],[0],[3],[4]]
命題に失敗しないため、最後の count-example は[5]
です。