簡介
JUnit 是一個 Java 編程語言的單元測試框架。JUnit 在測試驅(qū)動的開發(fā)方面有很重要的發(fā)展,是起源于 JUnit 的一個統(tǒng)稱為 xUnit 的單元測試框架之一。
好處
- 可以書寫一系列的測試方法,對項目所有的接口或者方法進行單元測試。
- 啟動后,自動化測試,并判斷執(zhí)行結(jié)果, 不需要人為的干預(yù)。
- 只需要查看最后結(jié)果,就知道整個項目的方法接口是否通暢。
- 每個單元測試用例相對獨立,由Junit 啟動,自動調(diào)用。不需要添加額外的調(diào)用語句。
- 添加,刪除,屏蔽測試方法,不影響其他的測試方法。 開源框架都對JUnit 有相應(yīng)的支持。
環(huán)境配置
從官網(wǎng)http://www.junit.org 下載 JUnit 最新版本的壓縮文件。
筆者使用Maven(Java包管理工具)導(dǎo)入所需要的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目錄中,形成一一對應(yīng)關(guān)系,測試代碼使用Test開頭命名。
被測試MessageDemo代碼:

測試TestMessageDemo代碼:

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

好了,運行測試:

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

重新運行測試:

測試結(jié)果為false,并且指明了期望輸出的結(jié)果No和實際輸出的結(jié)果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() 方法檢查兩個相關(guān)對象是否指向同一個對象 -
void assertNotSame(boolean condition):assertNotSame() 方法檢查兩個相關(guān)對象是否不指向同一個對象 -
void assertArrayEquals(expectedArray, resultArray):assertArrayEquals() 方法檢查兩個數(shù)組是否相等
JUnit 注解
-
@Test:這個注釋說明依附在 JUnit 的 public void 方法可以作為一個測試案例。 -
@Before:有些測試在運行前需要創(chuàng)造幾個相似的對象。在 public void 方法加該注釋是因為該方法需要在 test 方法前運行。 -
@After:如果你將外部資源在 Before 方法中分配,那么你需要在測試運行后釋放他們。在 public void 方法加該注釋是因為該方法需要在 test 方法后運行。 -
@BeforeClass:在 public void 方法加該注釋是因為該方法需要在類中所有方法前運行。 -
@AfterClass:它將會使方法在所有測試結(jié)束后執(zhí)行。這個可以用來進行清理活動。 -
@Ignore:這個注釋是用來忽略有關(guān)不需要執(zhí)行的測試的。
JUnit 加注解執(zhí)行過程
-
beforeClass(): 方法首先執(zhí)行,并且只執(zhí)行一次。 -
afterClass():方法最后執(zhí)行,并且只執(zhí)行一次。 -
before():方法針對每一個測試用例執(zhí)行,但是是在執(zhí)行測試用例之前。 -
after():方法針對每一個測試用例執(zhí)行,但是是在執(zhí)行測試用例之后。 - 在 before() 方法和 after() 方法之間,執(zhí)行每一個測試用例。
JUnit 執(zhí)行測試
測試用例是使用 JUnitCore 類來執(zhí)行的。JUnitCore 是運行測試的外觀類。要從命令行運行測試,可以運行java org.junit.runner.JUnitCore。對于只有一次的測試運行,可以使用靜態(tài)方法 runClasses(Class[])。
JUnit 套件測試
測試套件意味著捆綁幾個單元測試用例并且一起執(zhí)行他們。在 JUnit 中,@RunWith和@Suite注釋用來運行套件測試。
被測試MessageDemo代碼:

新建兩個測試類,用來展示套件測試:
測試TestMessageDemo代碼:

測試TestMessageDemo2代碼:

TestSuite代碼:

TestRunner代碼:

測試結(jié)果:

通過這樣的方式,我們就可以一次運行多個測試了,看起來也不是很復(fù)雜哦!
JUnit 時間測試
如果一個測試用例比起指定的毫秒數(shù)花費了更多的時間,那么 Junit 將自動將它標(biāo)記為失敗。timeout參數(shù)和 @Test 注釋一起使用。是不是很強大?
就像這樣:
@Test(timeout=1000)
時間單位是毫秒。
JUnit 異常測試
Junit 用代碼處理提供了一個追蹤異常的選項。你可以測試代碼是否它拋出了想要得到的異常。expected 參數(shù)和 @Test 注釋一起使用。
比如這樣:
@Test(expected = ArithmeticException.class)
JUnit 參數(shù)化測試
Junit 4 引入了一個新的功能參數(shù)化測試。參數(shù)化測試允許開發(fā)人員使用不同的值反復(fù)運行同一個測試。你將遵循 5 個步驟來創(chuàng)建參數(shù)化測試。
- 用
@RunWith(Parameterized.class)來注釋 test 類。 - 創(chuàng)建一個由
@Parameters注釋的公共的靜態(tài)方法,它返回一個對象的集合(數(shù)組)來作為測試數(shù)據(jù)集合。 - 創(chuàng)建一個公共的構(gòu)造函數(shù),它接受和一行測試數(shù)據(jù)相等同的東西。
- 為每一列測試數(shù)據(jù)創(chuàng)建一個實例變量。
- 用實例變量作為測試數(shù)據(jù)的來源來創(chuàng)建你的測試用例。
一旦每一行數(shù)據(jù)出現(xiàn)測試用例將被調(diào)用。
參數(shù)化測試?yán)?/h3>
被測試代碼PrimeNumberChecker:

測試代碼TestPrimeNumberChecker:

測試運行代碼TestRunner:

測試運行結(jié)果:
