JUnit單元測試

測試代碼地址:https://github.com/zllwxq130/test/blob/master/junittest.javajava

1.編寫目標類源代碼git

package com.mengdd.junit;github

public class Calculatoride

{測試

       public int add(int a, int b)ui

 {3d

        return a + b;code

    }對象

       public int subtract(int a, int b)blog

    {

        return a - b;

    }

    public int multiply(int a, int b)

    {

        return a * b;

    }

    public int divide(int a, int b)

    {

        return a / b;

    }

}

  1. 添加JUnit庫

而後爲了使用JUnit,須要加入庫:

  右鍵選擇項目Properties->左側Java Build Path->標籤Libraries->Add Library...

 

彈出的對話框中選JUnit,而後Next,再選擇JUnit 3或者JUnit 4.

本文示例選擇JUnit 3。

  1. 建立測試類

這裏須要注意如下幾點:

  1.使用JUnit的最佳實踐:源代碼和測試代碼須要分開。

  因此能夠新建一個名叫test的source folder,用於存放測試類源代碼。這樣在發佈程序的時候測試類的程序就能夠丟掉了。

  可是這兩個文件夾中的類編譯出的class文件都會在同一個bin文件夾中。

  2.測試類和目標源代碼的類應該位於同一個包下面,即它們的包名應該同樣。  這樣測試類中就沒必要導入源代碼所在的包,由於它們位於同一個包下面。

  3.測試類的命名規則:

  在要測試的類名以前或以後加上Test。

此步驟完成後項目目錄以下:

 

  1. 測試類代碼編寫

測試類必須繼承於TestCase類。

TestCase文檔說明:

public abstract class TestCase

 extends Assert

 implements Test

A test case defines the fixture to run multiple tests.  To define a test case

1) implement a subclass of TestCase

2) define instance variables that store the state of the fixture

 3) initialize the fixture state by overriding setup

 4) clean-up after a test by overriding tearDown.

 Each test runs in its own fixture so there can be no side effects among test runs.

對於測試類中方法的要求:

在JUnit 3.8中,測試方法須要知足以下原則:

    1.public的。

    2.void的。 

   3.無方法參數。    

4.方法名稱必須以test開頭。 (它經過反射找出全部方法,而後找出以test開頭的方法)。

Test Case之間必定要保持徹底的獨立性,不容許出現任何的依賴關係。

刪除一些方法後不會對其餘的方法產生任何的影響。

咱們不能依賴於測試方法的執行順序。

綜上,編寫代碼以下:

package com.mengdd.junit;
 
import junit.framework.Assert;
import junit.framework.TestCase;
 
public class CalculatorTest extends TestCase
{
    public void testAdd()
    {
        Calculator calculator = new Calculator();
        int result = calculator.add(1, 2);
        // 判斷方法的返回結果
        Assert.assertEquals(3, result);// 第一個參數是指望值,第二個參數是要驗證的值
    }
 
    public void testSubtract()
    {
        Calculator calculator = new Calculator();
        int result = calculator.subtract(1, 2);
        // 判斷方法的返回結果
        Assert.assertEquals(-1, result);// 第一個參數是指望值,第二個參數是要驗證的值
 
    }
 
    public void testMultiply()
    {
        Calculator calculator = new Calculator();
        int result = calculator.multiply(2, 3);
        // 判斷方法的返回結果
        Assert.assertEquals(6, result);// 第一個參數是指望值,第二個參數是要驗證的值
 
    }
 
    public void testDivide()
    {
        Calculator calculator = new Calculator();
        int result = calculator.divide(12, 3);
        // 判斷方法的返回結果
        Assert.assertEquals(4, result);// 第一個參數是指望值,第二個參數是要驗證的值
 
    }
 
 
}
運行一下:右鍵選擇該類,Run As->JUnit Test

 
 

 

JUnit的口號:Keep the bar green to keep the code clean.

  1. 代碼重構:setUp()方法的使用

有一個原則:DRY(Don’t Repeat Yourself)

因此對代碼進行重構,將重複的生成對象的部分放在setUp()方法中。

(重寫的時候將protected變爲public,繼承的時候擴大訪問範圍是沒有問題的。)    先進行一個方法的測試測試:    

在CalculatorTest類中加入代碼以下:

@Override
    public void setUp() throws Exception
    {
        System.out.println("set up");
    }
    
    @Override
    public void tearDown() throws Exception
    {
        System.out.println("tear down");
    }

再次運行後發現Console中輸出以下:

 

說明這兩個方法執行了屢次。

在每一個測試用例以前執行setUp(),每一個測試用例執行以後,tearDown()會執行。

即對於每一個測試用例,執行順序爲:

1.setUp()

2.testXXX()

3.tearDown()

重構:使用成員變量生成對象(爲了能在每一個方法中都用到),將生成對象的語句放在setUp()中,注意這裏爲每個測試用例都會生成新的對象。    

重構後代碼以下:

package com.mengdd.junit;
 
import junit.framework.Assert;
import junit.framework.TestCase;
 
public class CalculatorTest extends TestCase
{
 
    private Calculator calculator = null;
 
    @Override
    public void setUp() throws Exception
    {
        System.out.println("set up");
        // 生成成員變量的實例
        calculator = new Calculator();
        System.out.println(calculator);
    }
 
    @Override
    public void tearDown() throws Exception
    {
        System.out.println("tear down");
    }
 
    public void testAdd()
    {
        int result = calculator.add(1, 2);
        // 判斷方法的返回結果
        Assert.assertEquals(3, result);// 第一個參數是指望值,第二個參數是要驗證的值
    }
 
    public void testSubtract()
    {
        int result = calculator.subtract(1, 2);
        // 判斷方法的返回結果
        Assert.assertEquals(-1, result);// 第一個參數是指望值,第二個參數是要驗證的值
 
    }
 
    public void testMultiply()
    {
        int result = calculator.multiply(2, 3);
        // 判斷方法的返回結果
        Assert.assertEquals(6, result);// 第一個參數是指望值,第二個參數是要驗證的值
 
    }
 
    public void testDivide()
    {
        int result = calculator.divide(12, 3);
        // 判斷方法的返回結果
        Assert.assertEquals(4, result);// 第一個參數是指望值,第二個參數是要驗證的值
 
    }
 
 
}

運行後控制檯輸出:

 

說明每個測試的方法先後都會有setUp()tearDown()方法的調用,因此每次生成的都是一個新的對象,各個方法之間沒有干擾

相關文章
相關標籤/搜索