對於程式設計師來說,僅僅讓程式通過編譯是不夠的,還要做到基本的測試,保證寫的**的正確性。單元測試,整合測試,黑盒測試,白盒測試,對於學過軟體工程的計算機專業的人來說這些都很熟悉,但是我相信很多人都並不會真的做測試,其中有各種各樣的理由。但是單元測試是乙個程式設計師必須掌握的技能。而且以後在重構,測試的時候你會發現junit測試真的是一件非常必要非常便利的事情。而且很能提高自己的工作效率。
雖然說android中有很多優秀的測試框架,但是由於junit的簡單性,用來作為入門學習非常合適。
廢話不多說,我們開始一起回顧一下怎麼使用junit測試。
###the first junit
第乙個測試基於eclipse,我們先寫乙個用於完成加法操作的類,**如下:
public
inte***ce adder
public
class
addimpl
implements
adder
}
接下來生成用於單元測試的類,可以直接右鍵新建乙個junit測試用例。見圖1:
圖1
圖2 如圖2,需要將junit4的libray載入進來.編寫的測試用例類是下面的:
public
class addertestcase
}
junit4使用註解在註解方法裡面可以寫測試用例,junit4比junit3更簡單,更方便,想要了解兩者的不同可以看這裡。
junit的斷言和失敗提示
assertequals斷言
這是應用非常廣泛的乙個斷言,它的作用是比較實際的值和使用者預期的值是否一樣,assertequals在junit中有很多不同的實現,以引數expected和actual都為object型別的為例,assertequals定義為:
static public void assertequals(string message, object expected, object actual)
其中,expected為使用者期望某一時刻物件的值,actual為某一時刻物件實際的值。如果這兩值相等的話(通過物件的equals方法比較),說明預期是正確的,也就是說,**執行是正確的。assertequals還提供了其它的一些實現,例如整數比較,浮點數的比較等等。
asserttrue與assertfalse斷言
asserttrue與assertfalse可以判斷某個條件是真還是假,如果和預期的值相同則測試成功,否則將失敗,asserttrue的定義如下:
staticpublic void asserttrue(string message, boolean condition)
「condition」表示要測試的狀態,如果「condition」的值為false,則測試將會失敗。
assertnull與assertnotnull斷言
assertnull與assertnotnull可以驗證所測試的物件是否為空或不為空,如果和預期的相同則測試成功,否則測試失敗,assertnull定義為:
staticpublic void assertnull(string message, objectobject)
其中,object就是要測試的對物件,如果object為空,該測試成功,否則失敗,是不是很簡單。
assertsame與assertnotsame斷言
assertsame和assertequals不同,assertsame測試預期的值和實際的值是否為同乙個引數(即判斷是否為相同的引用)。assertnotsame則測試預期的值和實際的值是不為同乙個引數。assertsame的定義為:
static publicvoid assertsame(string message, object expected, object actual)
而assertequals則判斷兩個值是否相等,通過物件的equals方法比較,可以相同引用的物件,也可以不同。
fail斷言
「fail」斷言能使測試立即失敗,這種斷言通常用於標記某個不應該被到達的分支。例如asserttrue斷言中,condition為false時就是正常情況下不應該出現的,所以測試將立即失敗,fail的定義為:
staticpublic void fail(string message)
當乙個失敗或者錯誤出現的時候,當前測試方法的執行流程將會被中止,但是位於同乙個測試類中的其他測試將會繼續執行。
執行多個測試類–testsuite
@runwith(suite.class)
@suite.suiteclasses()
public class
mathtestsuite
其中addertestcase.class是上面的單元測試類,另乙個是類似的用於測試除法的類。
需要測試哪些內容?
(1)邊界條件
邊界條件可以概括為乙個詞:correct,分別如下:
一致性(conformance):值是否和預期一致;如兩個editext分別需要輸入兩個整型資料,但是使用者輸入的不是整型確實文字怎麼處理;
有序性(ordering):值是否像期望的那樣是無序或者有序的;
區間性(range):值是否位於合理的最小值和最大值之間。eg.圓的角度為1~360度,使用者輸入500的時候怎麼處理
基數性(cardinatity):是否恰好有足夠的值。這裡的基數指的是計數,測試方法是否可以正確計數,並檢查最後的計數值;
存在性(existence):值是否存在。測試方法是否可以處理值不存在的情況,eg。物件為null的情況下得到的結果是什麼;
時間性(time):所有事情的發生是否是有序的,是否在正確的時刻、是否恰好及時。與時間相關的問題有:相對時間(時間上的順序)、絕對時間(消耗的時間和時鐘上的時間)、併發問題。eg、方法呼叫的時間順序、**超時、不同的本地時間、多執行緒同步等
(2)覆蓋執行路徑重點內容
開發人員的必備技能
對於剛開始學習軟體開發的新人來說,必備技能 往往意味著乙個長長的 標有重要度的學習列表,但是過長的列表通常會導致新人不知如何開始學習,壓力倍增。本文嘗試列舉出最重要的幾個技能,也期望通過此列表能給新人乙個比較明確的學習重點和路徑。沒有掌握任何一門程式語言,就不可能成為一名程式設計人員。許多程式設計師...
開發人員的必備技能
對於剛開始學習軟體開發的新人來說,必備技能 往往意味著乙個長長的 標有重要度的學習列表,但是過長的列表通常會導致新人不知如何開始學習,壓力倍增。本文嘗試列舉出最重要的幾個技能,也期望通過此列表能給新人乙個比較明確的學習重點和路徑。沒有掌握任何一門程式語言,就不可能成為一名程式設計人員。許多程式設計師...
IT開發人員
其路五 轉行到市場 絞盡腦汁的想想,我所知道的人之中只有兩個開發人員去了市場,這兩個人都不能說是朋友,認識而已。他們都是主動要求去了市場,結果是這兩個人均在市場都是乾到一年左右,然後都自已開公司了。呵呵,很奇怪,極高的轉行成功率!不過仔細想想,我對這兩個人的思路佩服的五體投地。能下決心仍掉每月5 6...