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