使用JUnit進行單元測試

簡介

JUnit 是一個 Java 編程語言的單元測試框架。JUnit 在測試驅動的開發方面有很重要的發展,是起源於 JUnit 的一個統稱爲 xUnit 的單元測試框架之一。java

好處

  1. 能夠書寫一系列的測試方法,對項目全部的接口或者方法進行單元測試。
  2. 啓動後,自動化測試,並判斷執行結果, 不須要人爲的干預。
  3. 只須要查看最後結果,就知道整個項目的方法接口是否通暢。
  4. 每一個單元測試用例相對獨立,由Junit 啓動,自動調用。不須要添加額外的調用語句。
  5. 添加,刪除,屏蔽測試方法,不影響其餘的測試方法。 開源框架都對JUnit 有相應的支持。

環境配置

從官網www.junit.org 下載 JUnit 最新版本的壓縮文件。編程

筆者使用Maven(Java包管理工具)導入所須要的jar包:數組

<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
複製代碼

基本用法

測試代碼和生成代碼分開放置,Maven默認目錄正好符號這個要求。 框架

代碼目錄

被測試代碼放在main下的java目錄中,junit測試代碼放在test下的java目錄中,造成一一對應關係,測試代碼使用Test開頭命名。編程語言

被測試MessageDemo代碼: 函數

MessageDemo

測試TestMessageDemo代碼: 工具

MessageDemo

基本的已經寫好了,可是如何運行測試呢? 還須要建一個運行測試的文件: 單元測試

MessageDemo

好了,運行測試: 測試

控制檯輸出

看到true代表測試成功,那麼咱們來嘗試一下測試不成功是什麼狀況。ui

修改TestMessageDemo代碼:

TestMessageDemo

從新運行測試:

控制檯輸出

測試結果爲false,而且指明瞭指望輸出的結果No和實際輸出的結果HelloWorld

JUnit 斷言

什麼是斷言?剛開始我也很困惑,後來搞了大半天才明白斷言就是"判斷"。

Junit全部的斷言都包含在 Assert 類中。

這個類提供了不少有用的斷言方法來編寫測試用例。只有失敗的斷言纔會被記錄。Assert 類中的一些有用的方法列式以下:

  1. void assertEquals(boolean expected, boolean actual):檢查兩個變量或者等式是否平衡
  2. void assertTrue(boolean expected, boolean actual):檢查條件爲真
  3. void assertFalse(boolean condition):檢查條件爲假
  4. void assertNotNull(Object object):檢查對象不爲空
  5. void assertNull(Object object):檢查對象爲空
  6. void assertSame(boolean condition):assertSame() 方法檢查兩個相關對象是否指向同一個對象
  7. void assertNotSame(boolean condition):assertNotSame() 方法檢查兩個相關對象是否不指向同一個對象
  8. void assertArrayEquals(expectedArray, resultArray):assertArrayEquals() 方法檢查兩個數組是否相等

JUnit 註解

  1. @Test:這個註釋說明依附在 JUnit 的 public void 方法能夠做爲一個測試案例。
  2. @Before:有些測試在運行前須要創造幾個類似的對象。在 public void 方法加該註釋是由於該方法須要在 test 方法前運行。
  3. @After:若是你將外部資源在 Before 方法中分配,那麼你須要在測試運行後釋放他們。在 public void 方法加該註釋是由於該方法須要在 test 方法後運行。
  4. @BeforeClass:在 public void 方法加該註釋是由於該方法須要在類中全部方法前運行。
  5. @AfterClass:它將會使方法在全部測試結束後執行。這個能夠用來進行清理活動。
  6. @Ignore:這個註釋是用來忽略有關不須要執行的測試的。

JUnit 加註解執行過程

  • beforeClass(): 方法首先執行,而且只執行一次。
  • afterClass():方法最後執行,而且只執行一次。
  • before():方法針對每個測試用例執行,可是是在執行測試用例以前。
  • after():方法針對每個測試用例執行,可是是在執行測試用例以後。
  • 在 before() 方法和 after() 方法之間,執行每個測試用例。

JUnit 執行測試

測試用例是使用 JUnitCore 類來執行的。JUnitCore 是運行測試的外觀類。要從命令行運行測試,能夠運行java org.junit.runner.JUnitCore。對於只有一次的測試運行,可使用靜態方法 runClasses(Class[])

JUnit 套件測試

測試套件意味着捆綁幾個單元測試用例而且一塊兒執行他們。在 JUnit 中,@RunWith@Suite註釋用來運行套件測試。

被測試MessageDemo代碼:

MessageDemo

新建兩個測試類,用來展現套件測試:

測試TestMessageDemo代碼:

MessageDemo

測試TestMessageDemo2代碼:

TestMessageDemo2

TestSuite代碼:

carbon (1).png

TestRunner代碼:

carbon (2).png

測試結果:

控制檯輸出

經過這樣的方式,咱們就能夠一次運行多個測試了,看起來也不是很複雜哦!

JUnit 時間測試

若是一個測試用例比起指定的毫秒數花費了更多的時間,那麼 Junit 將自動將它標記爲失敗。timeout參數和 @Test 註釋一塊兒使用。是否是很強大?

就像這樣:

@Test(timeout=1000)
複製代碼

時間單位是毫秒。

JUnit 異常測試

Junit 用代碼處理提供了一個追蹤異常的選項。你能夠測試代碼是否它拋出了想要獲得的異常。expected 參數和 @Test 註釋一塊兒使用。

好比這樣:

@Test(expected = ArithmeticException.class)
複製代碼

JUnit 參數化測試

Junit 4 引入了一個新的功能參數化測試。參數化測試容許開發人員使用不一樣的值反覆運行同一個測試。你將遵循 5 個步驟來建立參數化測試。

  • @RunWith(Parameterized.class) 來註釋 test 類。
  • 建立一個由 @Parameters註釋的公共的靜態方法,它返回一個對象的集合(數組)來做爲測試數據集合。
  • 建立一個公共的構造函數,它接受和一行測試數據相等同的東西。
  • 爲每一列測試數據建立一個實例變量。
  • 用實例變量做爲測試數據的來源來建立你的測試用例。

一旦每一行數據出現測試用例將被調用。

參數化測試例子

被測試代碼PrimeNumberChecker:

PrimeNumberChecker

測試代碼TestPrimeNumberChecker

TestPrimeNumberChecker

測試運行代碼TestRunner

TestRunner

測試運行結果:

控制檯輸出
相關文章
相關標籤/搜索