我們一直強調單元測試的重要性,但是有乙個問題可能沒有認真去想過,測試是重要的,但是我們測試什麼呢?最近重讀《單元測試之道》,書中給出了答案:right-bicep
1.right——正確
很顯然,如果**執行的結果與你預期的不符合,那麼這段**肯定是有問題的。需要注意的是,right並意味著正確,因為正確只是相對你所期望的結果而言,而對於使用者需求也許就是錯誤的。
2.b——邊界條件
尋找邊界條件是單元測試最有價值的工作之一,因為bug一般出現在邊界條件上,你常常需要考慮下面這些邊界條件:
1)完全偽造或者不一直的資料進行輸入
2)格式錯誤的資料,比如錯誤的url,email位址
3)空值或者不完整值,比如0,null
4)與常理相去甚遠的資料,比如人有10000歲?
5)如果要求傳入的是乙個不允許重複資料的list,你傳入乙個有重複資料的看看出現什麼情況
6)如果需要傳入的有序的集合,你傳入乙個無序的看看結果
7)不按照次序地執行,比如未登入就嘗試操作某功能等
對於邊界條件,可以按照correct的順序去嘗試:
conformance——一致性,值是否和預期的一樣
ordering——順序性,值是否如預期的那樣,有序或者無序
range——區間性,值是否處於合理的範圍內
reference——引用,值是否引用了**無法空值的外部資源
existence——值是否存在,為空?為0?不在集合內?
cardinatity——基數性,檢查你的函式能否正確地計數,不多不少
time——所有的事件的發生是否按照預期的順序,效能上滿足要求?
3.inverse——檢查反向引用
如果方法導致某個結果,嘗試以另乙個方法能否返回最初的狀態?與原狀態是否符合預期?
4。cross——交叉檢查
通過不同的方法檢查乙個方法產生的結果是否正確,比如用math.sqrt方法檢查自己編寫的求平方根的方法是否正確。另外的方式,以一種數量去檢查另一種數量,比如圖書館借出的書加上架上的書的總數是固定,可以用借出的書來檢查架上的書的數量是否正確。
5.e——強制錯誤條件的產生
一般我們所能想到的環境因素:
1)記憶體耗光
2)磁碟用滿
3)時鐘出問題
4)網路不可用或者有問題
5)系統過載
6)調色盤顏色數目有限
7)顯示解析度過高
再比如jdk版本差異,我就為這個問題頭痛過:)
6.performance——效能
每天或者每隔幾天執行一下乙個粗糙簡單的效能測試,能夠保證你不會在給使用者演示的時候出現尷尬的場面。
儘管書上是講了這麼多測試這個、測試那個,我想真實的專案場景中應該根據需要採取特定的測試策略,比如你總不能對於乙個單機應用需要考慮**震斷海底光纜 引發的問題。就我自己而言,因為專案組中似乎只有我對junit等單元測試工具充滿興趣,有經驗的老程式設計師是自己寫乙個帶main方法的test類進行測 試,而更多的人根本就不知道單元測試或者知道也不感興趣,在沒有壓力的情況下,要求自己考慮這麼多的測試內容,難矣。今天試用了下nunit,感覺比 junit難用多了,junit與eclipse的結合非常簡便。
單元測試,測試什麼?
我們一直強調單元測試的重要性,但是有乙個問題可能沒有認真去想過,測試是重要的,但是我們測試什麼呢?最近重讀 單元測試之道 書中給出了答案 right bicep 1.right 正確 很顯然,如果 執行的結果與你預期的不符合,那麼這段 肯定是有問題的。需要注意的是,right並意味著正確,因為正確只...
什麼是單元測試
單元測試是用來對乙個模組 乙個函式或者乙個類來進行正確性檢驗的測試工作。比如對函式abs 我們可以編寫出以下幾個測試用例 輸入正數,比如1 1.2 0.99,期待返回值與輸入相同 輸入負數,比如 1 1.2 0.99,期待返回值與輸入相反 輸入0,期待返回0 輸入非數值型別,比如none 期待丟擲t...
單元測試應該測試什麼? Right BICEP
單元測試應該測試什麼?right bicep right 結果是否正確?b 是否所有的邊界條件都是正確的?i 能查一下反響關聯嗎?c 能用其它手段交叉檢查一下嗎?e 你是否可以強制錯誤條件發生?p 是否滿足效能要求?結果是否正確 這 個最簡單不過了,就是看程式執行之後的結構和文件是否一致。當然可能很...