0

我正在努力在非常严格的测试驱动开发 JUnit 氛围中训练自己。我试图找出在这样的气氛中测试随机性的最佳方法是什么。例如,我正在实现一个随机队列数组,该数组对队列和项目进行排队,并立即用数组上索引为 0-(n-1) 的项目切换该项目(从而模拟随机项目从队列中出来时它是出队)。这是我的入队方法的一些示例代码:

        int randIndex = StdRandom.uniform(size); // generate random index to swap with last item
        Item tmp = randArray[randIndex];
        randArray[size] = item;
        randArray[randIndex] = randArray[size]; //perform swap to create a random item for dequeue
        randArray[size] = tmp;
        size++;

我想运行一些测试以确保我的入队方法实际上是随机切换队列变量与数组中的其他索引。通常我只是在 Main() 方法中抛出一些代码,该方法迭代一堆 enqueue() 调用并打印结果,然后我会检查以确保它“感觉”是随机的。

但是,就像我说的,我想在一个非常严格的单元测试框架中做到这一点。似乎 JUnit 几乎完全使用断言语句,但我不确定我应该断言什么,除非我只是运行一些 Monte Carlo 类型的东西并检查某个 epsilon 的平均值,但这似乎有点用于测试这么简单的方法。

4

2 回答 2

0

您可以将测试分成两部分。

1)您通过给定的伪随机数序列测试,您的排队按预期工作。为此定义任意固定数量的 int 值:例如“5,2,100,3”。然后用断言测试 enque、deque 是否提供了预期的元素。

2)测试Random()java类:你很可能应该省略那个测试,因为Random()它实现得很好。

否则对于 2) 你有它使用卡方随机数检验,并且该统计量在你所说的 soem epsilon 范围内。但这将是一个矫枉过正,所以坚持第 1 点)

于 2013-02-18T18:49:46.397 回答
0

我不确定你真正的目标是什么,但我读它就像测试随机数生成器本身(因为你的切换是..非常直接的)。

如果你使用 java SecureRandom,你应该在熵方面做得很好,请参阅 SecureRandom。如果您对此表示怀疑,请使用一些熵检查器或仅使用来自互联网某些来源的真实随机序列,例如此处

于 2013-02-18T18:49:56.230 回答