簡介
JUnit 是一個 Java 編程語言的單元測試框架。JUnit 在測試驅動的開發方面有很重要的發展,是起源于 JUnit 的一個統稱為 xUnit 的單元測試框架之一。
好處
- 可以書寫一系列的測試方法,對項目所有的接口或者方法進行單元測試。
- 啟動后,自動化測試,并判斷執行結果, 不需要人為的干預。
- 只需要查看最后結果,就知道整個項目的方法接口是否通暢。
- 每個單元測試用例相對獨立,由Junit 啟動,自動調用。不需要添加額外的調用語句。
- 添加,刪除,屏蔽測試方法,不影響其他的測試方法。 開源框架都對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 類中的一些有用的方法列式如下:
-
void assertEquals(boolean expected, boolean actual)
:檢查兩個變量或者等式是否平衡 -
void assertTrue(boolean expected, boolean actual)
:檢查條件為真 -
void assertFalse(boolean condition)
:檢查條件為假 -
void assertNotNull(Object object)
:檢查對象不為空 -
void assertNull(Object object)
:檢查對象為空 -
void assertSame(boolean condition)
:assertSame() 方法檢查兩個相關對象是否指向同一個對象 -
void assertNotSame(boolean condition)
:assertNotSame() 方法檢查兩個相關對象是否不指向同一個對象 -
void assertArrayEquals(expectedArray, resultArray)
:assertArrayEquals() 方法檢查兩個數組是否相等
JUnit 注解
-
@Test
:這個注釋說明依附在 JUnit 的 public void 方法可以作為一個測試案例。 -
@Before
:有些測試在運行前需要創造幾個相似的對象。在 public void 方法加該注釋是因為該方法需要在 test 方法前運行。 -
@After
:如果你將外部資源在 Before 方法中分配,那么你需要在測試運行后釋放他們。在 public void 方法加該注釋是因為該方法需要在 test 方法后運行。 -
@BeforeClass
:在 public void 方法加該注釋是因為該方法需要在類中所有方法前運行。 -
@AfterClass
:它將會使方法在所有測試結束后執行。這個可以用來進行清理活動。 -
@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
:
測試運行結果: