要點:
註解 斷言 參數化 套件(testSuite)
一、引入Junit4單元測試框架
項目上單擊右鍵->new->other->JUnit->Junit Test Case->Next->New Juint 4 test ->Name->setup->teardown->Class Under Test->Next->勾選你要測試的函數 ->Finish->提示引入JUnit庫->Finish
二、簡單的實例代碼
1.被測試類:
1 package com.zhang.java; 2 3 public class LoginSample { 4 public LoginSample() { //構造方法 5 System.out.println("構造方法被調用!"); 6 } 7 8 public boolean login(String ln, String pwd) { 9 if (ln != null && ln.length() > 2 && ln.length() < 17 && pwd != null && pwd.length() > 2 && pwd.length() < 17) { 10 if (ln.equals("zzp") && pwd.equals("123456")) { 11 System.out.println("恭喜您,登錄成功!"); 12 return true; 13 } else { 14 System.out.println("用戶名或密碼錯誤!"); 15 } 16 } else { 17 System.out.println("參數錯誤!"); 18 } 19 return false; 20 } 21 22 }
2、測試類代碼:
1 package com.zhang.java; 2 3 import static org.junit.Assert.*; 4 5 import org.junit.After; 6 import org.junit.AfterClass; 7 import org.junit.Before; 8 import org.junit.BeforeClass; 9 import org.junit.Test; 10 11 public class LoginSampleTest { 12 13 /** 14 * BeforeClass和Before做測試環境的初始化; 15 * AfterClass和After做數據的清理掃尾工作(如關閉數據庫連接) 16 */ 17 18 private LoginSample login; 19 20 //在測試類執行之前執行的方法 21 @BeforeClass 22 public static void setUpBeforeClass() throws Exception { 23 System.out.println("@BeforeClass方法被執行"); 24 } 25 26 //在測試類執行之後執行的方法 27 @AfterClass 28 public static void tearDownAfterClass() throws Exception { 29 System.out.println("@AfterClass方法被執行"); 30 } 31 32 @Before 33 public void setUp() throws Exception { 34 System.out.println("@Before被調用%%%%%%%%%%%%"); 35 login = new LoginSample(); 36 } 37 38 @After 39 public void tearDown() throws Exception { 40 System.out.println("@After被調用&&&&&&&&&&&&&&&&&"); 41 } 42 43 //在一個測試類中可以有多個@test註解的測試方法 44 @Test 45 public void testLogin() { 46 System.out.println("testLogin()方法被調用"); 47 // fail("Not yet implemented"); 48 boolean result = login.login("zzp", "123456"); 49 if(result) 50 System.out.println("測試通過!"); 51 else 52 fail("測試失敗!"); //用到測試框架的斷言fail()方法 53 54 System.out.println("==========="); 55 } 56 57 }
測試類運行結果:
@BeforeClass方法被執行 @Before被調用%%%%%%%%%%%% 構造方法被調用! testLogin()方法被調用 恭喜您,登錄成功! 測試通過! =========== @After被調用&&&&&&&&&&&&&&&&& @AfterClass方法被執行
三、補充說明
四、Junit參數化數據驅動
1、相關注解:
@RunWith(Parameterized.class):註解JUnit測試類,指定該測試類使用參數化方式運行,要寫在測試類外面(不是類裏面);
@Parameters:生成並返回測試數據,一般使用Object[][]二位數組來接收數據返回。該方法必須是靜態方法,因爲要在測試方法運行之前生成測試數據。
2、相關方法:
在JUnit參數化的類中,需要有一個構造方法,用於存儲和傳遞測試數據。 由@Parameters註解的靜態方法,是一個Collection或者Iterator,生成並返回測試數據。
構造方法需要用對應的參數列表接收數據。 這樣,數據將被傳遞到@Test註解的測試方法,逐條進行測試,直到集合中不再有元素爲止。
3、代碼展示
a、被測試類代碼
1 package com.zhang.java; 2 3 public class Plus { 4 5 public int Sum(int x, int y) { 6 int result=x+y; 7 return result; 8 } 9 10 }
b、單元測試用例代碼
1 package com.zhang.java; 2 3 import static org.junit.Assert.*; 4 import org.junit.Before; 5 import org.junit.Test; 6 import org.junit.runner.RunWith; 7 import org.junit.runners.Parameterized; 8 import org.junit.runners.Parameterized.Parameters; 9 10 //寫在測試類前,表示該測試類用參數化形式運行。 11 @RunWith(Parameterized.class) 12 public class PlusTest { 13 14 //用成員變量接收來自parameter方法生成的數據 15 //測試名 16 public String caseName; 17 //測試預期結果 18 public String exResult; 19 //測試用到的數據 20 public int firstNum; 21 public int secondNum; 22 private Plus p; 23 24 //測試前的準備,初始化被測試類。 25 @Before 26 public void setUp() throws Exception { 27 p=new Plus(); 28 } 29 30 //構造函數用於接收數據parameter的數據,並給成員變量賦值。 31 public PlusTest(String input1,String input2,int input3 ,int input4) { 32 caseName=input1; 33 exResult=input2; 34 firstNum=input3; 35 secondNum=input4; 36 } 37 38 @Parameters(name="{0},res:{1},operater:sum({2}+{3})") 39 public static Object[][] setData(){ 40 return new Object[][] { 41 {"左邊界-1","-2147483649",-2147483648,-1}, //Object[0][] 42 {"左邊界+0","-2147483648",-2147483648,0}, //Object[1][] 43 {"左邊界+1","-2147483647",-2147483648,1} //Object[2][] 44 }; 45 } 46 47 //每一條數據都會用於執行一次@Test測試方法 48 @Test 49 public void testSumIntInt() { 50 System.out.println(caseName); 51 //用到的方法: 52 //void org.junit.Assert.assertEquals(String message, Object expected, Object actual) 53 assertEquals(caseName,exResult, Integer.toString(p.Sum(firstNum, secondNum))); 54 } 55 56 }
運行後的結果
左邊界-1 左邊界+0 左邊界+1
五、TestSuite測試套件
創建方法:
在包含JUnit4 case的包中右鍵->new->other->JUnit->Junit Test Suite>Next ->New JUnit4 Suite->Name->選擇你需要執行的Case->Finish。
添加case:
在@SuiteClasses註解中指定要執行的case,以classname.class的形式添加,如下:
@SuiteClasses({ JUnit4.class })