原來雖然是索引超出范圍,但是泛型集合拋的卻是ArgumentOutOfRangeException。火星了,MS為什么不和數(shù)組一樣拋IndexOutOfRangeException異常呢?其實List中的元素也是存儲在數(shù)組中的,我想MS是畫蛇添足了。把catch語句改下異常類型,測試通過了,其他和預想的都一樣。
第一個測試方法完成了。寫測試看來還是有點麻煩,NUnit的工作只是將你測試類里的方法一起運行并顯示結果。但測試用例和邏輯,都得自己寫,只是參數(shù)驗證還好說。下面要驗證正常輸出結果的隨機性,費了點功夫。
正常輸出,應該驗證這些:個數(shù)、范圍、元素不重復、運行不重復、隨機分布。
第二個測試方法只比較了一下兩次運行不重復,這里不把這個小算法抽象成機關重重的黑盒了,那應該測試個幾百幾千次,甚至更多,看結果的重復率。還有怎么高效地比較N個集合中,每個集合都很長很長,是否有元素完全相同的呢,我想可以對集合生成一個MD5簽名再比較。
驗證隨機寫在第三個驗證方法里,和驗證結果元素個數(shù)和范圍在一起。關鍵來了,自己覺得它是隨機的不行,怎么判斷這些數(shù)是隨機的?憑什么標準判斷呢?要把判斷的依據(jù)用編程語言告訴計算機。
隨機數(shù)有什么特征,我思索著,終于總結出:隨機是不均勻又均勻。一個隨機數(shù),可以是在指定范圍內(nèi)任意值,此謂不均勻。但一次生成的一組隨機數(shù)總體來看,若把總范圍分成若干跨度相同的子范圍,每個子范圍內(nèi)應有差不多數(shù)量的隨機數(shù)。隨機數(shù)總數(shù)越多,在各范圍內(nèi)分布的比例越接近,此謂均勻。說到分布,想起來了,我們中學學過一個描述分布的數(shù)學概念:方差。我們生成的隨機數(shù),應對范圍的中間值有一定的方差。而這個方差,應該接近于均勻分布情況下的方差。我估計平均每次浮動在10%內(nèi),如果通不過,再調(diào)整一下。
這里采用循環(huán)生成測試參數(shù),以后應該會經(jīng)常用到這種方式。寫完,生成項目,NUnit加載,Run,大紅條!看來浮動范圍限制得太小,但是一看NUnit Text OutPut欄,發(fā)現(xiàn)有的結果浮動值過于懸殊,達數(shù)倍之多。結果之間差別也很大,不對勁!
在項目里調(diào)試,一下子發(fā)現(xiàn),不,應該說是想起來:生成隨機數(shù)的種子應該在循環(huán)外初始化。不然,生成的全是連續(xù)的“隨機數(shù)”。
做修改,NUnit重新Run一下,通過!這才是真正的隨機數(shù),隨機得很暴力,平均方差浮動不到1%!
單元測試也是程序開發(fā)的一部分,希望與大家一起學習交流,成為軟件開發(fā)的現(xiàn)代化正規(guī)軍。