【问题标题】:How to unit-test the behavior of 'randomly' choosing one value?如何对“随机”选择一个值的行为进行单元测试?
【发布时间】:2013-08-18 04:05:53
【问题描述】:

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

【问题讨论】:

标签: java unit-testing random junit


【解决方案1】:

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

【讨论】:

  • 这是最好的方法。单元测试不应该测试java.util.Random 的随机性。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      测试随机值的标准方法是生成几千个,枚举你得到的每个,计算数据集的卡方统计量,然后不完全伽马函数会给你概率分布随机发生。如果这个概率太接近于 0,很可能你的 RNG 有偏差。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-10
        • 1970-01-01
        • 1970-01-01
        • 2018-03-04
        相关资源
        最近更新 更多