相關概念
Ø JUnit是一個開發源代碼的Java測試框架用於編寫和運行可重復的測試它是用於單元測試框架體系xUnit的一個實例(用於java語言)主要用於白盒測試回歸測試
Ø 白盒測試把測試對象看作一個打開的盒子程序內部的邏輯結構和其他信息對測試人
員是公開的
Ø 回歸測試軟件或環境的修復或更正後的再測試自動測試工具對這類測試尤其有用
Ø 單元測試最小粒度的測試以測試某個功能或代碼塊一般由程序員來做因為它需要知道內部程序設計和編碼的細節
單元測試
單元測試的好處
Ø 提高開發速度測試是以自動化方式執行的提升了測試代碼的執行效率
Ø 提高軟件代碼質量它使用小版本發布至集成便於實現人員除錯同時引入重構概念讓代碼更干淨和富有彈性
Ø 提升系統的可信賴度它是回歸測試的一種支持修復或更正後的再測試可確保代碼的正確性
單元測試的針對對象
Ø 面向過程的軟件開發針對過程
Ø 面向對象的軟件開發針對對象
Ø 可以做類測試功能測試接口測試(最常用於測試類中的方法)
單元測試工具和框架
目前的最流行的單元測試工具是xUnit系列框架常用的根據語言不同分為JUnit(java)CppUnit(C++)DUnit (Delphi ))PhpUnit(Php )等等
單元測試框架的第一個和最傑出的應用就是由Erich Gamma (《設計模式》的作者)和Kent Beck(XP(Extreme Programming)的創始人 )提供的開放源代碼的JUnit
Junit入門簡介
JUnit的好處和JUnit測試編寫原則
使用JUnit的好處
Ø 可以使測試代碼與產品代碼分開
Ø 針對某一個類的測試代碼通過較少的改動便可以應用於另一個類的測試
Ø 易於集成到測試人員的構建過程中JUnit和Ant的結合可以實施增量開發
Ø JUnit是公開源代碼的可以進行二次開發
Ø 可以方便地對JUnit進行擴展
JUnit測試編寫原則
Ø 簡化測試的編寫這種簡化包括測試框架的學習和實際測試單元的編寫
Ø 使測試單元保持持久性
Ø 可以利用既有的測試來編寫相關的測試
JUnit的特征
Ø 使用斷言方法判斷期望值和實際值差異返回Boolean值
Ø 測試驅動設備使用共同的初始化變量或者實例
Ø 測試包結構便於組織和集成運行
Ø 支持圖型交互模式和文本交互模式
JUnit框架組成
Ø 對測試目標進行測試的方法與過程集合可稱為測試用例(TestCase)
Ø 測試用例的集合可容納多個測試用例(TestCase)將其稱作測試包(TestSuite)
Ø 測試結果的描述與記錄(TestResult)
Ø 測試過程中的事件監聽者(TestListener)
Ø 每一個測試方法所發生的與預期不一致狀況的描述稱其測試失敗元素(TestFailure)
Ø JUnit Framework中的出錯異常(AssertionFailedError)
JUnit框架是一個典型的Composite模式TestSuite可以容納任何派生自Test的對象當調用TestSuite對象的run()方法是會遍歷自己容納的對象逐個調用它們的run()方法
JUnit中常用的接口和類
Ø Test接口運行測試和收集測試結果
Test接口使用了Composite設計模式是單獨測試用例(TestCase)聚合測試模式(TestSuite)及測試擴展(TestDecorator)的共同接口 它的public int countTestCases()方法用來統計測試時有多少個TestCase另外一個方法就是public void run( TestResult )TestResult是實例接受測試結果 run方法執行本次測試
Ø TestCase抽象類定義測試中固定方法
TestCase是Test接口的抽象實現(不能被實例化只能被繼承)其構造函數TestCase(string name)根據輸入的測試名稱name創建一個測試實例由於每一個TestCase在創建時都要有一個名稱若測試失敗了便可識別出是哪個測試失敗
TestCase類中包含的setUp()tearDown()方法
setUp()方法集中初始化測試所需的所有變量和實例並且在依次調用測試類中的每個測試方法之前再次執行setUp()方法
tearDown()方法則是在每個測試方法之後釋放測試程序方法中引用的變量和實例
開發人員編寫測試用例時只需繼承TestCase來完成run方法即可然後JUnit獲得測試用例執行它的run方法把測試結果記錄在TestResult之中
Ø Assert靜態類一系列斷言方法的集合
Assert包含了一組靜態的測試方法用於期望值和實際值比對是否正確即測試失敗Assert類就會拋出一AssertionFailedError異常JUnit測試框架將這種錯誤歸入Failes並加以記錄同時標志為未通過測試如果該類方法中指定一個String類型的傳參則該參數將被做為AssertionFailedError異常的標識信息告訴測試人員改異常的詳細信息
JUnit 提供了大類組斷言方法包括基礎斷言數字斷言字符斷言布爾斷言對象斷言其中assertEquals(Object expctedObject actual)內部邏輯判斷使用equals()方法這表明斷言兩個實例的內部哈希值是否相等時最好使用該方法對相應類實例的值進行比較
而assertSame(Object expectedObject actual)內部邏輯判斷使用了Java運算符==這表明該斷言判斷兩個實例是否來自於同一個引用(Reference)最好使用該方法對不同類的實例的值進行比對
asserEquals(String messageString expectedString actual)該方法對兩個字符串進行邏輯比對如果不匹配則顯示著兩個字符串有差異的地方
ComparisonFailure類提供兩個字符串的比對不匹配則給出詳細的差異字符
Ø TestSuite測試包類??多個測試的組合
TestSuite類負責組裝多個Test Cases待測得類中可能包括了對被測類的多個測試而TestSuit負責收集這些測試使我們可以在一個測試中完成全部的對被測類的多個測試TestSuite類實現了Test接口且可以包含其它的TestSuites它可以處理加入Test時的所有拋出的異常
TestSuite處理測試用例有個規約(否則會被拒絕執行測試)
⊃ 測試用例必須是公有類(Public)
⊃ 用例必須繼承與TestCase類
⊃ 測試用例的測試方法必須是公有的( Public )
⊃ 測試用例的測試方法必須被聲明為Void
⊃ 測試用例中測試方法的前置名詞必須是test
⊃ 測試用例中測試方法誤任何傳遞參數
Ø TestResult結果類和其它類與接口
TestResult結果類集合了任意測試累加結果通過TestResult實例傳遞個每個測試的Run()方法TestResult在執行TestCase是如果失敗會異常拋出
TestListener接口是個事件監聽規約可供TestRunner類使用它通知listener的對象相關事件方法包括測試開始startTest(Test test)測試結束endTest(Test test)錯誤增加異常addError(Test testThrowable t)和增加失敗addFailure(Test testAssertionFailedError t)
TestFailure失敗類是個失敗狀況的收集類解釋每次測試執行過程中出現的異常情況其toString()方法返回失敗狀況的簡要描述
Eclipse中JUnit的使用
測試對於保證軟件開發質量有著非常重要的作用單元測試更是必不可少JUnit是一個非常強大的單元測試包可以對一個/多個類的單個/多個方法測試還可以將不同的TestCase組合成TestSuit使測試任務自動化
Eclipse同樣集成了JUnit可以非常方便地編寫TestCaseEclipse自帶了一個JUnit的插件不用安裝就可以在你的項目中開始測試相關的類並且可以調試你的測試用例和被測試類
Eclipse中JUint使用步驟
以下步驟環境為Eclipse SDK 及JUnit
Ø 新建一個測試用例或選擇已有的所想測試的JAVA文件點擊File>New>…菜單項或右擊文件在彈出的New對話框中選擇JUnit Test Case就進入New JUnit Test Case對話框
Ø 在New JUnit TestCase對話框填寫相應的欄目主要有Name(測試用例名)SuperClass(若JUnit的版本是則測試的超類一般默認為junitframeworkTestCase 若JUnit版本是JUnit 則默認超類為javalangObject)Class Under Test(被測試的類)Source Folder(測試用例保存的目錄)Package(測試用例包名)及是否自動生成mainsetUptearDown方法在此一般填寫NAME及選上復選上setUpt和teardown即可
Ø 點擊Next>按鈕則進入Test Methods在此你可以直接勾選你想測試的被測試類的方法Eclipse將自動生成與被選方法相應的測試方法點擊Fishish按鈕後一個測試用例就創建好了
Ø 編寫完成測試用例後點擊Run按鈕就可以看到運行結果了
補充要使用JUnit您必須首先將JUnit JAR保存在項目的Build路徑上並創建一個測試類將JUnit保存在項目的Build路徑上的步驟為
右擊項目—>選擇菜單底部的Properties選擇Java Build Path—>選擇Libraries—>點擊Add Variable按鈕—>查看已有的列表中有無JUnit文件若沒有則點擊Configure Variable—>New按鈕輸入JUNIT_LIB作為變量名稱編輯該變量並指向解壓後的JUnit目錄中的一個名為JUnitjar的文件—>然後在選擇剛才添加的jar文件依次點擊OK即可
Eclipse中JUnit應用示例
下面我們作一個在Eclipse中利用JUnit對HelloWorld的測試 測試方法
Ø HelloWorldsayHello()是否執行正常並且結果也符合要求
Ø HelloWorldadd()方法是否與我們預期一樣執行
下一步我們准備對這兩個方法進行測試確保功能正常選中HelloWorldjava右鍵點擊選擇New>JUnit Test Case
進入下面這個頁面在此諸多欄目已經填好即是這個需要測試的文件的相關信息若是想在測試完之後即刪除測試文件也可更改路徑(本機在Eclipse已有的JUnit的基礎上又添加了一個新版本JUnit)
點擊Next進入Test Methods在此選擇所要測試的方法sayHello及add
點擊Finish最後編寫完成測試用例代碼如下
直接運行Run>Run As>JUnit Test就可以看到JUnit測試結果
綠色表示測試通過只要有個測試未通過就會顯示紅色並列出未通過測試的方法
後記
從上面的來看JUnit的使用並不很難但關鍵就是最後一步完成測試碼即編寫TestCase要編寫一個好的TestCase卻並非易事一個不好的TestCase往往是既浪費了時間也起不了實際的作用相反一個好的TestCase不僅可以很好的指出代碼中存在的問題而且也可以作為代碼更准確的文檔同時還在持續集成的過程中起非常重要的作用我們在作測試寫TestCase時需要注意的幾點
Ø 測試的獨立性一次只測試一個對象方便定位出錯的位置這有兩層意思一個TestCase只測試一個對象一個TestMethod只測試這個對象中的一個方法
Ø 給測試方法一個合適的名字 一般取名為原來的方法名後加一個Test
Ø 在assert函數中給出失敗的原因如assertTrue( … should be true ……)方便查錯在這個例子中如果無法通過assertTrue那麼給出的消息將被顯示在junit中每個assert函數都有第一個參數是出錯時顯示消息的函數原型
Ø 測試所有可能引起失敗的地方如一個類中頻繁改動的函數對於那些僅僅只含有getter/setter的類如果是由IDE(如Eclipse)產生的則可不測如果是人工寫那麼最好測試一下
Ø 在setUp和tearDown中的代碼不應該是與測試方法相關的而應該是全局相關的如針對與測試方法A和B在setUp和tearDown中的代碼應該是A和B都需要的代碼
Ø 測試代碼的組織相同的包不同的目錄這樣測試代碼可以訪問被測試類的protected變量/方法方便測試代碼的編寫放在不同的目錄則方便了測試代碼的管理以及代碼的打包和發布
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28693.html