近期寫(xiě)單元測(cè)試計(jì)劃,公司把junit3.8升級(jí)到j(luò)unit4以上的版本,所以研究了一下,寫(xiě)下學(xué)習(xí)過(guò)程和心得體會(huì),為了鞏固學(xué)習(xí)成果,所以把學(xué)習(xí)心得寫(xiě)下來(lái)加深印象,也供需要的朋友查閱,少走彎路。
好了,廢話不多說(shuō),直接開(kāi)始:
假設(shè)我們要寫(xiě)一個(gè)整數(shù)除法和乘法的類(lèi),并且給他寫(xiě)測(cè)試用例:
1) 建立Math類(lèi)
工具是eclipse3.3
Java代碼
/**
* @author bulargy.j.bai
* @創(chuàng)建時(shí)間:Mar 10, 2008
* @描述:一個(gè)整數(shù)除法和乘法的工具類(lèi)
*/
public class Math {
public static int divide(int x,int y) {
return x/y;
}
public static int multiple(int x,int y) {
return x*y;
}
}
/**
* @author bulargy.j.bai
* @創(chuàng)建時(shí)間:Mar 10, 2008
* @描述:一個(gè)整數(shù)除法和乘法的工具類(lèi)
*/
public class Math {
public static int divide(int x,int y) {
return x/y;
}
public static int multiple(int x,int y) {
return x*y;
}
}
2) 建立測(cè)試用例
選中需要建立測(cè)試用例的包,選擇new->other->JUnit Test Case。
有5個(gè)方法可以選擇:
setUp()方法在測(cè)試方法前調(diào)用,一般用來(lái)做測(cè)試準(zhǔn)備工作。
tearDown()方法在測(cè)試方法后調(diào)用,一般作測(cè)試的清理工作。
setUpBeforeClass()方法在整個(gè)類(lèi)初始化之后調(diào)用,一般用來(lái)做測(cè)試準(zhǔn)備工作。
tearDownAfterClass()方法在整個(gè)類(lèi)結(jié)束之前調(diào)用,一般作測(cè)試的清理工作。
constructor()為是否包含構(gòu)造方法。
自動(dòng)生成的代碼如下:
Java代碼
/**
* @author bulargy.j.bai
* @創(chuàng)建時(shí)間:Mar 11, 2008
* @描述:
*/
public class MathTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
@Test
public void testDivide() {
fail("Not yet implemented");
}
@Test
public void testMultiple() {
fail("Not yet implemented");
}
}
/**
* @author bulargy.j.bai
* @創(chuàng)建時(shí)間:Mar 11, 2008
* @描述:
*/
public class MathTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
@Test
public void testDivide() {
fail("Not yet implemented");
}
@Test
public void testMultiple() {
fail("Not yet implemented");
}
}
說(shuō)明:
@BeforeClass標(biāo)簽注釋的方法用于在整個(gè)類(lèi)測(cè)試過(guò)程的初始化后調(diào)用一次,@AfterClass標(biāo)簽注釋的方法則是整個(gè)測(cè)試類(lèi)結(jié)束之前調(diào)用一次。這2個(gè)標(biāo)簽的搭配可以避免使用@Before、@After標(biāo)簽組合在每個(gè)測(cè)試方法前后都調(diào)用的弊端,減少系統(tǒng)開(kāi)銷(xiāo),提高系統(tǒng)測(cè)試速度。(不過(guò)對(duì)環(huán)境獨(dú)立性要求較高的測(cè)試還是應(yīng)當(dāng)使用@Before、@After來(lái)完成)
@Test標(biāo)簽用來(lái)標(biāo)注待測(cè)試的方法,按照類(lèi)中聲明的順序執(zhí)行。
我們?cè)趖estDivide方法加入測(cè)試代碼,分別測(cè)試三種情況:
a. 完全正確也沒(méi)有可能出錯(cuò)的數(shù)據(jù),如:9除3 結(jié)果必須等于3
b. 可能有問(wèn)題的邊緣數(shù)據(jù),如:10除3 結(jié)果也必須等于3
c. 錯(cuò)誤的數(shù)據(jù),如:10除0 必須拋出異常
忽略testMultiple方法
代碼如下:
Java代碼
@Test(expected=ArithmeticException.class)
public void testDivide() {
assertEquals(3,Math.divide(9,3));
assertEquals(3,Math.divide(10,3));
Math.divide(10,0); //除數(shù)不能為0,會(huì)拋出異常
}
@Ignore("忽略乘法測(cè)試")
@Test
public void testMultiple() {
}
@Test(expected=ArithmeticException.class)
public void testDivide() {
assertEquals(3,Math.divide(9,3));
assertEquals(3,Math.divide(10,3));
Math.divide(10,0); //除數(shù)不能為0,會(huì)拋出異常
}
@Ignore("忽略乘法測(cè)試")
@Test
public void testMultiple() {
}
說(shuō)明:
Junit4為測(cè)試方法增加了判斷異常的方式,避免了以前還要通過(guò)try/catch塊捕捉異常再拋出的復(fù)雜方式,簡(jiǎn)單的這樣聲明“@Test(expected=ArithmeticException.class)”Junit4會(huì)檢查此方法是否拋出ArithmeticException異常,如果拋出則測(cè)試通過(guò),沒(méi)拋出則測(cè)試不通過(guò)(@Test標(biāo)簽還有一些其他參數(shù),例如超時(shí)測(cè)試@Test(timeout=1)這樣,但是由于并不能準(zhǔn)確反應(yīng)實(shí)際時(shí)間,所以應(yīng)用較少,經(jīng)過(guò)我測(cè)試誤差太大不適合拿來(lái)做超時(shí)測(cè)試的)
@Ignore標(biāo)簽會(huì)告訴Junit4忽略它所標(biāo)注的方法,例如數(shù)據(jù)庫(kù)不可用時(shí)可以用此標(biāo)注標(biāo)注一些測(cè)試數(shù)據(jù)庫(kù)連接的方法來(lái)避免測(cè)試失敗。