软件测试系列之四 单元测试(Junit)
??在線課堂:https://edu.csdn.net/lecturer/1516?
單元測試簡介
單元測試就是測試程序員依據其所設想的方式開發出來的程序是否產生了預期的結果。單元測試是與軟件開發生命周期中的編碼階段結合起來的,并且只有項目具備各個窗體、報表和屏幕之后才能開始進行測試。
編碼階段的基本單元式:程序、函數、過程、窗體、或者圖形用戶界面。在單元測試中,需要測試以下內容:代碼的控制流程、給函數傳遞參數值、從函數獲取值是否正確。另外,單元測試不只限于檢查控制流程或者程序的執行,還檢查代碼是否遵循編碼標準。
在對每個模塊進行單元測試時,不能完全忽視它們和周圍模塊的相互關系。為模擬這一聯系,在進行測試時,需設置若干輔助測試模塊。輔助模塊有兩種,一種是驅動模塊,用以模擬被測試模塊的上級模塊。驅動模塊在單元測試中接收測試數據,把相關的數據傳送給被測模塊,啟動被測模塊,并打印出相應的結果。另一種是樁模塊,用以模擬被測試模塊工作過程中所調用的模塊。樁模塊由被測模塊調用,它們一般只進行很少的數據處理,例如打印入口和返回,以便于檢查被測試模塊與其下級模塊的接口。
測試中通常使用測試驅動模塊和樁模塊。測試驅動程序是幫助執行軟件以檢查其是否工作的軟件。此程序提供一個框架來設置參數、執行單元并記錄結果。樁模塊不是實際單元而是模型,用以取代實際單元并幫助執行測試過程。
開發人員將測試作為編程的必要過程,并采用單元測試來驗證它們的代碼是否執行預期的功能。開放源碼的單元測試框架有JUnit和Nunit。JUnit適用于Java應用程序,它是由SmallTalk的Sunit派生而來。Nunit用于測試.NET程序。PHPUnit是一個輕量級的PHP測試框架。JavaScript有JsUnit,數據庫有DBUnit……
4.2 ?JUnit
4.2.1 ?JUnit簡介
JUnit是由ErichGamma和KentBeck編寫的一個回歸測試框架。JUnit測試是程序員測試,即所謂白盒測試,因為程序員知道被測試的軟件如何(How)完成功能和完成什么樣(What)的功能。JUnit是一套框架,繼承TestCase類,就可以用JUnit進行自動測試了。
JUnit是一個開放源代碼的Java測試框架,用于編寫和運行可重復的測試。它是用于單元測試框架體系xUnit的一個實例(用于java語言)。它包括以下特性:
?用于測試期望結果的斷言(Assertion)。
?用于共享共同測試數據的測試工具。
?用于方便的組織和運行測試的測試套件。
?圖形和文本的測試運行器。
另外JUnit是在xp編程(Extreme Programming)和重構(refactor)中被極力推薦使用的工具,因為在實現自動單元測試的情況下可以大大的提高開發的效率,但是實際上編寫測試代碼也是需要耗費很多的時間和精力的,那么使用這JUnit好處到底在哪里呢?有以下幾點供參考:
A、對于xp編程而言
要求在編寫代碼之前先寫測試,這樣可以強制你在寫代碼之前好好的思考代碼(方法)的功能和邏輯,否則編寫的代碼很不穩定,那么你需要同時維護測試代碼和實際代碼,這個工作量就會大大增加。因此在xp編程中,基本過程是這樣的:構思→編寫測試代碼→編寫代碼→測試,而且編寫測試和編寫代碼都是增量式的,寫一點測一點,在編寫以后的代碼中如果發現問題可以較快的追蹤到問題的原因,減小回歸錯誤的糾錯難度。
B、對于重構而言
其好處和xp編程中是類似的,因為重構也是要求改一點測一點,減少回歸錯誤造成的時間消耗。
C、對于非以上兩種情況
我們在開發的時候使用JUnit寫一些適當的測試也是有必要的,因為一般我們也是需要編寫測試的代碼的,可能原來不是使用的JUnit,如果使用JUnit,而且針對接口(方法)編寫測試代碼會減少以后的維護工作,例如以后對方法內部的修改(這個就是相當于重構的工作了)。另外就是因為JUnit有斷言功能,如果測試結果不通過會告訴我們哪個測試不通過,是什么原因。而不是寫一些測試代碼看其輸出結果,然后再由自己來判斷結果使用正確,使用JUnit的好處就是這個結果是否正確的判斷是它來完成的,我們只需要看看它告訴我們結果是否正確就可以了,在一般情況下會大大提高效率。
在測試代碼時,必須遵守特定的命名慣例,待測的每種方法的命名應該testXXXX()的格式。任何編寫的測試代碼應執行并完成以下任務:
?設置測試所需要的所有條件。
?調用待測的方法。
?驗證待測的方法是否執行預期的功能。
?清除。
測試代碼的編寫方式與程序代碼相同。除了在測試代碼中會用到附加庫以外,其他的與程序代碼相同。在執行的時候,執行測試代碼而不是實際的項目代碼。測試代碼在一定程度上控制條件下檢查項目代碼。
JUnit提供一些測試方法,用于判斷正在測試的特定方法是否正確執行那個功能。這些方法被稱為asserts(),它斷言某個特定條件是否為真。斷言是單元測試中的基本結構。如表4-1所示,JUnit提供了多個assert()方法,這些方法包含在junit.framework.TestCase類中。
表4-1 ?JUnit中的斷言
| 方法 | 功能描述 |
| assertEquals | 判斷給定兩對象的值是否相等 |
| assertNull | 斷言給定對象是否為null |
| assertNotNull | 斷言給定對象是否不為null |
| assertSame | 判斷給定兩對象是否指同一對象 |
| assertNotSame | 判斷給定兩對象是否不是指同一對象 |
| assertTrue | 斷言給定的布爾條件是否為真 |
| assertFalse | 斷言給定的布爾條件是否為假 |
| fail | 測試失敗 |
斷言失敗時,將終止測試方法,并引發AssertionFailedError。
4.2.2 ?添加JUnit支持
無論是Eclipse還是MyEclipse都自帶有JUnit,我們只需添加JUnit支持即可,想了解更多關于JUnit請參考官方網站?www.junit.org?。下面我們介紹如何在MyEclipse中添加JUnit支持。
1、在Package Explorer中選中要添加JUnit支持的項目,點擊右鍵"Build Path",然后點Add Librarys
?
2.選擇JUnit,然后點擊Next按鈕。
3.
選擇JUnit版本(推薦JUnit 4),但后點擊Finish,此時項目就引入了JUnit.jar,也可以采用直接復制junit.jar到lib下的方式。
?
4.2.3 ?第一個JUnit程序
現在有一個類JunitDemo.java文件,需要對addNum、subNum方法做測試。
package com.test.java; /*** * @author 張晨光* 待測試的java類,需要測試其中的兩個方法,addNum,subNum*/ public class JunitDemo {public int addNum(int num1,int num2){return num1+num2;}public int subNum(int num1,int num2){return num1-num2;} }?
實現步驟如下:
?
?? 1.新建一個類JunitDemoTest.java。
?? 2.導入junit.framework.TestCase包。
?? 3.新建JunitDemo對象引用。
??? 4.新建測試addNum、subNum的方法,命名為testAddNum、testSubNum
? 5.利用assertEquals進行斷言。
代碼如下:
?
package com.test; import junit.framework.TestCase; /*** * @author 張晨光* 對JunitDemo類的addNum和subNum方法進行測試*/ public class TestJunitDemo extends TestCase{public void testAddNum(){assertEquals(2,2,4);}public void testSubNum(){assertEquals(3,2,1);} }1.在項目右鍵以JUnit Test方式運行
?
2.運行結果如下圖
Errors和Failures都是0,證明程序是沒有問題的。
?
總結
以上是生活随笔為你收集整理的软件测试系列之四 单元测试(Junit)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IntelliJ IDEA入门教程之一
- 下一篇: 最简单的打造淘宝商品爆款步骤