Junit 單元測試框架基礎(chǔ)知識(shí)
1. Junit 簡介

Junit 是 Java 編程語言的 單元測試 框架,用于編寫和可重復(fù)運(yùn)行的自動(dòng)化測試。
2. 技術(shù)參數(shù)選取范圍

3. Junit 基礎(chǔ)知識(shí)

3.1 Junit 基礎(chǔ)注解
單元測試題目中 @Test、@RunWith 參數(shù)化出出鏡率非常的高,所以一定要多加注意。
@Ignore 忽略此方法
有時(shí)候我們想暫時(shí)不運(yùn)行某些測試方法\測試類,可以在方法前加上這個(gè)注解。
注意:可以忽略整個(gè)測試類。
@BeforeClass
注意:測試方法的訪問修飾符必須是?public ,返回值必須是?void 的 static 方法。
@AfterClass
跟 @BeforeClass 對(duì)應(yīng),在測試類里所有用例運(yùn)行之后,運(yùn)行一次。用于處理一些測試后續(xù)工作,例如清理數(shù)據(jù),恢復(fù)現(xiàn)場。
注意:測試方法的訪問修飾符必須是?public?,返回值必須是?void?的?static?方法。
@Before @After?
與 @BeforeClass 和 @AfterCalss?的區(qū)別在于,@Before 和 @After?不止運(yùn)行一次,它會(huì)在每個(gè)用例運(yùn)行之前和之后都運(yùn)行一次。主要用于一些獨(dú)立于用例之間的準(zhǔn)備工作。
@Runwith
測試運(yùn)行器則決定了用什么方式偏好去運(yùn)行這些測試集(Test-Suite)/類(Test-Case)/方法(Test-Method)。
@Runwith 就是放在測試類名之前,用來確定這個(gè)類怎么運(yùn)行的。也可以不標(biāo)注,會(huì)使用默認(rèn)運(yùn)行器。常見的運(yùn)行器有:
@RunWith(Parameterized.class) 參數(shù)化運(yùn)行器,配合 @Parameters 使用 Junit 的參數(shù)化功能
@RunWith(Suite.class) @SuiteClasses({ATest.class,BTest.class,CTest.class})?測試集運(yùn)行器配合使用測試集功能
@RunWith(JUnit4.class)?Junit4的默認(rèn)運(yùn)行器

@RunWith 實(shí)現(xiàn)參數(shù)化測試
如一個(gè)對(duì)考試分?jǐn)?shù)進(jìn)行評(píng)價(jià)的函數(shù),返回值分別為“優(yōu)秀,良好,一般,及格,不及格”。在編寫測試的時(shí)候,如果編寫 5 個(gè)測試方法,進(jìn)而測試 5 種情況,是一件很麻煩的事情。
除此之外,還有一種通過構(gòu)造函數(shù)來綁定測試參數(shù)的編碼方式,大家可以根據(jù)比賽題目的要求分情況編碼即可。
@RunWith 實(shí)現(xiàn)用例套件化測試
測試套件意味著捆綁幾個(gè)單元測試用例并且一起執(zhí)行他們。在 JUnit 中,@RunWith 和 @Suite 注釋用來運(yùn)行套件測試。涉及到測注解
@RunWith(Suite.class)
3.2?Junit 測試方法執(zhí)行順序

寫 Junit 測試用例時(shí),有時(shí)候需要按照定義順序執(zhí)行我們的單元測試方法,比如如在測試數(shù)據(jù)庫相關(guān)的用例時(shí)候要按照測試插入、查詢、刪除的順序測試。如果不按照這個(gè)順序測試可能會(huì)出現(xiàn)問題。而JUnit測試時(shí)默認(rèn)的順序是隨機(jī)的。所以這時(shí)就需要有辦法要求 Junit 在執(zhí)行測試方法時(shí)按照我們指定的順序來執(zhí)行。
Junit 是通過 @FixMethodOrder 注解來控制測試方法的執(zhí)行順序的。@FixMethodOrder 注解的參數(shù)是 org.junit.runners.MethodSorters 對(duì)象, 在枚舉類org.junit.runners.MethodSorters 中 定義了如下三種順序類型:
MethodSorters.JVM(按照J(rèn)VM得到的方法順序,也就是代碼中定義的方法順序)
MethodSorters.DEFAULT(默認(rèn)的順序)
MethodSorters.NAME_ASCENDING(按方法名字母順序執(zhí)行)
3.3 Junit Rule

Junit 有了Rule,才使得有更多的擴(kuò)展性,能做更多的功能測試。@Rule的特點(diǎn)是:在一個(gè)class中所有的 @Test 標(biāo)注過的測試方法都會(huì)共享這個(gè)Rule,例如定義一個(gè)Timeout,所有方法運(yùn)行都會(huì)自動(dòng)檢測是否超時(shí)。
② TestName Rule
用于在測試執(zhí)行過程中獲取測試方法名稱。
③ ExternalResource Rule
ExternalResource 是一個(gè)規(guī)則(如TemporaryFolder)的基類,在測試前構(gòu)造外部資源(一個(gè)文件、套接字、服務(wù)器、數(shù)據(jù)庫連接等),并保證在測試后將資源釋放。

4.?斷言

斷言(assertion)是一種在程序中的一階邏輯(如,一個(gè)結(jié)果為真或假的邏輯判斷式),目的為了表示與驗(yàn)證軟件開發(fā)者預(yù)期的結(jié)果:當(dāng)程序執(zhí)行到斷言的位置時(shí),對(duì)應(yīng)的斷言應(yīng)該為真。若斷言不為真時(shí),程序會(huì)中止執(zhí)行,并給出錯(cuò)誤信息。
單元測試的題目中,往往會(huì)指定使用具體的斷言方法,考察的斷言方法不是在?org.junit.Assert 類中,那么就在?org.hamcrest.MatcherAssert 類中。
4.1 Junit 斷言

一般匹配符斷言:Junit 4 結(jié)合 Hamcrest 提供了一個(gè)全新的斷言語法——assertThat。測試人員可以只使用 assertThat 一個(gè)斷言語句,結(jié)合 Hamcrest 提供的匹配符,就可以表達(dá)全部的測試思想。