軟體測試實驗三單元測試

辞楠發表於2024-04-29

實驗三單元測試及JUnit的應用

一、實驗目的

1、掌握單元測試的基本理論和作用。

2、掌握典型單元測試工具JUnit 的使用。

二、實驗型別

驗證加設計。

三、實驗內容

測試對於保證軟體開發質量有著非常重要的作用,單元測試更是必不可。JUnit是一個非常強大的單元測試包,可以對一個或多個類的單個或多個方法進行測試,還可將不同的TestCase組合成TestSuit,使測試任務自動化。Eclipse整合了.JUnit,可以非常方便地編寫TestCase。

我們在編寫大型程式的時候,需要編寫成千上萬個方法或函式,這些函式的功能可能很強大,但我們在程式中只用到該函式的一小部分功能,並且經過除錯可以確定,這一小部分功能是正確的。但是,我們同時應該確保每一個函式都完全正確,因為如果我們今後如果對程式進行擴充套件,用到了某個函式的其他功能,而這個功能有 bug 的話,將會造成很多問題。所以說,每編寫完一個函式之後,都應該對這個函式的方方面面進行測試,這樣的測試我們稱之為單元測試。傳統的程式設計方式,進行單元測試是一件很麻煩的事情,你要重新寫另外一個程式,在該程式中呼叫你需要測試的方法,並且仔細觀察執行結果,看看是否有錯。正因為如此麻煩,所以程式設計師們編寫單元測試的熱情不是很高。而類似JUnit這樣的單元測試包的推出,大大簡化了進行單元測試所要做的工作。

實驗任務 1

請按以下說明完成一個基本的 JUnit4 測試例項。

首先開啟 Eclipse 編譯器,建立一個 Java 專案,並在其中建立一個由 File 類構成的程式 File.java,給

該類新增一個 abs 方法,作用是返回一個給定整數引數的絕對值。其參考程式碼如下:

package tree;

public class File {

public static void main(String[] args) {

}

public int abs(int n)

{

if(n>=0)

return n;

else

return (-n);

}

}

2、對這個方法 abs 進行測試,確保其功能正常。右鍵點選 File.java,選擇 new—>other… ,彈出如下對話方塊:

選擇 JUnit Test Case。然後點選 next 到下一步,彈出如下視窗:

選上setUp 方法和 tearDown 方法,然後點 next,彈出如下視窗:

這裡我們主要是要測試 abs 方法,所以在其前面勾選並點選 Finish即可

結果會發現專案類生成了 FileTest 檔案,測試類的程式碼如下:

package tree;

import static org.junit.Assert.*;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

public class FileTest {

@Before

public void setUp() throws Exception {

}

@After

public void tearDown() throws Exception {

}

@Test

public void testAbs() {

fail("Not yet implemented");

}

}

testAbs()方法中,我們對 abs()的測試分別選擇正數,負數和 0,如果方法返回值與期待結果相同,則 assertEquals 不會產生異常。將其程式碼完善為如下的測試程式碼:

package tree;

import static org.junit.Assert.*;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

public class FileTest {

private File file;

@Before

public void setUp() throws Exception {

file=new File();

}

@After

public void tearDown() throws Exception {

}

@Test

public void testAbs() {

assertEquals(file.abs(14),14);

assertEquals(file.abs(-5),5);

assertEquals(file.abs(0),0);

}

}

在測試類上右鍵單擊,選擇 Run As——>JUnit Test,進行執行。如果沒問題,則出現如下所示的提示:

故意將 File 類中要測試的方法 abs 的 return n; 改為 return n+1; 再執行,則結果如下:

請比較和體會一下有問題和沒問題的測試提示有何不同。

有問題的Failures數為1,沒有問題的測試提示Failures數為0,有問題的測試提示Failure Trace是空白的,有問題的測試提示會顯示錯誤的原因和位置,有問題和沒有問題的測試提示最明顯的區別在進度條的顏色不一樣。

JUnit 透過單元測試,能在開發階段就找出許多 Bug,並且,多個 Test Case 可以組合成 Test Suite,讓整個測試自動完成,尤其適合於 XP 方法。每增加一個小的新功能或者對程式碼進行了小的修改,就立刻執行一遍 Test Suite,確保新增和修改的程式碼不會破壞原有的功能,大大增強軟體的可維護性

至此實驗任務 1 結束。下面繼續實驗任務 2。


實驗任務 2:

根據下面的說明,建立一個基於 JUnit4 的測試專案,對一個類當中的多個方法進行單元測試,進一步體驗一下單元測試的作用和 JUnit 測試的應用。

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

package tree;

public class Calculator {

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(){

return result;

}

}

第二步,將 JUnit4 單元測試包引入這個專案:在該專案上點右鍵,點“屬性”,在彈出的屬性視窗中,首先在左邊選擇“Java Build Path”,然後到右上選擇“Libraries”標籤,之後在最右邊點選“Add Library…”按鈕,如下圖所示:

然後在新彈出的對話方塊中選擇 JUnit4 並點選Finish,如上圖所示,JUnit4 軟體包就被包含進我們這個專案了。

第三步,生成 JUnit 測試框架:在 Calculate.java 中用右鍵點選new->other,選擇“JUnit Test Case”。如下圖所示:

點選“下一步”後,系統會自動列出你這個類中包含的方法,選擇你要進行測試的方法。此例中,我們僅對“加、減、乘、除”四個方法進行測試。如下圖所示:

之後系統會自動生成一個新類 CalculatorTest,裡面包含一些空的測試用例。只需要將這些測試用例稍作修改即可使用。完整的 CalculatorTest 程式碼如下:

package tree;

import static org.junit.Assert.*;

import org.junit.After;

import org.junit.Before;

import org.junit.Ignore;

import org.junit.Test;

public class CalculatorTest {

private static Calculator calculator = new Calculator();

@Before

public void setUp() throws Exception {

calculator.clear();

}

@After

public void tearDown() throws Exception {

}

@Test

public void testAdd() {

calculator.add(2);

calculator.add(3);

assertEquals(5,calculator.getResult());

}

@Test

public void testSubstract() {

calculator.add(10);

calculator.substract(2);

assertEquals(8,calculator.getResult());

}

@Ignore("Multiply() Not yet implemented")

@Test

public void testMultiply() {

}

@Test

public void testDivide() {

calculator.add(8);

calculator.divide(2);

assertEquals(4,calculator.getResult());

}

}

第四步,執行測試程式碼:按照上述程式碼修改完畢後,我們在 CalculatorTest 類上點右鍵,選擇“Run As ——>JUnit Test”來執行我們的測試,執行結果如下:

進度條是紅顏色表示發現錯誤,具體的測試結果在進度條上面有表示“共進行了 4 個測試,其中 1個測試被忽略,一個測試失敗”

相關文章