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