單元測試_JUnit常用單元測試註解介紹及代碼演示

来源:https://www.cnblogs.com/shouke/archive/2018/12/24/10171253.html
-Advertisement-
Play Games

JUnit常用單元測試註解介紹及代碼演示 by:授客 QQ:1033553122 1. 測試環境 1 2. 基礎概念 1 3. 常用Annotation 1 4. 運行環境配置 3 maven配置 3 Eclipse maven運行環境配置 4 更新項目 5 5. 單元測試實踐 7 被測類Binar ...


JUnit常用單元測試註解介紹及代碼演示

 

by:授客 QQ:1033553122

1. 測試環境 1

2. 基礎概念 1

3. 常用Annotation 1

4. 運行環境配置 3

maven配置 3

Eclipse maven運行環境配置 4

更新項目 5

5. 單元測試實踐 7

被測類BinarySearch 7

測試類BinarySearchTest 8

被測類Caculator 11

測試類CaculatorTest 12

測試套件類RunAllTestClass 13

運行單元測試 13

運行結果展示 16

 

1. 測試環境

Win7

 

eclipse-java-oxygen-3a-win32-x86_64.zip

 

apache-maven-3.5.4-bin.zip

https://maven.apache.org/download.cgi

https://pan.baidu.com/s/1OUNC0kZNduXJJLbpw76GZA

 

 

2. 基礎概念

測試方法 :用@Test註解修飾的一些類方法。

測試類:包含一個或多個測試方法的java類;

測試套件:用@RunWith(Suite.class) 及@SuiteClasses註解的;font-size:10.5000pt;mso-font-kerning:0.0000pt;">一個或多個測試類

 

 

3. 常用Annotation

 

@RunWith  修飾測試類,用於修改運行器,如果不指定@RunWith則使用預設運行器。當測試類被@RunWith註解修飾時,或者類繼承了一個被該註解修飾的類,JUnit將會使用這個註解所指明的運行器來運行單元測試,而不使用JUnit預設的運行器。

 

常見的運行器有: 

@RunWith(JUnit4.class)  junit4的預設運行器

 

@RunWith(SpringRunner.class)  集成了spring的一些功能的運行器

 

@RunWith(Suite.class)  配合@SuiteClasses使用,用於執行測試套件的運行器  

 

@RunWith(Parameterized.class)   參數化運行器,配合@Parameters使用,參數化運行單元測試,需要在被修飾的測試類中的,提供數據的方法上加上一個@Parameters註解,例如,註意,這個提供數據的方法必須是靜態的(static),並且返回一個集合(Collection)

 

我們可以為@Parameters 提供一個“名稱”,以便更清晰的標記每個測試方法在每次運行時所使用的參數

 

“名稱”可以包含占位符,該占位符在運行時將會被替換。

·{index}: 當前參數的索引

·{0}, {1}, …: 第一個參數,第二個參數等對應的參數值。

 

 

 

@Test  註解將一個普通方法修飾為一個測試方法,可選參數 timeout、expected,如下:

@Test(timeout = 1000)  設置被修飾的測試方法在預期時間(例中為 1000毫秒)內執行完成,否則測試失敗;

 

@Test(expected = Exception.class)設置被修飾的測試方法應該拋出的預期異常,異常類型為:Exception.class,如果測試方法沒有拋出預期的異常,則測試失敗, 例如 @Test(expected = NullPointException.class)

 

註意:測試方法必須是public void,即公共、無返回

 

參考鏈接:https://www.cnblogs.com/mengdd/archive/2013/04/13/3019278.html

 

 

 

@BeforeClass  註解用於修飾測試類中的非測試方法,該方法將在其所屬測試類中的所有測試方法被執行前運行,且只運行一次,可用於做一些測試基礎準備,比如資料庫連接,讀取文件等。

 

註意:@BeforeClass修飾的方法必須是被public static void 修飾的方法,即公開、靜態、無返回

 

 

 

@AfterClass  同@BeforeClass相反,註解用於修飾測試類中的非測試方法,該方法將在其所屬測試類中所有測試方法執行完成後被運行,且只運行一次,可用於做一些測試後續操作,比如斷開資料庫連接,關閉文件等。

 

註意:@AfterClass 修飾的方法必須是被public static void 修飾的方法,即公開、靜態、無返回

 

 

 

@Before 註解用於修飾測試類中的非測試方法, 該方法會在其所屬測試類中的每一個測試方法運行前運行一次

 

與@BeforeClass的區別在於,@Before不止運行一次,它會在每個測試方法運行之前都運行一次。主要用於為單個測試方法做一些基礎的測試準備工作。

 

註意:@Before 修飾的方法必須是被public void 修飾的方法,即公開、無返回,但不能是被static修飾的

 

 

 

@After:用於修飾測試類中的非測試方法, 同@Before相反,該方法會在其所屬測試類中的每一個測試方法執行完後都運行一次

 

註意:@After 修飾的方法必須是被public void 修飾的方法,即公開、無返回,但不能是被static修飾的

 

 

 

