在線課堂:https://edu.csdn.net/lecturer/1516 java
單元測試簡介程序員
單元測試就是測試程序員依據其所設想的方式開發出來的程序是否產生了預期的結果。單元測試是與軟件開發生命週期中的編碼階段結合起來的,而且只有項目具有各個窗體、報表和屏幕以後才能開始進行測試。數據庫
編碼階段的基本單元式:程序、函數、過程、窗體、或者圖形用戶界面。在單元測試中,須要測試如下內容:代碼的控制流程、給函數傳遞參數值、從函數獲取值是否正確。另外,單元測試不僅限於檢查控制流程或者程序的執行,還檢查代碼是否遵循編碼標準。編程
在對每一個模塊進行單元測試時,不能徹底忽視它們和周圍模塊的相互關係。爲模擬這一聯繫,在進行測試時,需設置若干輔助測試模塊。輔助模塊有兩種,一種是驅動模塊,用以模擬被測試模塊的上級模塊。驅動模塊在單元測試中接收測試數據,把相關的數據傳送給被測模塊,啓動被測模塊,並打印出相應的結果。另外一種是樁模塊,用以模擬被測試模塊工做過程當中所調用的模塊。樁模塊由被測模塊調用,它們通常只進行不多的數據處理,例如打印入口和返回,以便於檢查被測試模塊與其下級模塊的接口。框架
測試中一般使用測試驅動模塊和樁模塊。測試驅動程序是幫助執行軟件以檢查其是否工做的軟件。此程序提供一個框架來設置參數、執行單元並記錄結果。樁模塊不是實際單元而是模型,用以取代實際單元並幫助執行測試過程。ide
開發人員將測試做爲編程的必要過程,並採用單元測試來驗證它們的代碼是否執行預期的功能。開放源碼的單元測試框架有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支持。
一、在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,證實程序是沒有問題的。