Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 快速检查频率发生器的假设等价物?_Python_Haskell_Quickcheck_Property Based Testing_Python Hypothesis - Fatal编程技术网

Python 快速检查频率发生器的假设等价物?

Python 快速检查频率发生器的假设等价物?,python,haskell,quickcheck,property-based-testing,python-hypothesis,Python,Haskell,Quickcheck,Property Based Testing,Python Hypothesis,作为一个学习项目,我正在将一些Haskell代码(我不熟悉)翻译成Python(我很熟悉) 我正在翻译的Haskell库有一些测试,它们使用基于QuickCheck属性的测试。在Python方面,我使用假设作为基于属性的测试库 Haskell测试使用的辅助函数如下所示: mkIndent'::String->Int->Gen String mkIndent'val size=concat序列[缩进、符号、尾随] 哪里 空白字符=元素“\t” trailing=空白字符列表 缩进=频率[(5,大小

作为一个学习项目,我正在将一些Haskell代码(我不熟悉)翻译成Python(我很熟悉)

我正在翻译的Haskell库有一些测试,它们使用基于QuickCheck属性的测试。在Python方面,我使用假设作为基于属性的测试库

Haskell测试使用的辅助函数如下所示:

mkIndent'::String->Int->Gen String
mkIndent'val size=concat序列[缩进、符号、尾随]
哪里
空白字符=元素“\t”
trailing=空白字符列表
缩进=频率[(5,大小向量空白字符),(1,空白字符列表)]
sym=返回值
我的问题是关于此帮助程序中的
频率
生成器的。

我的理解是,大多数情况下,它将返回
vectorofwhitespace\u char
,其大小为预期的
size
,但五分之一的时间它将返回
listofwhitespace\u char
,可以是任何长度,包括零

在库的上下文中,不考虑
大小的缩进将为被测函数模拟错误的输入数据。所以我明白偶尔产生这样一个输入的意义

我目前不明白的是,为什么5:1的比例有利于有效输入?我希望基于属性的测试框架能够生成各种有效和无效的输入。现在我假设这有点像一个优化,这样它就不会花费大部分时间生成无效的示例了

我问题的第二部分是如何将其转化为假设。AFAICT假设没有任何等效的
频率发生器

我想知道我是否应该尝试从现有的假设策略中构建一个
频率
策略,或者如果习语本身不值得翻译,我应该让框架生成有效和无效的示例

我目前拥有的是:

假设导入策略为st
@圣合成纤维
def制作缩进(图纸、val、尺寸):
"""
使用空格或制表符将“val”缩进“size”。
有时会随机忽略'size'参数。
"""
空白字符=st.text('\t',最小值=1,最大值=1)
trailing=draw(st.text(draw(whitespace_char)))
缩进=拉伸(第一个)(
st.text(绘图(空白字符),最小大小=大小,最大大小=大小),
st.text(绘制(空白字符)),
))
返回“”。加入([缩进、val、尾随])
如果我在一个shell中生成几个示例,这似乎正是我认为它应该做的


但这是我第一次使用基于假设或属性的测试,我想知道如果用一个简单的
一个
来代替
频率分布,我是否会失去一些重要的东西?

据我所知,你已经正确理解了使用
频率的目的。它用于允许偶尔出现大小错误的缩进,而不是(1)仅生成大小正确的缩进,而不会测试错误的缩进大小;或者(2)生成随机大小的缩进,这将一次又一次地测试不良缩进,但只生成一小部分具有良好缩进的用例来测试代码的其他方面

现在,5:1的好缩进与(潜在)坏缩进的比例可能是任意的,如果不了解测试的细节,很难知道1:1或10:1是更好的选择

幸运的是,关于将其移植到
假设
,的答案包括一条删除的注释:

该假设实际上并不支持用户特定的概率——我们从均匀分布开始,但基于观察到的输入的覆盖率对其进行偏移。[…]–扎克·哈特菲尔德·多德2018年4月15日3:43


这表明“假设”包在使用
一个
增加覆盖范围时会自动调整权重,这意味着它可能会在
缩进实施中自动增加大小正确的案例权重,使其成为一种自动版本的
频率

我们实际上最终删除了覆盖率特性,因为它们对单元测试规模是一个净负面影响(尽管对于使用其他工具进行多天模糊化非常有用),但保留了各种启发式。不过,这并没有改变我们的基本建议:先把简单的策略放在
的一个单元中,然后让假设计算出分布。