@ignore    註釋掉一個測試方法或一個類,被註釋的方法或類,不會被執行;

 

 

 

4. 運行環境配置

maven配置

確保全裝了java jdk並正確設置了JAVA_HOME

下載bin.zip壓縮包,解壓到目標路徑(例中 D:\Program Files\apache-maven-3.5.4\

),設置MAVEN_HOME及Path環境變數,如下

 




 

 

cmd輸入mvn -v測試

 



 

 

Eclipse maven運行環境配置

如圖,Window - Preferences - Maven -User Settings,Browse指定maven配置文件所在路徑


 



 

更新項目

為瞭解決項目jar包依賴之類的問題,更新項目,右鍵項目根目錄 - Maven - Update Project


 




 

 

如下圖,預設已經選中了工程項目,預設選項配置的基礎上,勾選上“Force Update of Snapshots/Releases”,OK提交

 

 

5. 單元測試實踐

被測類BinarySearch

 

package org.shouke.demo;

 

public class BinarySearch {

 

    public int binarySearch(long[] a, long key) {

        int low = 0;

        int high = a.length - 1;

        

        while (low <= high) {

            int mid = (low + high) >>> 1;

            

            long midVal = a[mid];

            

            if (midVal < key)

                low = mid + 1;

            else if (midVal > key)

                high = mid - 1;

            else

                return mid;

        }

        return -1;

    }

    

 

}

 

測試類BinarySearchTest

 

package org.shouke.test;

 

import org.junit.After;

import org.junit.AfterClass;

import org.junit.Assert;

import org.junit.Ignore;

import org.junit.Test;

import org.junit.Before;

import org.junit.BeforeClass;

import org.junit.runner.RunWith;

import org.junit.runners.JUnit4;

 

import org.shouke.demo.BinarySearch;

 

//@RunWith(SpringRunner.class)

@RunWith(JUnit4.class)

//@SpringBootTest

//@TestPropertySource("classpath:test-application.properties")

public class BinarySearchTest {

 

    private BinarySearch binarySearch = new BinarySearch();

 

    private long[] array1 = new long[] {};

 

    

    @Test

    public void testBinarySearch1() {

        System.out.println("執行方法 testBinarySearch1");

 

     int index = binarySearch.binarySearch(array1, 401L);

        Assert.assertEquals(-1, index);

 

    }

 

    private long[] array2 = new long[] {123L,123L,123L,123L,123L,123L,123L,123L};

    

    @Ignore

    public void testBinarySearch2() {

        System.out.println("執行方法 testBinarySearch2");

     int index = binarySearch.binarySearch(array2, 401L);

        Assert.assertEquals(-1, index);

    }

   

  private long[] array3 = new long[] {123L, 456L};

  

  

  @Test

  public void testBinarySearch3() {

      System.out.println("執行方法 testBinarySearch3");

  int index = binarySearch.binarySearch(array3, 401L);

      Assert.assertEquals(-1, index);

  }

 

  private long[] array4 = new long[] {123L, 456L};

  

  

  @Test

  public void testBinarySearch4() {

      System.out.println("執行方法 testBinarySearch4");

      

      int index = binarySearch.binarySearch(array4, 40L);

      Assert.assertEquals(-1, index);

  }

  

  

  private long[] array5 = new long[] {123L, 456L};

  

  @Test

  public void testBinarySearch5() {

      System.out.println("執行方法 testBinarySearch5");

 

  int index = binarySearch.binarySearch(array5, 123L);

      Assert.assertEquals(0, index);

  }

  

  private long[] array6 = new long[] {123L, 123L};

  

  @Test

  public void testBinarySearch6() {

      System.out.println("執行方法 testBinarySearch6");

 

  int index = binarySearch.binarySearch(array6, 123L);

      Assert.assertEquals(0, index);

  }

  

 

  

  

  @Before

  public void testBeforeMethod() {

      System.out.println("執行每個方法前先執行該函數");

  }

  

  

  

  @After

  public void testAfterMethod() {

      System.out.println("執行完每個方法後都會執行該函數");

  }

  

 

  

  @BeforeClass

  public static void testBeforeClass() {

      System.out.println("執行測試類的所有方法前先執行該函數");

  }

  

  

  

  @AfterClass

  public static void testAfterClass() {

      System.out.println("執行完測試類的所有方法後都會執行該函數");

  }

  

 

}

 

 

被測類Caculator

package org.shouke.demo;

 

 

public class Caculator {

 

    public int caculate(int arg1, int arg2) {

        if (arg1 > arg2) {

         return arg1 - arg2;

        } else if (arg1 < arg2) {

         return arg1 + arg2;

        } else {

         return arg1;

        }

 

    }

    

 

}

 

測試類CaculatorTest

package org.keshou.test;

 

import org.junit.Assert;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.junit.runners.Parameterized;

 

import org.shouke.demo.Caculator;

import java.util.Arrays;

import java.util.Collection;

 

@RunWith(Parameterized.class)

public class CaculatorTest {

 

