我有一些代码可以根据加权随机提供东西。权重较大的事物更有可能被随机选择。现在,作为一名优秀的 Ruby 专家,我当然希望通过测试来覆盖所有这些代码。我想测试是否按照正确的概率获取内容。
那么我该如何测试呢?为应该是随机的东西创建测试使得很难比较实际与预期。我有一些想法,以及为什么它们效果不佳:
Stub Kernel.rand 在我的测试中返回固定值。这很酷,但是 rand() 被多次调用,我不确定我是否可以通过足够的控制来操纵它来测试我需要的东西。
多次获取随机项目并比较实际比率与预期比率。但除非我可以无限次地运行它,否则这永远不会是完美的,并且如果我在 RNG 中运气不好,可能会间歇性地失败。
使用一致的随机种子。这使得 RNG 可重复,但它仍然没有给我任何证据来证明项目 A 会在 80% 的情况下发生(例如)。
那么我可以使用什么样的方法来编写随机概率的测试覆盖率?
我认为你应该分开你的目标。正如您提到的,一种是存根 Kernel.rand 。以 rspec 为例,您可以执行以下操作:
test_values = [1, 2, 3]
Kernel.stub!(:rand).and_return( *test_values )
请注意,除非您以内核作为接收者来调用 rand,否则此存根将无法工作。如果您只是调用“rand”,那么当前的“self”将收到该消息,并且您实际上会得到一个随机数而不是 test_values。
第二个目标是进行类似现场测试的操作,在其中实际生成随机数。然后,您可以使用某种容差来确保接近所需的百分比。但这永远不会是完美的,并且可能需要人工来评估结果。但这样做仍然很有用,因为您可能会意识到另一个随机数生成器可能更好,例如从 /dev/random 读取。另外,进行这种测试是件好事,因为假设您决定迁移到一种新的平台,该平台的系统库在生成随机性方面不太好,或者某个版本中存在一些错误。该测试可能是一个警告信号。
这实际上取决于您的目标。您只想测试您的加权算法,还是随机性?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)