JUnit的基本使用
一些關(guān)于單元測(cè)試的理念:
單元測(cè)試并不能證明你的代碼是正確的,只能證明你的代碼是沒(méi)有錯(cuò)誤的。
Keep bar green and keep your code cool
關(guān)于JUnit的兩種最基本的使用步驟
第一種方式<4.0的JUnit版本
1、 在已經(jīng)編寫(xiě)好的項(xiàng)目中新建一個(gè)package用于單元測(cè)試。
2、 要在buildpath中加入JUnit對(duì)應(yīng)的包。
3、 新建一個(gè)類(lèi),比如unitTest
4、 當(dāng)前的類(lèi)需要繼承Test類(lèi),需要導(dǎo)入一下的一些包:
import static org.junit.Assert.*;
import junit.framework.TestCase;
import org.junit.Test;
5、 編寫(xiě)自己的測(cè)試函數(shù),可以編寫(xiě)多個(gè),感覺(jué)上每個(gè)函數(shù)都相當(dāng)于一個(gè)main方法,要注意的是需要用來(lái)執(zhí)行的函數(shù)都要以test開(kāi)頭。
6、 在對(duì)應(yīng)的測(cè)試類(lèi)上點(diǎn)擊Run as 之后點(diǎn)擊JUnit Test 就可以執(zhí)行對(duì)應(yīng)的test開(kāi)頭的方法了。
第二種方式>=4.0的JUnit版本
1、 這種方式是基于注解來(lái)進(jìn)行的,先要加上對(duì)應(yīng)的包import org.junit.Test,其他的就不用加了。
2、 類(lèi)名不需要繼承TestCase,測(cè)試方法也不需要以test開(kāi)頭。
3、 只需要在方法的前面加上@Test的注解,之后 Run as—>JUnit test這樣就會(huì)自動(dòng)對(duì)加了注解的方法進(jìn)行測(cè)試。
使用注解的方式還是比較推薦的,最好在利用注解的時(shí)候方法名也能與之前的保持一致,這樣就能與4.0版本之前的JUnit兼容了。
這種方式的大致原理還是利用反射,先獲得Class類(lèi)實(shí)例,之后利用getMethods方法得到這個(gè)類(lèi)的所有的方法,之后遍歷這個(gè)方法,判斷每個(gè)方法是否加上了@Test注解,如果加上了注解,就執(zhí)行。大多數(shù)框架內(nèi)部都是依靠反射來(lái)進(jìn)行的。實(shí)際情況中還是比較推薦使用注解的,還有一些常用的注解,比如:@Before @After這兩個(gè)分別表示方法(@Test之后的)執(zhí)行之前要執(zhí)行的部分,以及方法執(zhí)行之后要執(zhí)行的部分,注意這里每個(gè)被@Test標(biāo)注過(guò)的方法在執(zhí)行之前與執(zhí)行之后都要執(zhí)行@Before以及@After標(biāo)注過(guò)的方法,因此被這兩個(gè)注解標(biāo)記過(guò)的方法可能會(huì)執(zhí)行多次。
對(duì)于@BeforeClass以及@AfterClass顧名思義就表示在整個(gè)測(cè)試類(lèi)執(zhí)行之前與執(zhí)行之后要執(zhí)行的方法,被這兩個(gè)注解標(biāo)記過(guò)的方法在整個(gè)類(lèi)的測(cè)試過(guò)程中只是執(zhí)行一次。
還有一個(gè)常用到的方法是Assert.assertEquals方法,表示預(yù)期的結(jié)果是否與實(shí)際出現(xiàn)的結(jié)果是否一致,可以有三個(gè)參數(shù),第一個(gè)參數(shù)表示不一致時(shí)候的報(bào)錯(cuò)信息,第二個(gè)參數(shù)表示期望的結(jié)果,第三個(gè)參數(shù)表示實(shí)際的結(jié)果。
還有一部分是關(guān)于組合模式的使用,比如寫(xiě)了好多的測(cè)試類(lèi),ATest BTest ....總不能一個(gè)一個(gè)點(diǎn),能一起讓這些測(cè)試類(lèi)都運(yùn)行起來(lái)就是最好不過(guò)了,這時(shí)候要使用到兩個(gè)注解:@RunWith(Suite.class)以及@SuiteClasses({ xxTest.class,xxTest.class })
當(dāng)然JUnit的整個(gè)過(guò)程中還涉及到了許多經(jīng)典的設(shè)計(jì)模式,這個(gè)再進(jìn)一步進(jìn)行分析。
下面是一個(gè)實(shí)際的例子,展示一下常見(jiàn)的幾個(gè)注解的使用:
//一個(gè)簡(jiǎn)單的Student類(lèi)以及一個(gè)Teacher類(lèi) 輸出其基本信息 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); } } |
后面這部分就是對(duì)兩個(gè)類(lèi)進(jìn)行的單元測(cè)試以及一個(gè)組合方式的使用
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("風(fēng)清揚(yáng)","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 { } /*輸出的結(jié)果如下: Student Initial the stu info:23 1 令狐沖 Student Destroy Teacher Initial the teacher info:90 風(fēng)清揚(yáng) Teacher Destroy */ |
補(bǔ)充說(shuō)明:
寫(xiě)作業(yè)的時(shí)候把測(cè)試類(lèi)一個(gè)一個(gè)手敲進(jìn)去,真是太out了,還是用eclipse中自帶的生成JUnit test的類(lèi)比較好一點(diǎn),直接在測(cè)試的那個(gè)package下面,創(chuàng)建一個(gè)新的JUnit Test Class 選定版本以及選定class under test 這個(gè)表示你希望生成哪一個(gè)類(lèi)的測(cè)試類(lèi),這樣生成的測(cè)試類(lèi)中命名也比較規(guī)范,比如相同的方法名不同參數(shù)的方法,連參數(shù)類(lèi)型都寫(xiě)上去了,比以前直接用a b c d...1 2 3 4....來(lái)區(qū)別同名的方法正規(guī)多了....
posted on 2014-11-21 09:13 順其自然EVO 閱讀(213) 評(píng)論(0) 編輯 收藏 所屬分類(lèi): 測(cè)試學(xué)習(xí)專欄