現在單元測試很流行,都說要測試驅動開發了嘛,還有敏捷開發什麼的,且不說思路怎麼樣,技術走勢我們控制不了,不過就單元測試技術本身來說,還是有一定意義的。
單元測試就是寫**來測試**,主要就是對方法的測試,細分的話也可以分為黑盒測試,白盒測試,以及模擬測試,一般三種都要同時使用,最基本的就是呼叫一下方法,junit斷言一下返回值是否正確,也就是黑盒測試了,我這裡先說一下命名規範。
測試**的包結構要和被測試**相同,也就是放在同乙個包下面,但不要是同一資料夾,一般工程**在src下,測試**就在test下,不過內部包路徑,測試類和被測試類都要一一對應。
測試類和被測試類類名要對應,在原類名的後面加乙個test即可,也就是假如被測試類的名字叫userbusiness,那麼測試類的名字就叫userbusinesstest,這是類名的命名規範。
測試類的方法名也和被測試類的方法名對應,不同的是這次測試方法名是在前面加test,假如被測試方法名為create() 那測試的方法名就是testcreate().
好了,基本的命名說完了,下面來說一下白盒測試。剛才說了,黑盒測試通常就是呼叫一下方法驗證一下而已,那白盒測試呢,就是主要針對有流程控制的**,要做到考慮所有可能,覆蓋所有**和路徑,傳入不同的值,包括一些邊界值,保證測試的全面和完整。這點非常重要,也是體現乙個人測試水平的高低的地方了,可以在注釋中說明使用的測試用例,期望結果等。
最後說模擬測試,之所以需要模擬,是因為一些物件或方法為被測試的**所依賴,但是又不方便提供,比如資料庫操作,客戶端請求等,當然你也可以提供,不過如果每次做單元測試都要啟動資料庫,啟動容器的話,就不"敏捷"了,單元測試很大作用就是為了重複測試很方便嘛。所以我們就對這些被依賴的資源進行模擬,也就是mock了,目前mock框架主要有jmock和easymock,實現原理大概都是使用動態**,使用起來也大同小異,下面就簡單介紹一下mock的思路。
首先要保證要被模擬的這些物件都能夠注入到被測試類裡面去,不管是set方法注入還是方法傳參都可以,否則我模擬乙個物件了傳不進去就沒辦法測了,所以最好是面向介面程式設計,使用依賴注入,盡量使被測試的類和其所依賴的物件松耦合,這也是我們編碼的時候就應該注意的事情。注入進去以後,被測試物件現在就用的是模擬的物件了,然後第二步就是對模擬的物件進行錄製,也就是指明那個方法傳什麼引數返回什麼值,方便被測試的類使用,錄製完了就重放一下,重放的目的是為了讓模擬的物件準備就緒,然後就可以呼叫被測試類的那個被測試的方法了,使用到mock物件的地方,只要呼叫了錄製過的方法,一切都會按照你設定的方式為它返回值,這樣你就可以忽略被測試方法依賴的其他物件帶來的影響,實現真正的對被測試方法的單元測試了。
上面說的錄製,重放什麼的,mock框架都提供了完整的api,可以方便的使用,這裡就不細說了。
再說一下單元測試要注意的三點,第一點:永遠不要忘了你要測試的是什麼,對乙個方法測試就只測這個方法,方法裡呼叫了其他的方法,你就要mock,這才是真正的單元測試。
第二點:編寫**的時候就要考慮能夠方便的進行單元測試,也就是松耦合,面向介面程式設計的原則,讓每個類,每個方法儘量減少對其他物件的依賴。
最後要注意的是,單元測試可以說盡可能早,並且自動的發現一些問題,但是無法發現所有問題,比如設計的問題單元測試就是無能為力的,不過認真做過單元測試的**,在質量上肯定會高很多,如果已習慣於做單元測試,那麼編碼的時候自然也會多考慮一些問題,這對我們的編碼水平提高也很有好處的。
是不是很簡單呢?那麼立刻對你的**來一場單元測試吧!
Java單元測試
直接目的 是為了提高 質量,減少自己的 出現線上bug。實現思路 覆蓋 實現的路徑。保證每條路徑都能覆蓋到,並且值在預期之內。長遠意義 保證 在修改bug前後 重構前後的邏輯一致。更像是留給後期維護的 邏輯文件。溫習下大學的知識。這裡寫描述 測試過程 參與人測試方法 單元測試 開發白盒 語句覆蓋 判...
java單元測試junit
推薦 unit3.81與junit4.0區別 1.在 junit 4 中,測試是由 test 注釋來識別的 2.unit 3.81 測試執行程式時會在執行每個測試之前自動呼叫 setup 方法,在junit4.0中,要用 before 注釋 3.在 junit 3.81 中,測試執行程式時會在執行每...
NUnit單元測試入門 一
在程式設計過程中會有許多種測試,單元測試只是其中的一種,它是由程式設計師自行測試的工作。單元測試就是測試 撰寫者依據其所設想的方式執行是否產生了預期的結果。單元測試並不能保證程式是完美無缺的,但是在所有的測試中,單元測試是第乙個環節,也是最重要的乙個環節。使用nuni可以測試.net下所有語言,這裡...