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
{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
{}
}
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程式是由隊友進行程式設計我在旁指點的。