我有一个函数,它应该随机从一组值中返回一个值。有没有一种很好的方法可以使用像JUnit等单元测试工具来测试这种随机行为?
答案 0 :(得分:4)
在需要对通常随机行为的代码进行大量单元测试的情况下,我有时会在java.util.Random
中包含来自Iterable<Integer>
的结果流。优点是,在单元测试期间,我可以使用ArrayList<Integer>
调用相同的方法,并获得完全可预测的行为。
答案 1 :(得分:2)
没有。根据定义,结果是(或应该是)不确定的,因此通常的“预期结果”概念不适用。
但是,您可以使用统计方法编写一个相当简单的测试,也许当调用n次时,返回值的 set (唯一)值至少为0.75 n或类似值。
另一种方法可能是将“随机性”推迟到可信且充分的实现,例如基于Math.random()
的算法,这意味着您的单元测试不必测试随机性而不仅仅是功能。
答案 2 :(得分:1)
java.util.Random可能依赖于“足够随机”用于您的目的,因此我假设您要测试的是您在集合中的项目之间获得适当的随机分布。确实,有很多种方法可以根据随机数从集合中选择一个项目,但最终还是会偏向结果。例如,遍历集合并在每个阶段使用随机检查将偏向列表中的早期项目。
如果你想测试你的函数实际产生随机结果,你需要找到一个可以做到这一点的统计分析工具包。我建议你用整数序列填充各种大小的集合,然后针对这些集合运行随机获取代码的测试。您可以将获取的值提供给统计分析,以确定它们是随机的还是有偏差的,并且由于它们是线性序列,因此结果应该意味着整个提取代码具有相同的属性。
答案 3 :(得分:0)
测试随机值的标准方法是生成几千个,计算每个中有多少,计算数据集的卡方统计量,然后不完整的伽马函数将给出概率分布随机发生。如果该概率太接近于0,则您的RNG可能存在偏差。
这个典型的例子是“dieharder”测试套件。您也可以在我的http://github.com/lcrocker/ojrandlib中查看测试代码。