天天看點

使用JUnit進行單元測試

簡介

JUnit 是一個 Java 程式設計語言的單元測試架構。JUnit 在測試驅動的開發方面有很重要的發展,是起源于 JUnit 的一個統稱為 xUnit 的單元測試架構之一。

好處

  1. 可以書寫一系列的測試方法,對項目所有的接口或者方法進行單元測試。
  2. 啟動後,自動化測試,并判斷執行結果, 不需要人為的幹預。
  3. 隻需要檢視最後結果,就知道整個項目的方法接口是否通暢。
  4. 每個單元測試用例相對獨立,由Junit 啟動,自動調用。不需要添加額外的調用語句。
  5. 添加,删除,屏蔽測試方法,不影響其他的測試方法。 開源架構都對JUnit 有相應的支援。

環境配置

從官網

http://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

代碼:

測試

TestMessageDemo

基本的已經寫好了,但是如何運作測試呢?

還需要建一個運作測試的檔案:

好了,運作測試:

看到

true

表明測試成功,那麼我們來嘗試一下測試不成功是什麼情況。

修改

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

建立兩個測試類,用來展示套件測試:

TestMessageDemo

TestMessageDemo2

TestSuite

TestRunner

測試結果:

通過這樣的方式,我們就可以一次運作多個測試了,看起來也不是很複雜哦!

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

:

測試代碼

TestPrimeNumberChecker

測試運作代碼

TestRunner

測試運作結果: