iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 9
2
Modern Web

站在Web前端人員角度,學習 Spring Boot 後端開發系列 第 9

Day 09 - Spring Boot 基礎單元測試

  • 分享至 

  • xImage
  •  

神替每一個選擇寫好了結局,他向我們提出了問題,是我們選擇了結局 --《孤單又燦爛的神——鬼怪》

根據上一篇已經寫完的Entity,我們要為它撰寫基本的單元測試,我們這次使用 JUnit 5 來進行單元測試。

單元測試(Unit testing )又稱為模組測試,是針對程式模組(軟體設計的最小單位)來進行邏輯正確性驗證,通常是由開發人員自己撰寫,自己寫的程式自己測!

使用單元測試可以幫助我們驗證撰寫程式是否符合實際結果,而其實撰寫單元測試通常會額外花費大量的時間,不過若我們都有確實實施,它是可以為我們帶來許多好處的,例如我們為新需求撰寫程式碼時,可以利用單元測試檢查新程式碼是否會造成先前的程式出現異常,避免更版後出現許多問題,讓我們可以即時發現問題。

我們在撰寫測試時,可以參考 3A 原則進行測試撰寫,規範如下:

  1. Arrange 初始化目標物件、相依物件、方法參數、預期結果
  2. Act 呼叫目標物件的方法
  3. Assert 驗證是否符合預期

以下是一個簡單的測試範例:

https://ithelp.ithome.com.tw/upload/images/20200918/201188573L3YSAPX3N.png

JUnit 介紹

在 Java 領域裡 JUnit 是最多人使用的測試套件,用於開發平台上運行的測試框架API,而Junit 版本又可分為 Jupiter 版本與 Vintage 版本,說明如下:

  • JUnit Jupiter 是用於在JUnit 5中編寫測試和擴展
  • JUnit Vintage提供了一個TestEngine在平台上運行基於JUnit 3和JUnit 4的測試

這次專案使用的JUnit 5(支持Java 8以上),但是我們一開始建置Spring Boot 專案時,spring-boot-starter-test 這個dependency預設會import Junit 4 ,所以我們要排除Junit 4 並加入Junit 5

添加依賴

先在pom.xml 移除JUnit 4

<!-- exclude junit 4 -->
<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <scope>test</scope>
 </dependency>

加入JUnit 5

<!-- add junit 5 -->
<dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <scope>test</scope>
</dependency>

實作第一個測試程式

接下來,我們要前一篇文章的Todo Entity撰寫基本的單元測試

  1. 首先我們要先在src → test → 創建一個ToDoEntityTest.java
  2. 每寫一個測試需要聲明@Test這個方法,使它執行為一個測試案例,在org.junit.jupiter.api
  3. 使用assertEquals 判斷實際值是否符合預期值

(1)底下為測試 Todo Entity 是否有正確設定值


import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class TestTodoEntity {
    @Test
    public void whenGetId_ThenSetId() {
        Todo todo = new Todo();
        todo.setId(1);
        Integer expected = 1;
        Integer actual = todo.getId();

        assertEquals(expected, actual);
    }

    @Test
    public void whenGetTask_ThenSetTask() {
        Todo todo = new Todo();
        todo.setTask("洗衣服");
        String expected = "洗衣服";
        String actual = todo.getTask();

        assertEquals(expected, actual);
    }

    @Test
    public void whenSetTask_ThenGetTask() {
        Todo todo = new Todo();
        todo.setStatus(2);
        Integer expected = 2;
        Integer actual = todo.getStatus();

        assertEquals(expected, actual);
    }
}

(2)執行測試程式,查看是否成功,在測試方法或類別(左方),點擊綠色的啟動鍵選擇Run "xxxxx" ,如圖示,即可以啟動測試,待程式執行完畢,看到測試是否有成功

https://ithelp.ithome.com.tw/upload/images/20200918/20118857aDpvbR7nRa.png

(3)測試覆蓋率(Coverage)是軟體測試中的重要指標,運行這些測試用例時覆蓋並且執行了哪些程式碼,亦指原始碼被測試的比例和程度。點擊Class 左方的綠色按鈕選擇Run "xxxxxxxxx" with Coverage,待程式執行完畢,即可看到Todo類別的測試覆蓋率了。
https://ithelp.ithome.com.tw/upload/images/20200918/20118857vIPpogioQw.png


上一篇
Day 08 - Spring Boot JPA 與 Lombok 套件 & DAO
下一篇
Day 10 - Spring Boot 三層式架構+Service層&Controller層
系列文
站在Web前端人員角度,學習 Spring Boot 後端開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言