JUnit 是一個 Java 編程語言的單元測試框架。JUnit 在測試驅動的開發方面有很重要的發展,是起源於 JUnit 的一個統稱爲 xUnit 的單元測試框架之一。java
從官網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
代表測試成功,那麼咱們來嘗試一下測試不成功是什麼狀況。ui
修改TestMessageDemo
代碼:
從新運行測試:
測試結果爲false
,而且指明瞭指望輸出的結果No
和實際輸出的結果HelloWorld
。
什麼是斷言?剛開始我也很困惑,後來搞了大半天才明白斷言就是"判斷"。
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() 方法檢查兩個數組是否相等@Test
:這個註釋說明依附在 JUnit 的 public void 方法能夠做爲一個測試案例。@Before
:有些測試在運行前須要創造幾個類似的對象。在 public void 方法加該註釋是由於該方法須要在 test 方法前運行。@After
:若是你將外部資源在 Before 方法中分配,那麼你須要在測試運行後釋放他們。在 public void 方法加該註釋是由於該方法須要在 test 方法後運行。@BeforeClass
:在 public void 方法加該註釋是由於該方法須要在類中全部方法前運行。@AfterClass
:它將會使方法在全部測試結束後執行。這個能夠用來進行清理活動。@Ignore
:這個註釋是用來忽略有關不須要執行的測試的。beforeClass()
: 方法首先執行,而且只執行一次。afterClass()
:方法最後執行,而且只執行一次。before()
:方法針對每個測試用例執行,可是是在執行測試用例以前。after()
:方法針對每個測試用例執行,可是是在執行測試用例以後。測試用例是使用 JUnitCore 類來執行的。JUnitCore 是運行測試的外觀類。要從命令行運行測試,能夠運行java org.junit.runner.JUnitCore
。對於只有一次的測試運行,可使用靜態方法 runClasses(Class[])
。
測試套件意味着捆綁幾個單元測試用例而且一塊兒執行他們。在 JUnit 中,@RunWith
和@Suite
註釋用來運行套件測試。
被測試MessageDemo
代碼:
新建兩個測試類,用來展現套件測試:
測試TestMessageDemo
代碼:
測試TestMessageDemo2
代碼:
TestSuite
代碼:
TestRunner
代碼:
測試結果:
經過這樣的方式,咱們就能夠一次運行多個測試了,看起來也不是很複雜哦!
若是一個測試用例比起指定的毫秒數花費了更多的時間,那麼 Junit 將自動將它標記爲失敗。timeout
參數和 @Test
註釋一塊兒使用。是否是很強大?
就像這樣:
@Test(timeout=1000)
複製代碼
時間單位是毫秒。
Junit 用代碼處理提供了一個追蹤異常的選項。你能夠測試代碼是否它拋出了想要獲得的異常。expected
參數和 @Test
註釋一塊兒使用。
好比這樣:
@Test(expected = ArithmeticException.class)
複製代碼
Junit 4 引入了一個新的功能參數化測試。參數化測試容許開發人員使用不一樣的值反覆運行同一個測試。你將遵循 5 個步驟來建立參數化測試。
@RunWith(Parameterized.class)
來註釋 test 類。@Parameters
註釋的公共的靜態方法,它返回一個對象的集合(數組)來做爲測試數據集合。一旦每一行數據出現測試用例將被調用。
被測試代碼PrimeNumberChecker
:
測試代碼TestPrimeNumberChecker
:
測試運行代碼TestRunner
:
測試運行結果: