Testing 测试不可预测的函数

Testing 测试不可预测的函数,testing,probability,bloom-filter,Testing,Probability,Bloom Filter,我目前正忙于在Ruby中实现有趣的数据结构,在测试没有可预测输出的函数时遇到了一个问题。我目前正在开发一个包含以下完整性实现的: 需要“zlib” 类过滤器 def初始化(大小=100,散列计数=3) raise(ArgumentError,“负缓冲区大小或零缓冲区大小”),如果大小您正确,那么选择恰好工作的值是个坏主意。然而,你的第二个想法并不坏 您应该始终能够测试应该在bloom筛选器中的值是否存在。您可以随机生成多个字符串,并检查阈值是否为误报。这样,如果您更改哈希函数,您的单元测试仍将工

我目前正忙于在Ruby中实现有趣的数据结构,在测试没有可预测输出的函数时遇到了一个问题。我目前正在开发一个包含以下完整性实现的:

需要“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