一劣砍、簡(jiǎn)介
? ? ? ?之前,簡(jiǎn)單的測(cè)試我都是使用print打印控制面板來(lái)實(shí)現(xiàn)查看方法是否實(shí)現(xiàn)了需要的功能,現(xiàn)在,使用junit4便可以直接進(jìn)行測(cè)試,并且不需要自己來(lái)進(jìn)行最終測(cè)試結(jié)果的判定,相比于打印似乎代碼多了,但是長(zhǎng)久來(lái)看,方便的不止那一點(diǎn)腿堤。
? ? ? ?Junit是XUnit的一個(gè)子集,在c++,paython,java語(yǔ)言中測(cè)試框架的名字都不相同姐帚,XUnit是基于測(cè)試驅(qū)動(dòng)的框架圾亏,衍生的產(chǎn)品有jUnit龄坪、pythonUnit砌庄、cppUnit等
? ? ? ?斷言機(jī)制:將程序預(yù)期的結(jié)果與程序運(yùn)行的最終結(jié)果進(jìn)行比對(duì),確保對(duì)結(jié)果的可預(yù)知性奕枢。
? ? ? ?hamcrest-core設(shè)置匹配集規(guī)則的框架娄昆,可用來(lái)增強(qiáng)junit的功能。
二缝彬、使用詳解
1萌焰、基本套路
1)導(dǎo)入jar(右鍵Build Path --> Add Libraries --> Junit --> Junit4)
2)新建測(cè)試類(lèi):右鍵需測(cè)試類(lèi)所在包new --> JUnit Test Case參照自動(dòng)生成的測(cè)試類(lèi)模板(可刪除),寫(xiě)自己的測(cè)試方法
3)運(yùn)行測(cè)試:測(cè)試文件右鍵--> Run as JUnit Test
4)Junit視圖:狀態(tài)條(綠色——測(cè)試成功谷浅;紅色——測(cè)試失敯歉)
5)assertEquals(得到的正確值(即預(yù)測(cè)值),程序得到的值);
2、JUnit規(guī)范
1)測(cè)試方法必須使用@Test進(jìn)行修飾
2)測(cè)試方法必須使用public
void進(jìn)行修飾一疯,不能帶任何參數(shù)
3)新建一個(gè)源代碼目錄來(lái)存放我們的測(cè)試代碼撼玄,一般使用test
4)測(cè)試類(lèi)的包應(yīng)該和被測(cè)試類(lèi)保持一致
5)測(cè)試單元中的每個(gè)方法必須可以獨(dú)立測(cè)試,測(cè)試方法間不能有任何的依賴(lài)
6)測(cè)試類(lèi)使用Test作為類(lèi)名的后綴:被測(cè)試類(lèi)名+Test.java.
7)測(cè)試方法使用test作為方法名的前綴:test+被測(cè)試方法名()
3墩邀、JUnit測(cè)試套件掌猛,批量生成測(cè)試方法
在測(cè)試目錄下直接新建測(cè)試用例Case,更改名稱(chēng)及測(cè)試類(lèi)以及源文件夾
4眉睹、測(cè)試失敗的兩種情況
測(cè)試用例用來(lái)達(dá)到想要的預(yù)期結(jié)果荔茬,但是對(duì)于邏輯錯(cuò)誤無(wú)能為力,也就是可以證明代碼沒(méi)有錯(cuò)竹海,但是不能證明代碼一定對(duì)
1)Failure一般由單元測(cè)試使用的斷言方法判斷失敗所引起慕蔚,這經(jīng)表示測(cè)試點(diǎn)發(fā)現(xiàn)了問(wèn)題,就是說(shuō)程序輸出的結(jié)果和我們預(yù)期的不一樣斋配。
2)error是由代碼異常所引起孔飒,它可以產(chǎn)生于測(cè)試代碼本身的錯(cuò)誤,也可以是被測(cè)試代碼中的一個(gè)隱藏的bug.
5艰争、Junit的運(yùn)行流程
在使用Junit用例新建測(cè)試類(lèi)的時(shí)候十偶,在配置選項(xiàng)中有四個(gè)可選方法
1)@BeforeClass修飾方法會(huì)在所有方法被調(diào)用前執(zhí)行,而且是靜態(tài)的园细,所以當(dāng)測(cè)試類(lèi)被夾在后接著就會(huì)被運(yùn)行惦积,而且在內(nèi)存中它只會(huì)存在一份實(shí)例,他比較適合加載配置文件猛频。
2)@AfterClass所修飾的方法同城用來(lái)對(duì)資源的清理狮崩,如關(guān)閉數(shù)據(jù)庫(kù)的連接
3)@Before和@After會(huì)在每個(gè)測(cè)試方法的最后各執(zhí)行一次
6蛛勉、JUnit常用注解
1)@Test將一個(gè)普通方法修飾成為一個(gè)測(cè)試方法,其包括兩個(gè)可選屬性
a:@Test(expected=異常類(lèi).class)忽略指定異常
b:@Test(timeout=毫秒)避免死循環(huán)睦柴,可以進(jìn)行性能測(cè)試诽凌,在指定時(shí)間內(nèi)進(jìn)行測(cè)試
2)@BeforeClass和@AfterClass會(huì)在所有方法運(yùn)行前/后各執(zhí)行一次,static修飾
3)@Before和@After會(huì)在每個(gè)測(cè)試方法的最后各執(zhí)行一次
4)Ignore所修飾的測(cè)試方法會(huì)被測(cè)試運(yùn)行期所忽略
5)RunWith:可以更改測(cè)試運(yùn)行器org.junit.runner.Runner,一般使用默認(rèn)
三坦敌、JUnit深入使用
1侣诵、JUnit測(cè)試套件使用
可以將所有被測(cè)試方法放到一個(gè)測(cè)試類(lèi)中,進(jìn)行批量運(yùn)行測(cè)試類(lèi)
1)測(cè)試套件就是組織測(cè)試類(lèi)一起運(yùn)行的
a)寫(xiě)一個(gè)作為測(cè)試套件的入口類(lèi)狱窘,這個(gè)類(lèi)不包含其他的方法杜顺,
b)更改測(cè)試運(yùn)行期Suite.class
c)將要測(cè)試的類(lèi)作為數(shù)組傳入到Suite.SuiteClasses({})中
2)例
@RunWith(Suite.class)
@Suite.SuiteClasses({TaskTest1.class,TaskTest2.class,TaskTest3.class})
public class SuiteTest{}
2、JUnit參數(shù)化設(shè)置
是為了解決蘸炸,同樣的測(cè)試類(lèi)中的測(cè)試方法針對(duì)多組測(cè)試數(shù)據(jù)時(shí)的優(yōu)化躬络,編寫(xiě)好對(duì)應(yīng)的代碼,就不用來(lái)來(lái)會(huì)會(huì)的運(yùn)行搭儒、改寫(xiě)同樣的測(cè)試代碼(僅僅為了測(cè)試不同的數(shù)據(jù))
1)步驟:
a)更改默認(rèn)的測(cè)試運(yùn)行器為RunWith(Parameterized.class)
b)聲明變量來(lái)存放預(yù)期值和結(jié)果值
c)聲明一個(gè)返回值為Collection的公共靜態(tài)方法穷当,并使用@Parameters修飾
d)為測(cè)試類(lèi)生命一個(gè)帶有參數(shù)的公共構(gòu)造函數(shù),并在其中位置聲明變量賦值
2)例
@RunWith(Parameterized.class)
public class ParameterTest {
int expected = 0;int input1 = 0;int input2 = 0;
@Parameters
public static Collection t() {
return Arrays.asList(new Object[][]{
{3,1,2},{4,2,2} });}
public ParameterTest (int expected,int input1, int input2) {
this.expected = expected;
this.input1 = input1;this.input2 = input2;}
@Test
public void testAdd(){
assertEquals(expected,new Calculate().add(input1, input2));
}}
四淹禾、總結(jié)
1馁菜、@Test
2、@Test(Timeout=毫秒)铃岔,@Test(expected=異常類(lèi))
3火邓、@Ignore
4、@RunWith
5德撬、@BeforeClass @AfterClass @Before @After
6铲咨、測(cè)試套件@RunWith(Suite.class)
7、參數(shù)化設(shè)置@RunWith(Parameterized.class)