單元測試工具(連載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