單元測試究竟是什麼

前言:

​ 首先在此給你們拜個晚年,你們新年好。這也有近半個月沒有進行跟新了,是時候將本身最新的學習成果進行總結分享一下了。廢話很少說,進入今天的主題--單元測試。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

簡介:

JUnit是一個開放源代碼的Java測試框架,用於編寫和運行可重複的測試。他是用於單元測試框架體系xUnit的一個實例(用於java語言)。它包括如下特性:

一、用於測試指望結果的斷言(Assertion)

二、用於共享共同測試數據的測試工具

三、用於方便的組織和運行測試的測試套件

四、圖形和文本的測試運行器

JUnit使用:

定義測試方法

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毫秒將會失敗。

斷言語句(Assert statements)

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的一些注意事項:

  • 測試方法必須使用@Test修飾
  • 測試方法必須使用public void進行修飾,不能帶參數
  • 通常使用單元測試會新建一個test目錄存放測試代碼,在生產部署的時候只須要將test目錄下代碼刪除便可
  • 測試代碼的包應該和被測試代碼包結構保持一致
  • 測試單元中的每一個方法必須能夠獨立測試,方法間不能有任何依賴
  • 測試類通常使用Test做爲類名的後綴
  • 測試方法使通常用test做爲方法名的前綴

測試失敗說明:

  • Failure:通常是因爲測試結果和預期結果不一致引起的,表示測試的這個點發現了問題
  • error:是由代碼異常引發的,它能夠產生於測試代碼自己的錯誤,也能夠是被測試代碼中隱藏的bug

總結:

總的來講使用單元測試要比本身手動的測試性能快一些,而且相對來講要簡潔,所以確實是一個很重要的的知識,而且我也和實際開發的朋友溝經過,在實際開發中也是常用檢測本身代碼的一個標準。本文主要是將單元測試的一些簡單介紹,若是有時間,我會將單元測試的框架JUnit進行具體的總結分享。

相關文章
相關標籤/搜索