    private Caculator caculator = new Caculator();

 

    public int arg1;

    public int arg2;

    

    public CaculatorTest(int arg1, int arg2) {

     this.arg1 = arg1;

     this.arg2 = arg2;

    }

    

//  @Parameterized.Parameters

    @Parameterized.Parameters(name = "{index}: (arg1: {0} arg2: {1}")

    public static Collectiondata() {

       return Arrays.asList(new Object[][] {

               { 10, 1}, { 5, 1 }

       });

    }

 

  

  

    @Test

    public void testCaculate1() {

     int result = caculator.caculate(arg1, arg2);

     System.out.println("執行方法 testCaculate1  參數:" + arg1 + " " + arg1);

     Assert.assertEquals(result, arg1-arg2);

    }

 

 

    @Test

    public void testCaculate2() {

     int result = caculator.caculate(arg1, arg2);

     System.out.println("執行方法 testCaculate2   參數:" + arg1 + " " + arg1);

     Assert.assertEquals(result, arg1+arg2);

    }

}

 

說明:被@Parameters 註解修飾用於提供參數的方法有多少個參數,那麼就需要為其所在類提供對應數量的類屬性,及一個包含對應數量的參數的構造函數,否則會報錯:java.lang.IllegalArgumentException: wrong number of arguments

 

 

 

測試套件類RunAllTestClass

package org.keshou.test;

 

import org.junit.runner.RunWith;

import org.junit.runners.Suite;

 

 

@RunWith(Suite.class)

@Suite.SuiteClasses({CaculatorTest.class, org.shouke.test.BinarySearchTest.class})

public class RunAllTestClass {

 

}

 

說明:如果需要運行多個測試類,只需要把目標測試類名稱.class放入如下的 {}中即可,測試類之間使用逗號分隔,如果不是同一個包中的測試類,記得加上對應的package名稱,或者使用import提前導入對應類。

 

@Suite.SuiteClasses({A.class, B.class, ...})

 

 

 

運行單元測試

如下圖,右鍵整個項目、單個測試類、測試套件 ->  Coverage As  ->  JUnit Test

 

或者

如下圖,右鍵整個項目、單個測試類、測試套件 -> Run As  ->  JUnit Test

 

 

 

 

 

 

 

說明:

1、如果右鍵時選擇的是整個項目,那麼項目src\test\;font-size:10.5000pt;mso-font-kerning:0.0000pt;">目錄下的都有測試類都會被執行。

 

2、Coverage as 和 Run as 這兩種運行方式的區別在於前者運行完成,會在控制臺端自動打開 Coverage 界面,展示覆蓋率,後者需要手動打開,打開方式如下:

Window -> Show View -> Java -> Coverage


 

 

 

運行結果展示

 

運行測試套件


 

 



 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 除了使用 new 操作符之外,還有更多的製造對象的方法。你將瞭解到實例化這個活動不應該總是公開進行,也會認識到初始化經常造成“耦合”問題。 ...
  • 以上實例中,100,1000.0和"John"分別賦值給counter,miles,name變數。 執行以上程式會輸出如下結果: ...
  • 一 開發環境說明: python3.5+wxpython包+math包 win10環境下開發,兼任win7 編譯工具:pycharm 二 運行界面展示: 三 開源共用: 四 打包xe文件下載地址: 百度網盤:https://pan.baidu.com/s/1xn9hjBsAvCFFq8XSpqS0L ...
  • Spring-data-jpa中非常簡單的查詢介面方式與CUBA相結合,簡化CUBA開發人員操作數據的方法,能有效提升代碼質量和交付速度 ...
  • 背景 首先,我們達成以下共識: 一個服務方法,如果入參太多,且基本為非pojo,會給調用方造成不必要的干擾。儘管可以把文檔寫的很完善,但還是建議使用pojo對多個參數合理封裝。 如下示例: 執行方法都應該對入參進行校驗。對於一些 通用的簡單的不涉及業務邏輯 的校驗,比如字元串不為空,數字的範圍限制, ...
  • Java線程通信方法 0、(why)每個線程都有自己的棧空間,我們要線程之間進行交流,合作共贏。 1、synchronized和volatile關鍵字 a) 看下麵的synchronized關鍵字 b) 看下麵的volatile關鍵字 2、等待/通知機制:一個線程A調用對象的wait()方法,另一個 ...
  • 一.遞歸函數的弊端 遞歸函數雖然編寫時用很少的代碼完成了龐大的功能,但是它的弊端確實非常明顯的,那就是時間與空間的消耗。 用一個斐波那契數列來舉例 import time #@lru_cache(20) def fibonacci(n): if n < 2: return 1 else: retur ...
  • 前言 本篇緊接著spring入門詳細教程(一),建議閱讀本篇前,先閱讀第一篇。鏈接如下: Spring入門詳細教程(一) https://www.cnblogs.com/jichi/p/10165538.html 一、spring註入方式 1、set方法註入 2、構造方法註入 3、p名稱空間註入 4 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...