qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          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)  編輯  收藏 所屬分類: 測試學習專欄

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

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 巴马| 绥宁县| 平远县| 杭锦旗| 福建省| 裕民县| 双桥区| 巩留县| 安图县| 布拖县| 股票| 邳州市| 石城县| 平阳县| 休宁县| 马尔康县| 安宁市| 巴南区| 建宁县| 甘孜| 航空| 芦山县| 营口市| 嘉义县| 台湾省| 田东县| 望奎县| 土默特左旗| 彩票| 德钦县| 双鸭山市| 三亚市| 唐山市| 昔阳县| 大埔县| 礼泉县| 天祝| 南投县| 大宁县| 定陶县| 社旗县|