爲什麼要使用測試工具
①測試框架可以幫助我們對編寫的程序進行有目的地測試,幫助我們最大限度地避免代碼中的bug,以保證系統的正確性和穩定性。
②很多人對自己寫的代碼,測試時就簡單寫main,然後sysout輸出控制檯觀察結果。這樣非常枯燥繁瑣,不規範。缺點:測試方法不能一起運行,測試結果要程序猿自己觀察纔可以判斷程序邏輯是否正確。
③JUnit的斷言機制,可以直接將我們的預期結果和程序運行的結果進行一個比對,確保對結果的可預知性。
創建簡單業務類
使用Eclipse創建一個項目,導入JUnit相關包,因爲eclipse集成了JUnit框架,所以可以直接右鍵項目,選擇Build Path → 點擊Add Libraries → 選擇JUnit → 點擊Next,選擇JUnit版本,然後Finish。(其實也可以下載jar包作爲用戶庫來添加)
創建被測試類:Calculate
public class Calculate {
public int add(int a,int b){
return a+b;
}
public int substract(int a , int b){
return a-b;
}
public int multiple(int a,int b){
return a*b;
}
public int divide(int a,int b){
return a/b;
}
}
創建測試類:CalculateTest (new一個junit test case然後修改類名finish)
public class CalculateTest {
@Test
public void testAdd(){
assertEquals(6, new Calculate().add(3, 3));
}
}
這樣就可以run as junit進行測試
完善測試代碼,junit4最佳實踐
測試代碼不應與項目代碼放在一起,因爲它不應出現在最後的產品中
可以放於與src平行的新建的sourceFolder test中
建議在每個測試方法中加上test
但當需要測試的方法很多時,一個個的敲就不現實。這在創建junit時不點finish而點next可以選擇要測試的方法或要測試的所有類方法
注意事項:1、測試方法上必須使用@Test進行修飾(junit4)
2、測試方法必須使用public void 進行修飾 且不能帶任何參數
3、新建一個源代碼目錄來存放我們的測試代碼
4、測試類的包應該和被測試類保持一致
5、測試單元中的每個方法必須可以獨立測試,測試方法間不能有任何依賴
6、測試類使用test作爲方法名前綴(不是必須)
7、測試類使用Test作爲類名的後綴(不是必須)
測試失敗的兩種情況
1、Failure一般由單元測試使用的斷言方法判斷失敗所引起的,這表示測試點發現了問題,就是說程序輸出的結果和我們語氣的不一樣
2、Error是由代碼異常引起的,它可以產生於測試代碼本身的錯誤,也可以是被測試代碼中的一個隱藏的bug,如測試一個除法的方法,給除數設置爲0
3、測試用例不是用來證明你是對的,而是用來證明你沒有錯。測試用例用來達到想要的語氣結果,但對於邏輯錯誤無能爲力(例如只能判斷你計算的長方形面積是否正確,而不能判斷你使用的是長方形面積公式還是周長公式)
junit運行流程(在new junit test case 時會有添加方法的複選框可以添加BeforeClass、Before、、After、AfterClass)
1、依次爲BeforeClass、Before、測試代碼(如testAdd)、After、AfterClass
2、BeforeClass是靜態的,比較適合加載配置文件,而AfterClass通常用來對資源的清理,如關閉數據庫的鏈接
3、Before和after會在每個測試方法的前後各執行一次
Junit中常用註解
1、Test屬性Test(expected=ArithmeticException.class)(expected=XX.class)捕獲可能拋出的異常 (timeout=毫秒)定義測試代碼執行的時間,避免測試時出現死循環問題;也可對性能進行測試,如判斷讀取文件的時間是否在限定範圍內。
2、@Ingore所修飾的測試方法會被測試運行器忽略
3、RunWith可以更改測試運行器org.junit.runner.Runner
可靜態導如Assert類靜態方法根據api選擇想要的斷言方法
深入使用
1、junit4測試套件
可以將所有的測試類集合在一個測試套件中,這樣每次驗證系統功能的時候,只需要執行一次測試套件即可。
如何使用:
·測試套件是一個空類(不包含其他方法),而且是public修飾的
·添加類註解:@RunWith(Suite.class)//更改測試類運行器
@Suite.SuiteClasses({TaskTest1.class,TaskTest2.class,TaskTest3.class}) 將要測試的類以數組形式傳入各測試類的class對象
2、junit4的參數化設置
@RunWith(Parameterized.class)
public class ParameterTest{
//1、更改默認的測試運行器爲RunWith(Parameterized.class)
//2、聲明變量來存放預期值和結果值
//3、聲明一個返回值爲Collection的公共靜態方法,並使用@Parameters進行修飾
//4、爲測試類聲明一個帶有參數的公共構造函數,並在其中爲之前聲明的變量賦值
Int expected = 0;
Int input1 = 0;
Int input2 = 0;
@Parameters
Public static Collection<Object[]> 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 = inpu2;
}
@Test
Public void testAdd(){
assertEquals(expected,new Calculate().add(input1,input2));
}
}
Class Calculate{
Public int add(int a,int b){
Return a+b;
}
}