項(xiàng)目工程基于Idea IDE創(chuàng)建,其對(duì)JUnit對(duì)支持非常不錯(cuò),寫(xiě)單元測(cè)試類(lèi)也非常方便,直接使用快捷鍵Ctrl+Shift+T即可自動(dòng)生成相應(yīng)的單元測(cè)試類(lèi)模板,使用快捷鍵Alt+Insert可直接添加新增的單元測(cè)試方法;另外本項(xiàng)目使用Gradle進(jìn)行依賴(lài)管理。
為什么做單元測(cè)試:
1.幫助理解需求
單元測(cè)試應(yīng)該反映Use Case,把被測(cè)單元當(dāng)成黑盒測(cè)試其外部行為。
2.提高實(shí)現(xiàn)質(zhì)量
單元測(cè)試不保證程序做正確的事,但能幫助保證程序正確地做事,從而提高實(shí)現(xiàn)質(zhì)量。
3.測(cè)試成本低
相比集成測(cè)試、驗(yàn)收測(cè)試,單元測(cè)試所依賴(lài)的外部環(huán)境少,自動(dòng)化程度高,時(shí)間短,節(jié)約了測(cè)試成本。
4.反饋速度快
單元測(cè)試提供快速反饋,把bug消滅在開(kāi)發(fā)階段,減少問(wèn)題流到集成測(cè)試、驗(yàn)收測(cè)試和用戶(hù),降低了軟件質(zhì)量控制的成本。
5.利于重構(gòu)
由于有單元測(cè)試作為回歸測(cè)試用例,有助于預(yù)防在重構(gòu)過(guò)程中引入bug。
6.文檔作用
單元測(cè)試提供了被測(cè)單元的使用場(chǎng)景,起到了使用文檔的作用。
7.對(duì)設(shè)計(jì)的反饋
一個(gè)模塊很難進(jìn)行單元測(cè)試通常是不良設(shè)計(jì)的信號(hào),單元測(cè)試可以反過(guò)來(lái)指導(dǎo)設(shè)計(jì)出高內(nèi)聚、低耦合的模塊。
JUnit簡(jiǎn)介
JUnit 是一個(gè) Java 編程語(yǔ)言的單元測(cè)試框架。JUnit 在測(cè)試驅(qū)動(dòng)的開(kāi)發(fā)方面有很重要的發(fā)展,是起源于 JUnit 的一個(gè)統(tǒng)稱(chēng)為 xUnit 的單元測(cè)試框架之一。
單元測(cè)試規(guī)范
1.單元測(cè)試類(lèi)后面加Test;
2.測(cè)試方法使用@Test標(biāo)注;
3.測(cè)試方法名之前加test;
4.所有測(cè)試方法返回類(lèi)型必須為void且無(wú)參數(shù);
5.每個(gè)測(cè)試方法之間相互獨(dú)立;
JUnit4常用注解
@Test:把一個(gè)方法標(biāo)記為測(cè)試方法
它有兩個(gè)常用屬性:
1.excepted屬性是用來(lái)測(cè)試異常;
2.timeout用來(lái)測(cè)試性能的,是測(cè)試一個(gè)方法能不能在規(guī)定時(shí)間內(nèi)完成;
也可使用@Rule規(guī)則來(lái)規(guī)定測(cè)試類(lèi)中的所有方法的超時(shí)時(shí)間,如果類(lèi)中的任意一個(gè)方法執(zhí)行時(shí)間超過(guò)了在Timeout規(guī)則中規(guī)定的值,測(cè)試方法將拋出異常,測(cè)試結(jié)果為失敗(超時(shí)參數(shù)是以毫秒記)。如:
@Rule
public Timeout timeout = new Timeout(1000);
@Before:每一個(gè)測(cè)試方法執(zhí)行前自動(dòng)調(diào)用一次;
@After:每一個(gè)測(cè)試方法執(zhí)行完自動(dòng)調(diào)用一次;
@BeforeClass:所有測(cè)試方法執(zhí)行前執(zhí)行一次,在測(cè)試類(lèi)還沒(méi)有實(shí)例化已經(jīng)被加載,所以用static修飾;
@AfterClass:所有測(cè)試方法執(zhí)行完執(zhí)行一次,在測(cè)試類(lèi)還沒(méi)有實(shí)例化已經(jīng)被加載,所以用static修飾;
@Ignore:禁止執(zhí)行junit測(cè)試類(lèi)的某些或者全部測(cè)試方法,應(yīng)用在方法或類(lèi)上;
public class AnnotationTest {
int i;
public AnnotationTest(){
System.out.println("構(gòu)造方法");
}
@BeforeClass
public static void setUpBeforClass(){
System.out.println("BeforClass");
}
@AfterClass
public static void tearDownAfterClass(){
System.out.println("AfterClass");
}
@Before
public void setUp(){
System.out.println("Before");
}
@After
public void tearDown(){
System.out.println("After");
}
@Test
public void test1(){
System.out.println("Test1");
System.out.println("i="+i++);
}
@Test
public void test2(){
System.out.println("Test2");
System.out.println("i="+i++);
}
@Ignore
public void test3(){
System.out.println("Test3");
}
}
輸出結(jié)果:
BeforClass
構(gòu)造方法
Before
Test2
i=0
After
AfterClass