haskell - 对于 Haskell 的 QuickCheck,什么是收缩?

标签 haskell quickcheck

我正在学习 QuickCheck >= 2.6 的诀窍,但我不明白什么是心理医生。从查看type signature缩小看起来更像是扩张!请照亮我:)

最佳答案

当 QuickCheck 发现违反属性的输入时,它会首先尝试查找也违反该属性的较小输入,以便向开发人员提供有关失败性质的更好信息。

“小”的含义当然取决于所讨论的数据类型;对于 QuickCheck 来说,它是来自 shr​​ink 函数的任何内容。

最好在 QuickCheck session 中进行解释:

Prelude Test.QuickCheck> let prop l = all (/= 5) l
Prelude Test.QuickCheck> quickCheck prop
*** Failed! Falsifiable (after 10 tests and 2 shrinks):    
[5]

所以这里 QuickCheck 能够给出最小的反例,但从评论来看,它首先考虑了一个更大的列表,然后使用 shr​​ink 缩小了它。为了更仔细地了解正在发生的情况,我们使用 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 中说服自己 shr​​ink [-1,-2,5,4,2] == [[],[5,4,2],[-1,-2,2],.. . 第二个条目是第一个仍未通过测试的条目。然后 QuickCheck 继续并进一步缩小:shr​​ink [5,4,2] == [[],[4,2],[5,2],...,以及进一步 >收缩[5,2] [[]、[2]、[5]、...。最后,它尝试进一步缩小 [5],但没有 shr​​ink [5] == [[],[0],[3],[4]] 命题失败,因此最终的计数示例为 [5]

关于haskell - 对于 Haskell 的 QuickCheck,什么是收缩?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16968549/

相关文章:

haskell - 在模板 haskell 中运行模板 haskell

haskell - 证明转置定理

haskell - 如何让 Haskell QuickCheck 2.4 增加 # 个测试?

unit-testing - 基于属性的异常测试

haskell - 为什么这个实现是可折叠类型类的错误实例?

r - 测试软件QuickCheck有R接口(interface)吗?

string - 将字符串转换为数字并打印到命令行

haskell - 如何从 Haskell 中的 10 元组中获取第 n 个元素?

haskell - 如何 "iterate"覆盖类型在迭代中发生变化但形式定义相同的函数

haskell - 一套快速检查测试与实现相匹配是好事还是坏事?