如何检查控制示例生成的内部大小参数



在PropEr中,有一个名为Size的内部变量表示生成示例的大小。

例如,当我们有两个变量,并希望它们彼此成比例,适当让您编写以下测试:

prop_profile2() ->
?FORALL(Profile, [{name, string()},
{age, pos_integer()},
{bio, ?SIZED(Size, resize(Size*35, string()))}],
begin
NameLen = to_range(10, length(proplists:get_value(name, Profile))),
BioLen = to_range(300, length(proplists:get_value(bio, Profile))),
aggregate([{name, NameLen}, {bio, BioLen}], true)
end).

在本测试中,内部变量Size保存string()(字符串值生成器)的内部大小,因此?SIZED(Size, resize(Size*35, string()))在这里所做的是使这部分比name原子旁边的string()大35倍。

我试着用假设做类似的事情,但我能想到的是:

@composite
def profiles(draw: DrawFn):
name = draw(text(max_size=10))
name_len = len(name)
age = draw(integers(min_value=1, max_value=150))
bio_len = 35 * name_len
bio = draw(text(min_size=bio_len, max_size=bio_len))
return Profile(name, age, bio)

是否有其他更聪明的方法在多个变量之间具有比例大小?

如果您正在测试的代码实际上需要这些比例,那么您的测试看起来不错,尽管我认为直接翻译您的适当代码将具有bio = draw(text(min_size=bio_len, max_size=max(bio_len, 300)))?就目前而言,您永远无法找到长度相等的bios或较短的bios等的bug。

这指向了一个更基本的问题:为什么你首先想要成比例的输入?

假设风格是直接表达允许输入的限制-"构建(name=text(max_size=10), age=integer (1,150), bio=text(max_size=300))"-并让框架从它发现的任何奇怪的边缘情况中为您提供多样化和诱导错误的输入。(注意:如果你要检查发行版,那么要检查超过10,000个示例-每次运行100个示例看起来不会很不同)

适当的样式通常会增加对输入的进一步限制,以便产生更真实的数据或引导生成特定感兴趣的领域。我认为这是一个错误:我的目标不是生成真实的数据,而是最大化我发现错误的概率——忽略部分输入空间只会造成伤害——然后最小化这样做的预期时间(这个话题对于这个答案来说太大了)。

最新更新