1. 程式人生 > >Junit單元測試、Junit常用註解

Junit單元測試、Junit常用註解

1.1 Junit的概述

  • Junit是一個java語言的單元測試框架,簡單理解為可以取代java的main方法。Junit屬於第三方工具,一般情況下需要匯入jar包。不過,多數java開發環境(如IntelliJ IDEA )已經集成了junit作為單元測試工具,不需要單獨去下載。
  • 在java中,一個類就是一個單元。
  • 單元測試是開發者編寫的一小段程式碼,用於檢驗某個類某個方法的功能或某個業務邏輯是否正確。

1.2 Junit的使用

1.2.1 下載

  • 什麼是junit:
  1. Junit是java語言編寫的第三方單元測試框架。
  2. 框架就是jar(類庫)包的集合。
  3. Junit.jar
  • 什麼是單元測試:
  1. 在java中,一個類就是一個單元。
  2. 單元測試就是開發者編寫的一小段程式碼用來對類中的方法功能進行測試。
  •  Junit的作用:
  1. 用來測試類中的方法功能是否正確,保證程式的穩定性和有效性。
  2. 可以讓符合要求的方法獨立執行。
  • Junit的使用步驟:
  1. 編寫業務層:在業務層類中編寫業務方法,實現某一功能的方法。
  2. 編寫測試類:在測試類中編寫測試方法,對業務中的業務方法進行測試。
  • 測試類的命名規範:
  1. 以Test開頭,以業務類類名結尾。比如業務類類名:StudentDao,那麼測試類名:TestStudentDao 
  • 測試方法的要求:
  • 命名要求:以test開頭,以業務方法結尾。比如業務方法名:SaveStudent,那麼測試方法名:testSaveStudent
  • 宣告要求:必須是public修飾的,必須沒有返回值,必須沒有引數,必須使用@Test註解修飾
  • 如何執行測試方法:
  1. 選中測試方法名 -->右鍵--> Run    '測試方法名'     執行選中測試方法。
  2.  選中類名 -->右鍵 -->Run  '測試類名'  執行選中類所有的測試方法。
  3. 選中模組名 -->右鍵 -->Run  'All Tests' 執行選中模組中所有測試類中的所有測試方法。
  • 如何檢視測試結果:
  1. 綠色:代表測試成功,沒有問題。
  2. 紅色:代表測試出現問題了。
  • 在實際開發過程中都是多人開發、合作開發,一般都需要分工的,常常使用分層開發(三層架構),即表現層、業務層、資料訪問層,假設你負責資料訪問層(直接和資料庫打交道,對資料庫直接增刪改查操作),那麼其他同事做業務層或表現層,業務層需要呼叫資料訪問層的程式碼,假設你寫好了一個類,對資料增刪改查的學生類,裡面提供了四個方法,當你寫好之後,首先需要測試保證沒有問題才能給同事去用,否則若出現很多bug的情況,會給實際開發工作帶來許多麻煩,那麼就需要用到Junit單元測試框架。
public interface Dao<T> {
    //增
    public void save(T t);
    //刪
    public void delete(int id);
    //改
    public void update(T t);
    //查
    public T find(int id);
}
import day03Test05.Student;

/*
    實現介面的同時指定泛型變數的具體資料型別。
 */
public class StudentDao implements Dao<Student> {
    @Override
    public void save(Student student) {
        System.out.println("儲存學生資訊");
    }

    @Override
    public void delete(int id) {
        System.out.println("刪除學生資訊");
    }

    @Override
    public void update(Student student) {
        System.out.println("更新學生資訊");
    }

    @Override
    public Student find(int id) {
        System.out.println("查詢學生資訊");
        return null;
    }
}
  • 斷言: 預先判斷某個條件一定成立,如果不成立則程式直接崩潰。(前提是被測試方法要有返回值) 
  • void assertSame(String message, Object expected, Object actual)
  1. message:異常訊息提示字串
  2. expected:期望值
  3. actual:實際值
/*
    業務類:執行加減乘除運算
 */
public class Calculate {
    //業務方法:求兩個數之和
    public int Sum(int a,int b){
        return a+b;
    }

    //業務方法:求兩個數之差
    public int Sub(int a,int b){
        return a-b;
    }
}



import org.junit.Assert;
import org.junit.Test;

public class TestCalculate {

    @Test
    public void testSum(){
        //建立業務類物件
        Calculate c = new Calculate();
        int result = c.Sum(1, 2);
        Assert.assertEquals("期望值和實際值不一致",2,result);
        System.out.println("result="+result);
    }

    @Test
    public void testSub(){
        //建立業務類物件
        Calculate c = new Calculate();
        int result = c.Sub(100, 30);
        Assert.assertEquals("期望值與實際值不一致",70,result);
        System.out.println(result);
    }
}
  • 期望值和實際值不一致,所以報錯。 (紅色代表測試失敗)

  • 期望值與實際值一致,所以執行正確。(綠色代表測試通過) 

 

  • 在上面的案例中,如果有很多個測試方法需要測試,如果每一個都建立一個Calculate物件,很麻煩,那麼我們可以通過下面的方法解決問題(加入一些註釋):
  • Junit4.0常用註解:
  • @Before:用來修飾方法,該方法會在每一個測試方法執行之前執行一次。
  • @After:用來修飾方法,該方法會在每一個測試方法執行之後執行一次。
  • @BeforeClass:用來靜態修飾方法,該方法會在所有測試方法執行之前執行一次。
  • @AfterClass: 用來靜態修飾方法,該方法會在所有測試方法執行之後執行一次。
  • Junit5.0常用註解:
  • @BeforeEach:用來修飾方法,該方法會在每一個測試方法執行之前執行一次
  • @AfterEach:用來修飾方法,該方法會在每一個測試方法執行之後執行一次
  • @BeforeAll:用來靜態修飾方法,該方法會在所有測試方法執行之前執行一次
  • @AfterAll:用來靜態修飾方法,該方法會在所有測試方法執行之後執行一次
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class TestCalculate {
    //建立業務類物件
    Calculate c ;

    //初始化的方法
    @Before//用來修飾方法,該方法會在每一個測試方法執行之前執行一次
    public void init(){
        System.out.println("init");
        //建立業務類物件
        c = new Calculate();
    }

    @After//用來修飾方法,該方法會在每一個測試方法執行之後執行一次
    public void close(){
        System.out.println("close");
        c=null;
    }

    @Test
    public void testSum(){
        int result = c.Sum(1,1);
        Assert.assertEquals("期望值和實際值不一致",2,result);
        System.out.println("result="+result);
    }

    @Test
    public void testSub(){
        int result = c.Sub(100, 30);
        Assert.assertEquals("期望值與實際值不一致",70,result);
        System.out.println("result="+result);
    }
}