2013-02-18 126 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