sch*_*san 38 haskell quickcheck
我正在学习QuickCheck的绳索> = 2.6但我不明白收缩是什么.从查看类型签名收缩看起来更像扩展!请照亮我:)
Joa*_*ner 63
当QuickCheck发现违反属性的输入时,它将首先尝试查找同样违反该属性的较小输入,以便为开发人员提供有关失败性质的更好信息.
当然,"小"意味着什么取决于所讨论的数据类型; 对于QuickCheck来说,它是来自该shrink功能的任何东西.
最好在QuickCheck会话中解释:
Prelude Test.QuickCheck> let prop l = all (/= 5) l Prelude Test.QuickCheck> quickCheck prop *** Failed! Falsifiable (after 10 tests and 2 shrinks): [5]
所以QuickCheck在这里给出了最小的反例,但从评论来看,它首先考虑了一个更大的列表,然后使用它来减少它shrink.为了更仔细地了解正在发生的事情,我们使用verboseCheck:
Prelude Test.QuickCheck> verboseCheck prop Passed: [] Passed: [0] Passed: [-2,1] Passed: [-2,2,-2] Passed: [-4] Failed: [-1,-2,5,4,2] *** Failed! Passed: [] Failed: [5,4,2] Passed: [] Passed: [4,2] Failed: [5,2] Passed: [] Passed: [2] Failed: [5] Passed: [] Passed: [0] Passed: [3] Passed: [4] Falsifiable (after 6 tests and 3 shrinks): [5]
QuickCheck尝试命题所包含的几个列表,然后找到[-1,-2,5,4,2].现在它通过尝试它的子列表来减少列表.您可以在GHCi中说服自己,shrink [-1,-2,5,4,2] == [[],[5,4,2],[-1,-2,2],...第二个条目是第一个仍未通过测试的条目.然后QuickCheck继续这样做shrink [5,4,2] == [[],[4,2],[5,2],...,并进一步缩小:进一步shrink [5,2]
[[],[2],[5],....最后它试图[5]进一步缩小,但没有一个shrink [5] ==
[[],[0],[3],[4]]失败的命题,所以最后的计数 - 例子是[5].
J. *_*son 10
单个shrink是逐步减少某些Arbitrary测试用例的复杂性("立即缩小").这可能是2 -> 1或类似的东西1:[] -> [].对于更复杂的类型,可能有多种方法可以"逐步缩小"类型,因此您可以在列表中指定所有类型.
例如,通过删除任何一个叶子可以缩小树木,因此如果有n叶子,则缩小产生一个长度列表n.
| 归档时间: |
|
| 查看次数: |
4287 次 |
| 最近记录: |