JUnit單元測試學習摘要教程

1.教程摘要

  在編寫代碼的時候經過System.out和alert來作測試,很是麻煩,並且不夠正規,對於即將步入工做的人來講,一個正規的寫代碼習慣和測試習慣是很是重要的,所以應當認真學學如何使用JUnit。  java

  junit包有junit3和junit4兩個版本,通常都使用junit4這個版本,兼容性好且更靈活。數據庫

2.教程實例

步驟1:建立待測試類

首先新建一個項目叫JUnit_Test,咱們編寫一個Calculator類,這是一個可以簡單實現加減乘除、平方、開方的計算器類,而後對這些功能進行單元測試。這個類並非很完美,咱們故意保留了一些Bug用於演示,這些Bug在註釋中都有說明。該類代碼以下:數組

package dyz.calculator;
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;
    }
}

步驟2:在eclipse中爲項目添加JUnit環境

右鍵JUnit_Test項目,在build path中「add library」,添加JUnit,以下圖所示:eclipse

步驟3:建立測試類

右鍵Calculator類,選擇「new",建立JUnit Test Caseide

步驟4:編寫測試用例代碼

測試用例代碼以下:函數

package dyz.calculatortest;
import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;

import xw.calculator.Calculator;

public class CalculatorTest {
    private static Calculator calculator = new Calculator();

    // 復原操做,代表對每一個Test方法測試之後都會進行這個方法操做。
    @Before
    public void setUp() throws Exception {
        calculator.clear();// 結果清零
    }

    @Test
    public void testAdd() {
        // fail("Not yet implemented");
        calculator.add(2);
        calculator.add(3);
        assertEquals(5, calculator.getResult());
    }

    @Test
    public void testSubstract() {
        // fail("Not yet implemented");
        calculator.add(10);
        calculator.substract(2);
        assertEquals(8, calculator.getResult());
    }

    // 忽略標註,代表這個方法功能尚未實現
    @Ignore("Multiply() Not yet implemented")
    @Test
    public void testMultiply() {
        fail("Not yet implemented");
    }

    @Test
    public void testDivide() {
        // fail("Not yet implemented");
        calculator.add(8);
        calculator.divide(2);
        assertEquals(4, calculator.getResult());
    }

    // Timeout參數代表了你要設定的時間,單位爲毫秒,所以1000就表明1秒。
    @Test(timeout = 1000)
    public void squareRoot() {
        calculator.squareRoot(4);
        assertEquals(2, calculator.getResult());

    }

    /**
     * square1/square2/square3分別用來測試正數,0,複數的平方
     */
    @Test
    public void square1() {
        calculator.square(2);
        assertEquals(4, calculator.getResult());
    }

    @Test
    public void square2() {
        calculator.square(0);
        assertEquals(0, calculator.getResult());
    }

    @Test
    public void square3() {
        calculator.square(-3);
        assertEquals(9, calculator.getResult());
    }
}

經常使用註解說明  單元測試

  一、@BeforeClass所修飾的方法在全部方法加載前執行,並且他是靜態的在類加載後就會執行該方法,測試

在內存中只有一份實例,適合用來加載配置文件。ui

  二、@AfterClass所修飾的方法在全部方法執行完畢以後執行,一般用來進行資源清理,例如關閉數據庫鏈接。this

  三、@Before和@After在每一個測試方法執行前都會執行一次。

       四、@Test(excepted=XX.class) 在運行時忽略某個異常。

  五、@Test(timeout=毫秒) 容許程序運行的時間。

  六、@Ignore 所修飾的方法被測試器忽略。

  七、@RunWith 能夠修改測試運行器 org.junit.runner.Runner

 

3.參數化測試與運行器(Runner)

考慮一種場景,若是要單獨測試正數的平方,0的平方以及負數的平方,那麼就要建立三個測試方法來進行測試,這樣會顯得特別繁瑣,如步驟4中最後的三個測試方法square1()、square2()和square3()。JUnit考慮到了這種狀況,提出了參數化測試方法。這個時候運行器也不是默認的運行器,而是經過@RunWith(Parameterized.class)來標註。

參數化測試代碼以下所示;

package dyz.calculatortest;
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import dyz.calculator.Calculator;
@RunWith(Parameterized.class)
public class SquareTest {
    private static Calculator calculator = new Calculator();
    private int param;
    private int result;

    @Parameters
    public static Collection<Object[]> data() {//定義測試數據的集合
        return Arrays.asList(new Object[][] { { 2, 4 }, { 0, 0 }, { -3, 9 }});
    }

    // 構造函數,對變量進行初始化,參數的順序與數據集成的順序相關
    public SquareTest(int param, int result) {
        this.param = param;
        this.result = result;
    }

    // 復原操做,代表對每一個Test方法測試之後都會進行這個方法操做。
    @Before
    public void setUp() throws Exception {
        calculator.clear();// 結果清零
    }

    @Test
    public void testSquare() {
        calculator.square(param);
        assertEquals(result, calculator.getResult());
    }
}

具體步驟:

  一、更改默認的測試運行器爲@RunWith(Parameterized.class)。

  二、聲明變量來存放預期值和測試值。

  三、聲明一個返回值爲Collection的公共靜態方法,並用@Parameters修飾。

  四、爲測試類聲明一個帶有參數的公共構造函數,並在其中爲他聲明變量賦值。

 

4.打包測試

考慮另一種場景,若是一個項目中有許多個測試類,一個一個去運行會很是繁瑣,這個時候就能夠考慮使用打包測試。將全部須要運行的測試類集中起來,一次性的運行完畢,大大的方便了咱們的測試工做。

右鍵Calculator類,新建一個JUnit Test Suite,以下圖所示。

而後選擇須要打包測試的測試類,以下圖所示:

打包測試類叫作AllTests,須要打包測試的三個測試類是CalculatorTest,SquareTest和test。點擊Finish完成打包測試,生成的打包測試類代碼以下:

package dyz.calculatortest;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({SquareTest.class,CalculatorTest.class,Test.class})
public class AllTests {

}

運行結果以下:

注意事項:

  一、做爲測試套件的入口類,類中不能包含任何方法。

  二、更改測試運行器Suite.class。

  三、將須要運行的測試類放入Suite.SuiteClasses({})的數組中。

相關文章
相關標籤/搜索