Junit4單元測試

要點:   

       註解  斷言  參數化  套件(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 })

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章