1

我有一个函数,它有望从一组值中随机返回一个值。有没有用 JUnit 等单元测试工具测试这种随机行为的好方法?

4

4 回答 4

4

在需要对通常随机运行的代码进行大量单元测试的情况下,我有时会将来自 a 的结果流包装java.util.RandomIterable<Integer>. 优点是,在单元测试期间,我可以使用 an 调用相同的方法ArrayList<Integer>并获得完全可预测的行为。

于 2013-08-18T04:22:05.353 回答
2

不。根据定义,结果是(或应该是)不确定的,因此通常的“预期结果”概念不适用。

但是,您可以使用统计方法编写一个相当简单的测试,也许当调用 n 次时,返回的值的集合(唯一)至少为 0.75 n,或类似的东西。

另一种方法可能是将“随机性”推迟到受信任且充分的实现,例如基于 的算法Math.random(),这意味着您的单元测试不必测试随机性,而只需测试功能。

于 2013-08-18T04:12:57.040 回答
1

出于您的目的,java.util.Random 可能被认为是“足够随机的”,所以我假设您要测试的是您在集合中的项目之间获得了适当的随机分布。确实,您可以通过多种方式根据随机数从集合中选择一个项目,但最终仍会导致结果出现偏差。例如,遍历集合并在每个阶段使用随机检查将偏向列表中较早的项目。

如果你想测试你的函数是否真的产生随机结果,你需要找到一个可以做到这一点的统计分析工具包。我建议您使用整数序列填充各种大小的集合,然后针对这些集合运行随机获取代码的测试。您可以将获取的值提供给统计分析,以确定它们是随机的还是有偏差的,并且由于它们是线性序列,因此结果应该暗示整个获取代码的相同属性。

于 2013-08-18T06:23:31.993 回答
0

测试随机值的标准方法是生成几千个随机值,枚举你得到的每个值的数量,计算数据集的卡方统计量,然后不完整的 gamma 函数将为您提供该分布发生在的概率随机的。如果该概率太接近于 0,那么您的 RNG 很可能是有偏差的。

典型的例子是“顽固”测试套件。您还可以查看我的 http://github.com/lcrocker/ojrandlib 中的测试代码。

于 2013-08-18T05:13:55.827 回答