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