1. 程式人生 > >java JUnit單元測試

java JUnit單元測試

第一部分:實驗預習報告(包括實驗目的、意義,實驗基本原理與方法,主要儀器裝置及耗材,實驗方案與技術路線等)

一、          實驗目的與意義

1) 掌握單元測試的方法;

2) 學習 JUnit 測試原理及框架;

3)掌握在 Eclipse 環境中載入 JUnit 及 JUnit 測試方法和過程。

注:我們選擇的是生命遊戲

二、            實驗內容

1.Eclipse中 JUnit 的使用

Eclipse 整合JUnit,可以非常方便地編寫TestCase。Eclipse自帶了一個JUnit 外掛,不用安裝就可以在專案中測試相關的類,並且可以除錯測試用例和被測類。下面以例項說明,如 何建立一個基於JUnit4 的測試專案,對一個類當中的多個方法進行單元測試。

(1)新建一個名為 JUnitTest的專案,在其中編寫一個Calculator類,這是一個能夠簡單實現加減乘除、平方、開方的計算器類,然後對這些功能進行單元測試。這個類中我們故意保留 了一些Bug 用於演示,這些Bug 在註釋中都有說明。該類程式碼如下:

public class claculator {

       private static int result;          //靜態變量,用於存儲運

       public void add(int n) {   result = result+n;     }

       public void substract(int

n)

       {result = result-1;            //故意的Bug應該result=result-n}

       public void multiply(int n)      {}

       public void divide(int n) {      result = result/n;     }

       public void square(int n) {      result = n*n;    }

       public void squareRoot(int n) {             //求平方根

              for

( ; ; )           //Bug:死循

              {}

       }

       public void clear() {

              result = 0;

       }

       public int getResult() {

              // TODO Auto-generated method stub

              return result;

       }

}

(2)將 JUnit4 單元測試包引入這個專案:在該專案上點右鍵,點“屬性”,

(3)在彈出的屬性視窗中,首先在左邊選擇“JavaBuildPath”,然後到右上選擇“Libraries” 標籤,之後在最右邊點選“AddLibrary…”按鈕。點選“下一步”後,系統會自動列出你這個類中包含的方法,選擇你要進行測試的方法。此例中,我們僅對“加、減、乘、除”四個方法進行測試。之 後 系 統 會 自 動 生 成 一 個 新 類 CalculatorTest,裡面包含一些空的測試用例。只需要將這些測試用 例 稍作修改即可使用。

(4)執行測試程式碼:按照上述程式碼修改完畢後,我們在 CalculatorTest類上點右鍵,選擇“RunAs ——>JUnitTest”來執行我們的測試。

2. 利用 JUnit對“實驗一”中的各個類,進行單元測試。

三、          實驗原理和步驟

本次實驗的內容是單元測試,單元測試的測試用例是極為重要的,所以對於每一個帶有邏輯功能的函式我們都進行了多次測試,其中包括邊緣測試、錯誤測試和一般的測試等。並且我們保證程式碼的測試覆蓋率是在百分之70以上並且程式碼的測試通過率都是百分之百。下面我就來展示幾個邏輯的函式:

public void testChangeCellStatus()函式:這個函式的功能是變換陣列,每一個時間跳動後都會按照遊戲的規則來變換陣列,所以我們測試的目的就是測試變換的是否正確,為了提高測試的覆蓋率,我們用了多組用例進行測試,其中包括正常測試、邊緣測試以及錯誤的測試等。因為這是一個被呼叫的模組,所以我們為其設定了驅動模組。及一個個測試陣列。

邊緣的陣列進行測試程式碼:我們用一個全為0的陣列測試,結果與一個全為0的陣列比較,如果是一樣的則正確,否則錯誤。

     //邊緣測試

              for(int i=0; i<50; i++)

                     for(int j=0; j<50; j++) {

                            sj.nextStatus[i][j] = 0;

                            sj.tempStatus[i][j] = 0;

                     }

              sj.changeCellStatus();

              int[][] a = new int[50][50];

              for(int i=0; i<50; i++)

                     for(int j=0; j<50; j++)

                            a[i][j] = 0;

