JUnit的基本使用
一些關于單元測試的理念:
單元測試并不能證明你的代碼是正確的,只能證明你的代碼是沒有錯誤的。
Keep bar green and keep your code cool
關于JUnit的兩種最基本的使用步驟
第一種方式<4.0的JUnit版本
1、 在已經編寫好的項目中新建一個package用于單元測試。
2、 要在buildpath中加入JUnit對應的包。
3、 新建一個類,比如unitTest
4、 當前的類需要繼承Test類,需要導入一下的一些包:
import static org.junit.Assert.*;
import junit.framework.TestCase;
import org.junit.Test;
5、 編寫自己的測試函數,可以編寫多個,感覺上每個函數都相當于一個main方法,要注意的是需要用來執行的函數都要以test開頭。
6、 在對應的測試類上點擊Run as 之后點擊JUnit Test 就可以執行對應的test開頭的方法了。
第二種方式>=4.0的JUnit版本
1、 這種方式是基于注解來進行的,先要加上對應的包import org.junit.Test,其他的就不用加了。
2、 類名不需要繼承TestCase,測試方法也不需要以test開頭。
3、 只需要在方法的前面加上@Test的注解,之后 Run as—>JUnit test這樣就會自動對加了注解的方法進行測試。
使用注解的方式還是比較推薦的,最好在利用注解的時候方法名也能與之前的保持一致,這樣就能與4.0版本之前的JUnit兼容了。
這種方式的大致原理還是利用反射,先獲得Class類實例,之后利用getMethods方法得到這個類的所有的方法,之后遍歷這個方法,判斷每個方法是否加上了@Test注解,如果加上了注解,就執行。大多數框架內部都是依靠反射來進行的。實際情況中還是比較推薦使用注解的,還有一些常用的注解,比如:@Before @After這兩個分別表示方法(@Test之后的)執行之前要執行的部分,以及方法執行之后要執行的部分,注意這里每個被@Test標注過的方法在執行之前與執行之后都要執行@Before以及@After標注過的方法,因此被這兩個注解標記過的方法可能會執行多次。
對于@BeforeClass以及@AfterClass顧名思義就表示在整個測試類執行之前與執行之后要執行的方法,被這兩個注解標記過的方法在整個類的測試過程中只是執行一次。
還有一個常用到的方法是Assert.assertEquals方法,表示預期的結果是否與實際出現的結果是否一致,可以有三個參數,第一個參數表示不一致時候的報錯信息,第二個參數表示期望的結果,第三個參數表示實際的結果。
還有一部分是關于組合模式的使用,比如寫了好多的測試類,ATest BTest ....總不能一個一個點,能一起讓這些測試類都運行起來就是最好不過了,這時候要使用到兩個注解:@RunWith(Suite.class)以及@SuiteClasses({ xxTest.class,xxTest.class })
當然JUnit的整個過程中還涉及到了許多經典的設計模式,這個再進一步進行分析。
下面是一個實際的例子,展示一下常見的幾個注解的使用:
//一個簡單的Student類以及一個Teacher類 輸出其基本信息 package com.test.unittest; public class Student { int id; int age; String name; public Student(int id, int age, String name) { super(); this.id = id; this.age = age; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } |
public String getName() { return name; } public void setName(String name) { this.name = name; } public void info() { System.out.println("the stu info:"+this.age+" "+this.id+" "+this.name); } } package com.test.unittest; public class Teacher { String tname; String tage; public Teacher(String tname, String tage) { super(); this.tname = tname; this.tage = tage; } public String getTname() { return tname; } public void setTname(String tname) { this.tname = tname; } public String getTage() { return tage; } public void setTage(String tage) { this.tage = tage; } public void info(){ System.out.println("the teacher info:"+this.tage+" " +this.tname); } } |
后面這部分就是對兩個類進行的單元測試以及一個組合方式的使用
package com.Unittest; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.test.unittest.Student; public class StudentTest { Student stu=new Student(1,23,"令狐沖"); @Before public void setUp(){ System.out.println("Student Initial"); } @Test public void infoTest() { stu.info(); } @After public void tearDown(){ System.out.println("Student Destroy"); } } package com.Unittest; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.test.unittest.Teacher; public class TeacherTest { Teacher teacher=new Teacher("風清揚","90"); @Before public void setUp(){ System.out.println("Teacher Initial"); } @Test public void infoTest() { teacher.info(); } @After public void tearDown(){ System.out.println("Teacher Destroy"); } } package com.Unittest; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; import com.test.unittest.Student; @RunWith(Suite.class) @SuiteClasses({StudentTest.class,TeacherTest.class}) public class AllTest { } /*輸出的結果如下: Student Initial the stu info:23 1 令狐沖 Student Destroy Teacher Initial the teacher info:90 風清揚 Teacher Destroy */ |
補充說明:
寫作業的時候把測試類一個一個手敲進去,真是太out了,還是用eclipse中自帶的生成JUnit test的類比較好一點,直接在測試的那個package下面,創建一個新的JUnit Test Class 選定版本以及選定class under test 這個表示你希望生成哪一個類的測試類,這樣生成的測試類中命名也比較規范,比如相同的方法名不同參數的方法,連參數類型都寫上去了,比以前直接用a b c d...1 2 3 4....來區別同名的方法正規多了....
posted on 2014-11-21 09:13 順其自然EVO 閱讀(212) 評論(0) 編輯 收藏 所屬分類: 測試學習專欄