Testing 测试不可预测的函数
我目前正忙于在Ruby中实现有趣的数据结构,在测试没有可预测输出的函数时遇到了一个问题。我目前正在开发一个包含以下完整性实现的:Testing 测试不可预测的函数,testing,probability,bloom-filter,Testing,Probability,Bloom Filter,我目前正忙于在Ruby中实现有趣的数据结构,在测试没有可预测输出的函数时遇到了一个问题。我目前正在开发一个包含以下完整性实现的: 需要“zlib” 类过滤器 def初始化(大小=100,散列计数=3) raise(ArgumentError,“负缓冲区大小或零缓冲区大小”),如果大小您正确,那么选择恰好工作的值是个坏主意。然而,你的第二个想法并不坏 您应该始终能够测试应该在bloom筛选器中的值是否存在。您可以随机生成多个字符串,并检查阈值是否为误报。这样,如果您更改哈希函数,您的单元测试仍将工
需要“zlib”
类过滤器
def初始化(大小=100,散列计数=3)
raise(ArgumentError,“负缓冲区大小或零缓冲区大小”),如果大小您正确,那么选择恰好工作的值是个坏主意。然而,你的第二个想法并不坏
您应该始终能够测试应该在bloom筛选器中的值是否存在。您可以随机生成多个字符串,并检查阈值是否为误报。这样,如果您更改哈希函数,您的单元测试仍将工作,并且仍将报告筛选器具有可接受的误报率
Bloom过滤器是一种节省空间的概率数据结构,用于测试元素是否为集合的成员。假阳性是可能的,但假阴性是不可能的
仅从布卢姆过滤器的功能描述就可以清楚地看出,测试误报是没有意义的。肯定测试的结果本质上是不确定的,所以你不能对它进行预期结果的测试。您唯一可以保证并因此进行测试的是:
- 该函数返回一个布尔值
- 该函数不会抛出任何错误
- 没有假阴性
测试是为了确认您的期望。如果你不能为自己解释布鲁姆过滤器将返回什么(考虑到脆弱性,正如你所提到的),你就不能期望有这样的期望。(我发誓我不是想说双关语:P)
我的第一个直觉是在所有有趣的散列算法上确认N个生成输入的假阳性百分比。这使您自动化了与手动执行这些测试一样多的安全性
为了实现这一点,我建议对测试代码进行充分的分解,以便您能够表达如下简单内容:
未验证代码
类BloomFilterTestCase
class BloomFilterTestCase << TestCase
def bloom_incidence(alg, pop, false_positives)
define_method("test_bloom_incidence_${alg}_${pop}_${false_positives}") do
# code code code
end
end
bloom_incidence :naive, 50, 0.05
end