Junit的安裝
Junit的安裝還是很簡單的,直接將Junit3.8.3放在一個目錄下,現在假社這個目錄為D:\Junit3.8.1, 那么我們就在CLASSPATH中添加D:\Junit3.8.1\Junit.jar這個路徑就可以使用了。當然如果你在其他目錄那么相應路徑就是?? : 其他目錄:\ Junit3.8.1\Junit.jar
?
接下來談下Junit框架的組成
Junit TC????????????????????????? 測試目標與測試方法的集合
TS TestSuite??????????????? 測試包
TR TestTusult?????????????? 測試結果的描述
Test Listener??????????????? 測試實踐監聽者
Test Failure???????????????? 測試過程中出現的與預期不一致的地方
AssertionFailedError?? 測試過程中出現的異常
Junit的各種斷言:







這是使用得最多的斷言形式。
expected-是你的期望值(通常要硬編碼)
actual-被測代碼實際產生的值
message-可選的消息,如果提供的話,將會在發生錯誤的時候報告這個消息。





驗證一個給定的對象是否為Null(或者為非Null),如果答案為否,則將會失敗。message參數是可選的。







驗證expected參數和actual
參數所引用的是否為同
一對象,如果不是的
話,將會失敗。Message
參數是可選的。


?????????? assertFalse( [String message],boolean condition)
驗證給定的二元條件是否為真,如果為假的話,將會失敗。Message參數是可選的。
驗證給定的二元條件是否為假,如果不為假的話,將會失敗。Message參數是可選的
5,fail( String message )
使測試立即失敗,其中message參數使可選的。
這種斷言通常被用于標記某個不應該到達的分支(例如,在一個預期發生的異常之后)
?
?
首先,第一行的import聲明引入了必須的junit類。
定義一個類,從TestCase繼承下來
定義一個構造函數
測試類中包含名為test……的方法
?
Junit的框架
?

?2

?3

?4

?5



?6

?7



?8

?9

10

11



12

13

14

15

16

17

?
?
JUnit中常用的接口和類:
Test接口——運行測試和收集測試結果
TestCase抽象類——定義測試中固定方法
Assert靜態類——一系列斷言方法的集合
TestSuite測試包類——多個測試的組合
TestResult結果類和其它類與接口
一些使用JUnit經驗 :
?
不要用TestCase的構造函數初始化,而要用setUp()和tearDown()方法。
不要依賴或假定測試運行的順序,因為JUnit利用Vector保存測試方法。所以不同的平臺會按不同的順序從Vector中取出測試方法。
避免編寫有副作用的TestCase。例如:如果隨后的測試依賴于某些特定的交易數據,就不要提交交易數據。簡單的回滾就可以了。
當繼承一個測試類時,記得調用父類的setUp()和tearDown()方法。
將測試代碼和工作代碼放在一起,一邊同步編譯和更新。
測試類和測試方法應該有一致的命名方案。如在工作類名前加上test從而形成測試類名。
確保測試與時間無關,不要依賴使用過期的數據進行測試。導致在隨后的維護過程中很難重現測試。
如果你編寫的軟件面向國際市場,編寫測試時要考慮國際化的因素。不要僅用母語的Locale進行測試。
盡可能地利用JUnit提供地assert/fail方法以及異常處理的方法,可以使代碼更為簡潔。
測試要盡可能地小,執行速度快
?Junit的擴展:
JUnit + HttpUnit=WEB功能測試工具
JUnit + hansel =代碼覆蓋測試工具
JUnit + abbot =界面自動回放測試工具
JUnit + dbunit =數據庫測試工具
JUnit + junitperf=性能測試工具
?
現在來實踐一下吧! Junit應用舉例:
?



?2

?3

?4

?5

?6

?7



?8

?9

10

11

12

13

14

15



16

17

18

19

20

21



22

23

24

25

26

27



28

29

30

31

32

33



34

35



36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

?
測試程序:

?2

?3

?4

?5

?6



?7

?8

?9

10

11

12

13

14



15

16

17

