JAVA基礎--JUnit4簡單應用(1)

在項目中,咱們常常會使用到JUnit單元測試,那麼咱們今天就來看看JUnit到底有那些用法;java

1, 說到JUnit首先要了解一下它的母親--xUnit, xUnit是一套基於測試驅動開發的測試框架,派生出許多子類框架,有專門測試C++的 CppUnit,Python的PythonUnit和咱們專門測試JAVA的JUnit;數據庫

注意 : 測試用例不是用來證實你是對的,而是證實你沒有錯!數組

2, 測試框架的做用: 框架

    (1), 幫助咱們對編寫的程序進行有目的的測試;性能

    (2), 幫助咱們最大限度的避免代碼中的BUG,並使程序達到預期效果;單元測試

3, 書寫規範: 測試

    (1), 測試方法上必須使用 @Test 進行修飾;ui

    (2), 測試方法必須使用 public void 進行修飾,而且不能帶任何參數;this

    (3), 新建一個源碼目錄(test)來存放測試代碼;spa

    (4), 測試類的包名必須與被測試的包名相同;

    (5), 測試單元中的每一個方法必須能夠獨立測試,測試方法間不能有任何依賴;

    (6), 測試類使用 Test 做爲類名的前綴;

    (7), 測試方法使用 test 做爲方法名的後綴;

4, 測試失敗的兩種狀況;

    (1), 測試失敗: Failure 通常有單元測試使用的斷言方法判斷失敗所引發的,它表示測試點發現了問題,就是說程序輸出的結果和咱們預期的結果不一樣;

    (2), 測試錯誤: Errors  由代碼異常引發的,它能夠產生於測試代碼自己的錯誤,也能夠是測試代碼中被隱藏的BUG;

    注意 : 測試用例不是用來證實你是對的,而是證實你沒有錯!

5, JUnit4的運行流程:

package test;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class MyJUnitTest1 {

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        System.out.println("this is @BeforeClass");
    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        System.out.println("this is @AfterClass");
    }

    @Before
    public void setUp() throws Exception {
        System.out.println("this is @Before");
    }

    @After
    public void tearDown() throws Exception {
        System.out.println("this is @After");
    }

    @Test
    public void test() {
        System.out.println("this is @Test");
    }
    @Test
    public void test2() {
        System.out.println("this is @Test2");
    }
    
    
    /**
     * 運行結果 :
     *  this is @BeforeClass  全部方法以前運行;
     *  
        this is @Before       每一個方法以前運行;
        this is @Test
        this is @After        每一個方法以後運行;
        
        this is @Before
        this is @Test2
        this is @After
        
        this is @AfterClass  全部方法以後運行;
     * 
     * */
}

    (1), @BeforeClass 修飾的方法會在該測試類的全部方法調用以前調用,並且該方法是靜態的,因此當測試類被加載後,接着就會運行它,並且內存中它只會存在一份實例, 比較適合加載配置文件;

    (2), @AfterClass 所修飾的方法一般用來對資源的釋放,如關閉數據庫的鏈接,在全部方法以後調用;

    (3), @Before 每一個方法以前調用;

    (4), @After 每一個方法以後調用;

6: 經常使用註解:

package test;

import static org.junit.Assert.*;

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

public class MyJUnitTest2 {
    
    private int add(int a, int b){
        return a+b;
    }

    @Test(expected=AssertionError.class)
    public void test() {
        //JUnit4中的斷言方法:
        assertEquals(3,add(6,2));
    }
    
    @Test(timeout=1000)
    public void test1() {
        while(true){
            System.out.println("Hello world");
        }
    }
    
    @Ignore
    @Test
    public void test2() {
        while(true){
            assertEquals(3,add(6,2));
        }
    }
    /**
     * 除了以前的註解外,還有:
     * 1: @Test(expected=AssertionError.class) 預測會拋出 AssertionError.class 異常
     * 
     * 2: @Test(timeout=毫秒) 控制測試時間,防止死循環,能夠性能測試;
     * 
     * 3: @Ignore 所修飾的測試用例會被運行器自動忽略;
     *
     * 4: @RunWith 更改測試運行器;
     * */
}

7, JUnit4 測試套件:

package test;

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

@RunWith(Suite.class)
@SuiteClasses({MyTest.class,MyTest2.class,MyJUnitTest1.class})
public class MyJUnitSuiteTest {

}

/**
 * 測試套件: 就是組織測試測試類一塊兒運行,方便咱們批量測試;
 * 測試套件入口類,必須爲空類;
 * @RunWith(Suite.class) : 更改測試運行器爲Suite.class;
 * @SuiteClasses({MyTest.class,MyTest2.class,MyTest1.class}) : 放入須要測試的測試類數組
 * 
 * */

8, JUnit4 參數化設置:

package test;

import static org.junit.Assert.*;

import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

/**
 *@description  TODO 參數化設置測試類
 *@date  2018/1/7
 *@author  geYang
 **/
@RunWith(Parameterized.class)
public class MyJUnitParamTest {
    /**
     * 1, 更改默認的運行測試器爲 @RunWith(Parameterized.class);
     * 2, 聲明變量存放預期值和結果值,
     * 3, 聲明一個返回值爲 Collection 的公共靜態方法,而且使用 @Parameters 修飾;
     * 4, 建立帶參構造器,爲聲明的變量賦值;
     * */
    private int expected = 0;
    private int param1 = 0;
    private int param2 = 0;
    
    @Parameters
    public static Collection<Object[]> t(){
        return Arrays.asList(new Object[][]{
            {3,2,1},
            {4,2,2},
            {6,3,3}
        });
        
    }
    public MyJUnitParamTest(int expected, int param1, int param2) {
        this.expected = expected;
        this.param1 = param1;
        this.param2 = param2;
    }

    private int add(int a,int b){
        return a+b;
    }
    
    @Test
    public void test() {
        assertEquals(expected, add(param1,param2));
    }

}

有了這麼多的註解和方法,相信在之後的項目開發過程當中,能夠更容易的書寫測試用例.

相關文章
相關標籤/搜索