qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

          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í)專欄

          <2014年11月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類(lèi)

          隨筆檔案

          文章分類(lèi)

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 柳林县| 乃东县| 江达县| 横山县| 彭阳县| 孝感市| 正镶白旗| 德庆县| 金平| 鄂托克前旗| 乌兰浩特市| 青州市| 崇义县| 进贤县| 浦东新区| 泰兴市| 兴城市| 上高县| 文水县| 同心县| 广东省| 兴宁市| 景德镇市| SHOW| 泸州市| 元氏县| 台南市| 清水县| 阳信县| 邢台县| 全州县| 车险| 岑溪市| 佛坪县| 五峰| 灌云县| 延寿县| 淳安县| 西丰县| 曲阳县| 安新县|