單元測試工具(連載2)

  • 2019 年 12 月 12 日
  • 筆記

1.2 JUnt4測試用例的運行和調試

寫好產品代碼和測試代碼後,就可以運行測試程序了。只要在Eclipse的CalculatorTest類上單擊鼠標右鍵,在彈出的菜單上選擇「Run As a JUnit Test」運行測試用例,測試結果就顯示出來了,如圖4所示。

顯然,減法沒通過是由於代碼中存在問題,而乘法沒通過是由於乘法沒有實現。首先來修改減法的函數實現:

publicvoid substract(int m,int n) {

result =n-m; //Bug: 正確的應該是result =m-n

}

再進行一次運行,結果如圖5所示。

圖4 JUnit單元測試結果(一) 圖5 JUnit單元測試結果(二)

最後完成乘法的產品代碼與測試代碼。產品代碼如下:

publicvoid multiply int m,int n) {

result=m*n

}

測試代碼如下:

publicvoid testMultiply() {

calculator.multiply(8,2);

assertEquals(16,calculator.getResult());

}

圖6為最後的測試結果。最終產品代碼如下:

packageandycpp;

publicclass Calculator {

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

public void add(int m,int n) {

result = m + n;

}

public void substract(int m,int n) {

result = m-n;

}

public void multiply int m,int n) {

result = m*n;

}

public void divide(int m,int n) {

result = m / n;

}

public void square(int n) {

result = n * n;

}

public void squareRoot(int n) {

for (; 😉 ; //Bug : 死循環,為了後面介紹

}

public void clear() { // 將結果清零

result = 0;

}

public int getResult() {

return result;

}

}

圖6 JUnit單元測試結果(三)

而最終的測試代碼如下:

packagecom.jerry;

importstatic org.junit.Assert.*;

importorg.junit.Before;

importorg.junit.Test;

importorg.junit.Ignore;

publicclass CalculatorTest {

privatestatic Calculator calculator = new Calculator();

@Before

publicvoid setUp() throws Exception {

calculator.clear();

}

@Test

publicvoid testAdd() {

calculator.add(2,3);

assertEquals(5,calculator.getResult());

}

@Test

publicvoid testSubstract() {

calculator.substract(10,2);

assertEquals(8,calculator.getResult());

}

@Test

publicvoid testMultiply() {

calculator.multiply (8,2);

assertEquals(16,calculator.getResult());

}@Test

publicvoid testDivide() {

calculator.divide(8,2);

assertEquals(4,calculator.getResult());

}

}

1.3 對基本代碼的詳細介紹

一個單元測試代碼主要分為以下幾個部分。

(1)設置環境。

(2)運行測試。

(3)結果判斷。

(4)清理環境。

這裡,設置環境和清理環境是有區別的。

設置環境:比如,建立數據庫連接。

清理環境:比如,斷開數據庫連接。

1.包含必要的Package

importstatic org.junit.Assert.*;

assertEquals是Assert類中的一系列的靜態方法,一般的使用方式是Assert. assertEquals(),但是使用了靜態包後,前面的類名就可以省略了,使用起來更加方便。比如:

assertEquals(8,calculator.getResult());

顯而易見,assertEquals函數的主要功能是實現「結果判斷」。

2.測試類的聲明

測試類是一個獨立的類,沒有任何父類。測試類的名字也可以任意命名,沒有任何局限性。所以,不能通過類的聲明來判斷它是不是一個測試類。測試類與普通類的區別在於它內部方法的聲明。

3.創建一個待測試的對象

要測試哪個類,要創建一個該類的對象。比如第1.1節和第1.2節中,為了測試Calculator類,必須創建一個Calculator對象。

privatestatic Calculator calculator = new Calculator();

4.測試方法的聲明

在測試類中,並不是每個方法都用於測試,必須使用「標註」來明確表明哪些是測試方法。「標註」也是JDK5的一個新特性,用在此處非常恰當。可以看到,某些方法的前面有@Before、@Test、@Ignore、@After等字樣,這些就是標註,以一個「@」作為開頭。第1.3節開始的描述的@Before、@Test、@After對應於。

(1)標記@Before:設置環境。

(2)標記@Test:運行測試。

(3)標記@After:清理環境。

這個方法的前面使用@Test標註,表明這是一個測試方法。對方法的聲明,也有如下要求:名字可以隨便取,沒有任何限制,但是返回的值必須為void,而且不能有任何參數。如果違反這些規定,會在運行時拋出一個異常。

@Test

publicvoid testSubstract() {

calculator.substract(10,2);

assertEquals(8,calculator.getResult());

}

在測試方法中調用substract函數,將10減去2,期待的結果應該是8。如果最終的實際結果也是8,則說明substract函數是正確的,反之說明它是錯的。

assertEquals(8,calculator.getResult()):用來判斷期待結果和實際結果是否相等,第一個參數填寫期待結果,第二個參數填寫實際結果,也就是通過計算得到的結果。這樣寫好後,JUnit會自動進行測試,並把測試結果反饋給用戶。

星雲測試

http://www.teststars.cc

奇林軟件

http://www.kylinpet.com

聯合通測

http://www.quicktesting.net