簡介
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)
-
:assertSame() 方法檢查兩個相關對象是否指向同一個對象void assertSame(boolean condition)
-
:assertNotSame() 方法檢查兩個相關對象是否不指向同一個對象void assertNotSame(boolean condition)
-
:assertArrayEquals() 方法檢查兩個數組是否相等void assertArrayEquals(expectedArray, resultArray)
JUnit 注解
-
:這個注釋說明依附在 JUnit 的 public void 方法可以作為一個測試案例。@Test
-
:有些測試在運作前需要創造幾個相似的對象。在 public void 方法加該注釋是因為該方法需要在 test 方法前運作。@Before
-
:如果你将外部資源在 Before 方法中配置設定,那麼你需要在測試運作後釋放他們。在 public void 方法加該注釋是因為該方法需要在 test 方法後運作。@After
-
:在 public void 方法加該注釋是因為該方法需要在類中所有方法前運作。@BeforeClass
-
:它将會使方法在所有測試結束後執行。這個可以用來進行清理活動。@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 個步驟來建立參數化測試。
- 用
來注釋 test 類。@RunWith(Parameterized.class)
- 建立一個由
注釋的公共的靜态方法,它傳回一個對象的集合(數組)來作為測試資料集合。@Parameters
- 建立一個公共的構造函數,它接受和一行測試資料相等同的東西。
- 為每一列測試資料建立一個執行個體變量。
- 用執行個體變量作為測試資料的來源來建立你的測試用例。
一旦每一行資料出現測試用例将被調用。
參數化測試例子
被測試代碼
PrimeNumberChecker
:
測試代碼
TestPrimeNumberChecker
:
測試運作代碼
TestRunner
測試運作結果: