2013-02-18 129 views
0

我正在努力在非常严格的测试驱动开发JUnit氛围中培养自己。我试图找出测试随机性的最佳方法是在这样一个气氛中。例如,我正在实现一个队列和项目的随机队列数组,并立即使用索引为0-(n-1)的项目切换该项目(从而模拟一个随机项目取出的)。下面是一些例子代码的形式我的排队方法:在JUnit框架中测试随机性

 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几乎完全使用断言语句,但我不确定我应该对什么声明什么,除非我只是运行一些蒙特卡洛类型的东西,并检查平均值对某个epsilon,但这似乎有点多测试这样一个简单的方法。

+1

有些东西不值得花费精力去测试。这听起来像是其中之一。 – Bill 2013-02-18 18:51:13

+0

..或者有一些隐藏的议程;) – cybye 2013-02-18 18:51:45

回答

0

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

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

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

否则为2)你有它使用卡方随机数测试,并认为这sstatistic是在你说的soem epsilon。但这是一个矫枉过正的问题,所以留点1)

0

我不确定你真的在往什么方向前进,但我读它像测试随机数发生器本身(因为你的切换是非常简单的) 。

如果你使用java SecureRandom,你应该对熵有很好的一面,参见 SecureRandom。如果您怀疑这一点,请使用一些熵检查器或仅从互联网中的某些来源的真实随机序列like here