一,什么是單元測(cè)試敬扛?
單元測(cè)試是開發(fā)人員編寫的晰洒,驗(yàn)證目標(biāo)代碼正確性的代碼
當(dāng)編寫一個(gè)復(fù)雜邏輯的方法時(shí),驗(yàn)證方法的準(zhǔn)確性就需要到單元測(cè)試啥箭。
二谍珊,利用junit進(jìn)行單元測(cè)試
新建一個(gè)工程時(shí),我用的AS2.3已經(jīng)自動(dòng)幫我在主module配置好了Junit急侥,如果手動(dòng)加入的話砌滞,要加入Junit依賴
testCompile'junit:junit:4.12'
然后創(chuàng)建單元測(cè)試類
編寫測(cè)試方法侮邀,類先大概這樣寫:
方法加上@Test注解,這個(gè)是測(cè)試別的方法準(zhǔn)確性的方法贝润,接下來寫被測(cè)試方法绊茧,一般被測(cè)試方法具有很復(fù)雜的邏輯,但我現(xiàn)在的例子只是簡(jiǎn)單寫一個(gè)add方法打掘,就是一個(gè)加法:
int ?add(int ?a, int ?b) {
return ?a + b;
}
現(xiàn)在华畏,要驗(yàn)證這個(gè)加法方法的正確性,開始進(jìn)行真正的單元測(cè)試代碼編寫尊蚁,單元測(cè)試用到一個(gè)Junit的方法?
assertEquals(long ?expected, long ?actual)
先介紹這個(gè)方法亡笑,assertEquals的作用是判斷兩個(gè)值是否相等,該函數(shù)有兩個(gè)參數(shù)横朋,參數(shù)1為預(yù)期的值仑乌,參數(shù)2為計(jì)算得到的值,通過判斷兩個(gè)值是否相等得出結(jié)果叶撒,如果像個(gè)值相等那么測(cè)試通過绝骚,否則失敗。
繼續(xù)上面的加法例子祠够,可以這樣寫測(cè)試代碼:
public class ?ExampleUnitTest {
@Test
public void ?addition_isCorrect()throws ?Exception {
assertEquals(4,add(2,2));
}
int ?add(int ?a, int ?b) {
return ?a + b;
}
}
看assertEquals方法,第一個(gè)參數(shù)是期望值粪牲,第二個(gè)參數(shù)為add方法返回的結(jié)果古瓤,即是希望add(2,2)返回4
我們知道,這是正確的腺阳,先運(yùn)行一下落君,看看會(huì)發(fā)生什么,把光標(biāo)放到ExampleUnitTest類亭引,右鍵run ExampleUnitTest就可以了
這是運(yùn)行后的反應(yīng):
感覺什么都沒發(fā)生绎速,程序運(yùn)行后就正常退出了,那么把測(cè)試代碼改成這樣:
public class? ExampleUnitTest {
@Test
public void ?addition_isCorrect()throws ?Exception {
assertEquals(5,add(2,2));
}
int ?add(int? a, int? b) {
return? a + b;
}
}
assertEquals第一個(gè)參數(shù)期望值改為5焙蚓,再運(yùn)行纹冤,結(jié)構(gòu)如下圖:
運(yùn)行后,出現(xiàn)了錯(cuò)誤购公,并指出了錯(cuò)誤原因:
java.lang.AssertionError:
Expected :5
Actual? :4
它指出了期望值是5萌京,但得到的值是4,因此測(cè)試不通過宏浩。
一般針對(duì)一個(gè)方法編寫測(cè)試代碼時(shí)知残,都要編寫多個(gè)測(cè)試樣例,例如這樣:
assertEquals(0,add(0,0));
assertEquals(1,add(1,0));
assertEquals(2,add(1,1));
assertEquals(0,add(1,-1));
力求盡量覆蓋所有使用場(chǎng)景比庄,由此測(cè)試出來的代碼就有很好的容錯(cuò)性求妹。
三乏盐,Junit的斷言和失敗提示
上面以一個(gè)加法的例子簡(jiǎn)單說明了一個(gè)測(cè)試代碼的編寫和使用,現(xiàn)在介紹Junit的其它相關(guān)功能
單元測(cè)試是驗(yàn)證代碼的正確性制恍,Junit提供了多個(gè)斷言函數(shù)父能,就是以assert開頭的函數(shù),分別用來驗(yàn)證各類相等性問題吧趣。上面已經(jīng)介紹了
assertEquals就不繼續(xù)說明了法竞。還有如下幾類:
1.assertTrue 與assertFalse
assertTrue 與assertFalse是驗(yàn)證真與假,它只有一個(gè)Boolean類型參數(shù)强挫,當(dāng)參數(shù)與assert后面的true或者false對(duì)應(yīng)時(shí)則表示通過岔霸,否則失敗。例如
assertTrue(1==1),就會(huì)測(cè)試通過
2.assertNull與assertNotNull
與上面類似俯渤,assertNull與assertNotNull也只有一個(gè)參數(shù)呆细,但這個(gè)參數(shù)是Object類型,這兩個(gè)函數(shù)用于判斷對(duì)象是否為空或非空八匠,例如
assertNull(null)會(huì)測(cè)試通過絮爷,而assertNull(“12300”)則測(cè)試失敗,assertNotNull原理一樣梨树。
3.assertSame與assertNotSame
assertSame用于判斷兩個(gè)對(duì)象是否為同一個(gè)對(duì)象坑夯,assertNotSame是判斷兩個(gè)對(duì)象不是一個(gè)對(duì)象。
4.failNotEquals
該函數(shù)有三個(gè)參數(shù)抡四,第一個(gè)為失敗時(shí)的提示信息柜蜈,參數(shù)2為期望值旺入,參數(shù)3為實(shí)際值丹鸿,當(dāng)兩個(gè)對(duì)象不相等時(shí)拋出參數(shù)1的錯(cuò)誤信息窒朋,否側(cè)測(cè)試通過
5.failNotSame與failSame
他們參數(shù)一致曾我,不同的是failNotSame兩個(gè)對(duì)象不是同一個(gè)對(duì)象時(shí)拋出參數(shù)1的錯(cuò)誤信息扮匠,否則測(cè)試通過砰琢。
5.fail(String) 與fail()
fail(String)直接拋出當(dāng)前測(cè)試用例參數(shù)1的錯(cuò)誤信息厦酬,而fail()則會(huì)給出默認(rèn)的錯(cuò)誤信息融撞。
四勉耀。如何測(cè)試
測(cè)試是保證程序的準(zhǔn)確性指煎,要盡可能模擬各種條件來執(zhí)行程序確保各執(zhí)行路徑都被覆蓋。下面將列出一些重要的測(cè)試點(diǎn)
1.一致性
值是否和預(yù)期一致瑰排。
2.有序性
值是否像期望的那樣有序或無序
3.區(qū)間性
值是否位于合理的最小值和最大值之間贯要。
4.依賴性
代碼是否引用了一些不在代碼本身控制范圍之內(nèi)的外部資源。當(dāng)這些資源存在或不存在時(shí)代碼是否可以產(chǎn)生相應(yīng)的預(yù)期結(jié)果椭住。
5.存在性
值是否存在崇渗,測(cè)試方法是否可以處理值不存在的情況。
6.基數(shù)性
是否有剛好足夠的值,這里的基數(shù)是指計(jì)數(shù)宅广,測(cè)試方法是否可以準(zhǔn)確計(jì)數(shù)葫掉,并檢查最后的計(jì)數(shù)值
7.時(shí)間性
所以事情的發(fā)生是否有序,是否在準(zhǔn)確的時(shí)刻跟狱,是否剛好及時(shí)俭厚。