18

19



20

21

22

23


24

25

26



27

28

29

30


31

32

33



34

35

36

37

運行結果 :runs? 2/2? error: 0? failur:0
測試對于保證軟件開發質量有著非常重要的作用,單元測試更是必不可少,JUnit是一個非常強大的單元測試包,可以對一個/多個類的單個/多個方法測試,還可以將不同的TestCase組合成TestSuit,使測試任務自動化。Eclipse同樣集成了JUnit,可以非常方便地編寫TestCase。
我們創建一個Java工程,添加一個example.Hello類,首先我們給Hello類添加一個abs()方法,作用是返回絕對值:
下一步,我們準備對這個方法進行測試,確保功能正常。選中Hello.java,右鍵點擊,選擇New->JUnit Test Case:
Eclipse會詢問是否添加junit.jar包,確定后新建一個HelloTest類,用來測試Hello類。
選中setUp()和tearDown(),然后點擊“Next”:
選擇要測試的方法,我們選中abs(int)方法,完成后在HelloTest.java中輸入:
?
JUnit會以以下順序執行測試:(大致的代碼)
try {
??? HelloTest test = new HelloTest(); // 建立測試類實例
??? test.setUp(); // 初始化測試環境
??? test.testAbs(); // 測試某個方法
??? test.tearDown(); // 清理資源
}
catch…
setUp()是建立測試環境,這里創建一個Hello類的實例;tearDown()用于清理資源,如釋放打開的文件等等。以test開頭的方法被認為是測試方法,JUnit會依次執行testXxx()方法。在testAbs()方法中,我們對abs()的測試分別選擇正數,負數和0,如果方法返回值與期待結果相同,則assertEquals不會產生異常。
如果有多個testXxx方法,JUnit會創建多個XxxTest實例,每次運行一個testXxx方法,setUp()和tearDown()會在testXxx前后被調用,因此,不要在一個testA()中依賴testB()。
直接運行Run->Run As->JUnit Test,就可以看到JUnit測試結果:
綠色表示測試通過,只要有1個測試未通過,就會顯示紅色并列出未通過測試的方法。可以試圖改變abs()的代碼,故意返回錯誤的結果(比如return n+1;),然后再運行JUnit就會報告錯誤。
如果沒有JUnit面板,選擇Window->Show View->Other,打開JUnit的View:
JUnit通過單元測試,能在開發階段就找出許多Bug,并且,多個Test Case可以組合成Test Suite,讓整個測試自動完成,尤其適合于XP方法。每增加一個小的新功能或者對代碼進行了小的修改,就立刻運行一遍Test Suite,確保新增和修改的代碼不會破壞原有的功能,大大增強軟件的可維護性,避免代碼逐漸“腐爛”。
斷言是一個包含布爾表達式的語句,在執行這個語句時假定該表達式為 true。如果表達式計算為 false,那么系統會報告一個 Assertionerror。它用于調試目的:
assert(a > 0); // throws an Assertionerror if a <= 0
斷言可以有兩種形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 應該總是產生一個布爾值。
Expression2 可以是得出一個值的任意表達式。這個值用于生成顯示更多調試信息的 String 消息。
斷言在默認情況下是禁用的。要在編譯時啟用斷言,需要使用 source 1.4 標記:
javac -source 1.4 Test.java
要在運行時啟用斷言,可使用 -enableassertions 或者 -ea 標記。
要在運行時選擇禁用斷言,可使用 -da 或者 -disableassertions 標記。
要系統類中啟用斷言,可使用 -esa 或者 -dsa 標記。還可以在包的基礎上啟用或者禁用斷言。
可以在預計正常情況下不會到達的任何位置上放置斷言。斷言可以用于驗證傳遞給私有方法的參數。不過,斷言不應該用于驗證傳遞給公有方法的參數,因為不管是否啟用了斷言,公有方法都必須檢查其參數。不過,既可以在公有方法中,也可以在非公有方法中利用斷言測試后置條件。另外,斷言不應該以任何方式改變程序的狀態。