《單元測試之道C#版——使用NUnit》測試哪些內(nèi)容 Right-BICEP
1、Right——結(jié)果是否正確?
對于測試而言,首要的也是最明顯的任務(wù)就是查看所期望的結(jié)果是否正確——驗證結(jié)果。
對于許多有大量測試數(shù)據(jù)的測試,考慮用一個獨(dú)立的數(shù)據(jù)來存儲測試數(shù)據(jù),然后讓單元測試讀取該文件。不過需要多注意一下測試數(shù)據(jù)。不管是文件中的還是代碼中的測試數(shù)據(jù),都很有可能是不正確的。實際上,經(jīng)驗告訴我們,測試數(shù)據(jù)比代碼更有可能是錯的,特別是人工計算的,或者來自原有系統(tǒng)計算結(jié)果的測試數(shù)據(jù)。因此,當(dāng)測試數(shù)據(jù)顯示有錯誤發(fā)生的時候,你應(yīng)該在懷疑代碼前線對測試數(shù)據(jù)檢查兩三遍。
2、B——是否所有的邊界條件都是正確的?
找邊界條件助記短語CORRECT
Conformance(一致性)——值是否和預(yù)期的一致
Ordering(順序性)——值是否如應(yīng)該的那樣,是有序或者無序的。 Range(區(qū)間性)——值是否位于合理的最小值和最大值之內(nèi)
Reference(依賴性)——代碼是否引用了一些不在代碼本身控制范圍之外的外部資源。
Existence(存在性)——值是否存在(例如,是否是非null,非0,在一個集合中等等)。
Cardinality(基數(shù)性)——是否恰好有足夠的值?
Time(相對或者絕對的時間性)——所有事情的發(fā)生是否是有序的?是否在正確的時刻?是否恰好及時?
3、I——能查一下反向關(guān)聯(lián)嗎?
例如,可以用對結(jié)果進(jìn)行平方的方式來檢查一個計算平方根的函數(shù),然后測試結(jié)果是否和原數(shù)據(jù)很接近。
4、C——能用其他手段交叉檢查一下結(jié)果嗎?
通常而言,計算一個量會有一種以上的算法。我們可能會基于運(yùn)行效率或者其他的特性來選擇算法。那是我們要在產(chǎn)品中使用的;但是在測試用的系統(tǒng)中,可以使用剩下算法中的一個來交叉測試結(jié)果。
另一種方法就是:使用類本身不同組成部門的數(shù)據(jù),并且確信它們能“合起來”。例如,圖書館的數(shù)據(jù)系統(tǒng),借出數(shù)加上躺在架子上的庫存數(shù)應(yīng)當(dāng)永遠(yuǎn)等于總藏書量。這些就是數(shù)據(jù)的兩個分開的不同組成部門(借出數(shù)和庫存數(shù)),它們甚至可以由不同類的對象來匯報它們,但是它們?nèi)匀槐仨氉裱厦婕s束(總數(shù)恒定)。
5、E——你是否可以強(qiáng)制錯誤條件發(fā)生?
搞一個無效參數(shù)之類的做法是小菜一碟,但是不拔網(wǎng)線要模擬網(wǎng)絡(luò)錯誤就需要一些特殊的技術(shù)了,使用Mock對象可以解決此類問題。
以下是常見的環(huán)境方面的因素:
- 內(nèi)存耗光
- 磁盤用滿
- 時鐘出問題
- 網(wǎng)絡(luò)不可用或有問題
- 系統(tǒng)過載
- 受限的調(diào)色板
- 顯示分辨率過高或者過低
5、P——是否滿足性能要求?
一個檢查起來會很有益處的部分是性能特性,而不是特性性能本身。然后性能特性卻又一種類似“隨著輸入尺寸慢慢變大,問題慢慢變復(fù)雜”的趨勢。
我們想要的是一個性能特性的快速回歸測試。很多時候,也許我們發(fā)布的第一個版本工作正常,但是第二個版本不知道為何變得很慢。我們不知道為什么,也不知道改變了什么,或者什么時候誰敢的,幾乎一切都是未知的。

浙公網(wǎng)安備 33010602011771號