使用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代碼:

MessageDemo

測試TestMessageDemo代碼:

MessageDemo

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


MessageDemo

好了,運行測試:


控制臺輸出

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

修改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

測試運行結果:


控制臺輸出
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。