首先在此給你們拜個晚年,你們新年好。這也有近半個月沒有進行跟新了,是時候將本身最新的學習成果進行總結分享一下了。廢話很少說,進入今天的主題--單元測試。java
百度百科的解釋是這樣的:單元測試(模塊測試)是開發者編寫的一小段代碼,用於檢驗被測代碼的一個很小的、很明確的功能是否正確。一般而言,一個單元測試是用於判斷某個特定條件(或者場景)下某個特定函數的行爲。例如,你可能把一個很大的值放入一個有序list 中去,而後確認該值出如今list 的尾部。或者,你可能會從字符串中刪除匹配某種模式的字符,而後確認字符串確實再也不包含這些字符了。數據庫
簡單的說,單元測試就是對你程序中最小的功能模塊進行測試,在c語言裏多是一個函數,java中多是一個方法或者類。數組
目的就是爲了提升代碼的質量。框架
爲何要進行單元測試?說白了就是單元測試有什麼好處,其實測試的好處無非就是減小bug、提升代碼質量、使代碼易於維護等。單元測試有什麼好處請看一下百度百科中概括的四條:ide
一、它是一種驗證行爲。
程序中的每一項功能都是測試來驗證它的正確性。它爲之後的開發提供支援。就算是開發後期,咱們也能夠輕鬆的增長功能或更改程序結構,而不用擔憂這個過程當中會破壞重要的東西。並且它爲代碼的重構提供了保障。這樣,咱們就能夠更自由的對程序進行改進。
二、它是一種設計行爲。
編寫單元測試將使咱們從調用者觀察、思考。特別是先寫測試(test-first),迫使咱們把程序設計成易於調用和可測試的,即迫使咱們解除軟件中的耦合。
三、它是一種編寫文檔的行爲。
單元測試是一種無價的文檔,它是展現函數或類如何使用的最佳文檔。這份文檔是可編譯、可運行的,而且它保持最新,永遠與代碼同步。函數
四、它具備迴歸性。
自動化的單元測試避免了代碼出現迴歸,編寫完成以後,能夠隨時隨地的快速運行測試。工具
在討論如何更好的進行單元測試以前,先來看看我之前是怎麼測試代碼的。性能
之前是這樣測試程序的:單元測試
public int add(int x,int y) { return x + y; } public static void main(String args[]) { int z = new Junit().add(2, 3); System.out.println(z); }
如上面所示,在測試咱們寫好的一個方法時,一般是用一個main方法調用一下咱們要測試的方法,而後將結果打印一下。如今看來這種方式已經很是out了,因此出現了不少單元測試的工具,如:JUnit、TestNG等。藉助它們可讓咱們的單元測試變得很是方便、高效。今天就說說如何利用JUnit進行單元測試。學習
JUnit是一個開放源代碼的Java測試框架,用於編寫和運行可重複的測試。他是用於單元測試框架體系xUnit的一個實例(用於java語言)。它包括如下特性:
一、用於測試指望結果的斷言(Assertion)
二、用於共享共同測試數據的測試工具
三、用於方便的組織和運行測試的測試套件
四、圖形和文本的測試運行器
JUnit使用註解標註爲測試方法並配置它們,下表中給出了JUnit4很是重要的註解。下面全部的註解都用在方法上。
JUnit 4 | 描述 |
---|---|
import org.junit.* |
用於導入下列註解。 |
@Test |
將方法標記爲測試方法。 |
@Before |
在每次測試以前執行,通常用於準備測試環境(初始化類等)。 |
@After |
在每次測試以後執行,用於清理測試環境 (例如刪除臨時數據,還原默認值等)。 它也能夠擁有清理內存( It can also save memory by cleaning up expensive memory structures.)。 |
@BeforeClass |
在全部測試以前,執行一次。它通常用於執行time intensive activities,例如鏈接數據庫等。使用該註解標記的方法須要定義爲static void。 |
@AfterClass |
在全部的測試執行完成以後執行一次。 它通常用於清理一些 activities, 例如斷開數據鏈接。使用該註解標記的方法須要定義爲static void |
@Ignore or @Ignore("Why disabled") |
標記該註解的測試方法是被禁用的。這對於實際代碼作了修改而測試代碼沒有修改的狀況是很是有用的,或者因爲這條測試執行時間過長先不將其包含在測試中,最好是提供一下不去測試的緣由。 |
@Test (expected = Exception.class) |
若是這個測試方法不拋出賦值的異常(Exception.class)將會失敗。 |
@Test(timeout=100) |
若是這個測試方法執行超過100毫秒將會失敗。 |
JUnit提供靜態方法,經過Assert類來測試某些條件。這些斷言語句一般以assert開頭。他們容許你指定錯誤信息、預期結果和實際結果。斷言方法將測試返回的實際值和預期值相比較。若是比較失敗就會拋出AssertionException異常。
下表簡單的介紹了這些方法。[]中的參數是可選的字符串類型。
語句 | 描述 |
---|---|
fail([message]) |
讓這個測試方法失敗,可能用於檢查代碼中某個部分是否未執行,或者在執行測試代碼以前是否存在失敗的測試。這個message參數是可選的。 |
assertTrue([message,] boolean condition) |
驗證boolean條件爲true。 |
assertFalse([message,] boolean condition) |
驗證boolean條件爲false。 |
assertEquals([message,] expected, actual) |
驗證expected和actual相同。注:對於數組則檢查的是引用而不是數組的內容。 |
assertEquals([message,] expected, actual, tolerance) |
驗證float或者double匹配。 你們知道計算機表示浮點型數據都有必定的誤差,因此哪怕理論上他們是相等的,可是用計算機表示出來則可能不是,因此這裏運行傳入一個誤差值。若是兩個數的差別在這個誤差值以內,則測試經過,否者測試失敗。 |
assertNull([message,] object) |
驗證object爲null。 |
assertNotNull([message,] object) |
驗證object不爲null。 |
assertSame([message,] expected, actual) |
驗證expected和actual是同一個對象。 |
assertNotSame([message,] expected, actual) |
驗證expected和actual不是同一個對象。 |
總的來講使用單元測試要比本身手動的測試性能快一些,而且相對來講要簡潔,所以確實是一個很重要的的知識,而且我也和實際開發的朋友溝經過,在實際開發中也是常用檢測本身代碼的一個標準。本文主要是將單元測試的一些簡單介紹,若是有時間,我會將單元測試的框架JUnit進行具體的總結分享。