              boolean flag = true;

              for(int i=0; i<50; i++)

                     for(int j=0; j<50; j++) {

                            if(sj.nextStatus[i][j] != a[i][j])

                                   flag = false;

                     }

              assertEquals(true,flag);

錯誤測試程式碼:

       //錯誤測試

              for(int i=0; i<50; i++)

                     for(int j=0; j<50; j++) {

                            sj.nextStatus[i][j] = 0;

                            sj.tempStatus[i][j] = 0;

                     }

              sj.tempStatus[24][24] = 1;

              sj.tempStatus[25][24] = 1;

              sj.tempStatus[24][25] = 1;

              sj.tempStatus[25][25] = 1;

              sj.changeCellStatus();

              flag = true;

              for(int i=0; i<50; i++)

                     for(int j=0; j<50; j++) {

                            if(sj.nextStatus[i][j] != a[i][j])

                                   flag = false;

                     }

              assertEquals(false,flag);

一般的陣列:

     //一般測試

              for(int i=0; i<50; i++)

                     for(int j=0; j<50; j++) {

                            sj.nextStatus[i][j] = 0;

                            sj.tempStatus[i][j] = 0;

                     }

              sj.tempStatus[24][24] = 1;

              sj.tempStatus[25][24] = 1;

              sj.tempStatus[24][25] = 1;

              sj.tempStatus[25][25] = 1;

              sj.tempStatus[42][41] = 1;

              sj.tempStatus[42][42] = 1;

              sj.changeCellStatus();

              a[25][25] = 1;

              a[24][25] = 1;

              a[25][24] = 1;

              a[24][24] = 1;

              flag = true;

              for(int i=0; i<50; i++)

                     for(int j=0; j<50; j++) {

                            if(sj.nextStatus[i][j] != a[i][j])

                                   flag = false;

                     }

              assertEquals(true,flag);

public boolean isNumeric(String str)函式,這個函式實在jiemain()類中判斷使用者輸入是否正確的函式,該類中要求使用者輸入隨機模式的速度,該速度應該是在0到2200之間的數字(不能等於0但是可以等於2200)

因為要設計邊緣用例和錯誤用例,所以我們輸入的值有0、2200、220和”yufan”,具體程式碼如下:

  @Test

       public void testIsNumeric() {

              jiemian1.isNumeric("yufan");

              assertEquals(false,jiemian1.getisNumeric());

              jiemian1.isNumeric("220");

              assertEquals(true,jiemian1.getisNumeric());

              jiemian1.isNumeric("2200");

              assertEquals(true,jiemian1.getisNumeric());

              jiemian1.isNumeric("0");

              assertEquals(false,jiemian1.getisNumeric());

       }

還有一些GUI的函式,我們採用的方法是檢查每個引數,比如一些按鈕的大小位置等。爭取增加測試覆蓋率,因為太多,所以我們就以lifegame()函式為例,程式碼如下:

  @Test

       public void testLifegame() {

              int chang = lg.getWidth();

              int weight = lg.getWidth();

              String bu1name = lg.bu1.getLabel();

              String bu2name = lg.bu2.getLabel();

              String jbname = lg.jb.getText();

              int x1 = lg.bu1.getX();

              int y1 = lg.bu1.getX();

              int x2 = lg.bu2.getX();

              int y2 = lg.bu2.getY();

              boolean flag = false;

              if(bu1name.equals("隨機模式") && bu2name.equals("經典模式") && x1==100 && y1==100 && x2==100 && y2==300 && chang==630 && weight==630 && jbname.equals("<html>隨機模式圖形隨機生成而且<br>顏色變化多端,而經典模式<br>則是兩條小魚的變化</html>"))

                     flag = true;

              assertEquals(true,flag);

       }

四、           實驗儀器裝置及耗材

PC機,Eclipse

五、          團隊合作過程

老師給了我們一個計算器的模擬程式,是由我來將其實現在來一起學習的,接著對於public void testChangeCellStatus()函式和public boolean isNumeric(String str)函式是由我程式設計,隊友一旁指點。之後的一些GUI程式是由隊友進行程式設計我在旁指點的。