UnitTest(2) - Junit 5 測試方法與斷言應用
上一篇簡單說明基本測試的概念跟要怎麼建立測試程式在 Spring Boot 之後,這邊就來接著提供一些測試的設計原則和一些方法。
3A 原則 (3A Pattern)
Arrange: 初始化物件、要用到的參數
Act: 呼叫要測試的方法
Assert: 驗證測試結果
如果以上一篇的範例來看,我們要測試加法的功能會這樣設計就是應用到 3A 原則
Arrange:首先就是要先建立好測試的環境,把要用到的物件初始化,建立好相關的參數,也就是我們引入 Calculator 這個物件進入並且建立好要執行加法的參數。
Act:接著呼叫測試的方法並且帶入我們要的參數
Assert:利用斷言的方法來驗證,是否符合預期
12345678910111213141516class CalculatorTest { @Test void testAdd() { // Arange Calculator calc = new Calculator(); int x = 1; int y = 1; ...
UnitTest(1) - Junit 5 基本介紹及建立測試程式
相信有許多人知道開發有一個重要的環節就是進行測試,不管是透過直接操作功能、打 API 或是程式內部執行測是程式等等都是測試的一種,今天要介紹的單元測試就是指測試程式碼最小功能單位的運作。
單元測試目的
測試功能運作邏輯
確保不會改壞程式
單元測試特性
一次只測一個功能點或一個 api
可被自動化運行
各單元測試互相獨立,不依賴
JUnit 5 介紹Java 常見的開源測試框架,目前最新版本為 JUnit5,使用了 Java 8 及更高版本的 Java 語言特性。 進行單元測試的可讀性更強,編寫更容易,且可以輕鬆擴充。
版本相容注意
Spring Boot 版本
相容的 JUnit 版本
≤ 2.1
JUnit 4
2.2, 2.3
JUnit 4、JUnit 5
≥ 2.4
JUnit 5
Spring Boot 導入 JUnit通常只要建立一般 web 的專案就會導入 spring-boot-starter-test 裡面就會包含 Junit 測試框架了
12345<dependency> <groupId>org.spring ...
Lombok
前面在介紹使用 Spring Data JPA 的時候,在關聯的部分有碰到一些使用 Lombok 的問題,這篇就來介紹一下個別的註解作用,也可以讓大家使用的時候也知道背後運作的邏輯。
Lombok 是一個套件可以幫助我們定義物件時省去許多重複冗長的 code ,可以大幅提升開發效率,下面是常見的註解。
套件引入12345<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional></dependency>
常用註解介紹
小補充: 其實有很多方法如果是用 Intellij 都可以在物件內點選右鍵使用 generate 產生,但是如果可以用一個註解就解決這些還是來得方便很多,但建議剛開始新手可以先用這些 generate 來產生對應方法,也可以藉此了解每個註解背後的原始 code 是怎麼運作。
@Getter / @Setter ...
Spring Data JPA (4) 資料庫關聯 1 : N
一對多 1 : N一對多關聯可以看到,products 和 reviews 這兩張表的關係,一個商品會有多則評論,所以設計上會在 reviews 裡面紀錄 product_id 來關聯回去 products。會應用到 @OneToMany @ManyToOne 這兩種註解來根據你是哪一方進行關聯。
建立父實體 reviews,標記 @ManyToOne
123456789101112131415@Entity@Data@Table(name = "reviews")@JsonIgnoreProperties({"product"})public class Review { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String comment; private int rating; @ManyToOne @JoinColumn(name = " ...
Spring Data JPA (3) 資料庫關聯 1 : 1
操作 Spring Data JPA 需要對於資料表之間的關聯與配置有一定的了解,可以幫助你在規劃資料庫及撈取資料上有很大的幫助。
後續文章會依序介紹常見的幾種關聯操作,若這邊設計一個情境開設一個電商平台,賣電玩的商品,會有一些表紀錄商品的一些資訊,我們可以藉此來探討資料表之間的關聯。主要有下面這幾張表:
products 商品資訊,記錄名稱 (name)、價錢 (price)、描述 (description)等資訊
product_details 商品細節,紀錄開發商 (developer)、發行商 (publisher)、發行日 (release_date)、支援語言 (language_support)等資訊
reviews 評論,紀錄評論者 (reviewer_name)、內容 (comment)、分數 (rating)
tags 標籤,遊戲類型及各式分類標註 (name)
product_tags 商品及標籤的關聯表 (多對多需要)
關聯配置相關參數介紹關聯時必須知道誰是父實體(或稱維護方,具有 FK 可以關聯被維護 PK),誰是子實體(被維護、被參考對象)
父 ...
Spring Data JPA (2) 資料庫查詢應用
這邊來認識一些我們可能會用到的一些資料庫查詢操作
根據前面的 products 結構來插入一些資料熟悉一些操作的用法吧。
123456789101112INSERT INTO products (name, price, description) VALUES('薩爾達傳說:曠野之息', 59.99, '設定在幻想世界中的開放世界動作冒險遊戲。'),('超級瑪利歐:奧德賽', 49.99, '以瑪利歐為主角的平臺遊戲,探索各種世界。'),('集合啦!動物森友會', 54.99, '在無人島上進行發展的生活模擬遊戲。'),('最終幻想 VII 重製版', 69.99, '經典 RPG 的重製版,具有更新的圖像和遊戲玩法。'),('巫師3:狂獵', 39.99, '開放世界 RPG,玩家扮演狩魔獵人傑洛特。'),('電馭叛客2077', 59.99, '設定在反烏 ...
Spring Data JPA(1)基礎應用架構
前面已經介紹過各類資料操作框架的特色之後,這邊來介紹其中我比較熟悉也蠻多人使用的 Spring Data Jpa,雖然比較不用寫 SQL 所以可能會對於 SQL 掌握比較少,但我覺得透過物件的方式來操作資料也是本身 Java 的特色之一,搭配 Spring Boot 能夠整合在框架中使用是很方便的
使用前概念根據常用開發架構的 MVC 架構,資料庫的部分主要是由 Model 層部分進行處理,這邊對應在 Spring Boot 的開發上會放在 Dao 和 Service,Dao 主要是定義我們與資料庫的溝通連結,在 Spring Data Jpa 主要就是繼承 JpaRepository 去處理資料的存取,最後將拿到得資料返回給 Service 進行業務邏輯的操作或是資料的組裝,最後回給 Controller。
引入套件pom.xml 加入下面套件,spring-boot-starter-data-jpa 就是我們要使用的 JPA 套件,另外一個則是 mysql 連線用的套件,可以根據使用不同資料庫做更換
12345678910 <dependency> ...
Spring Data JPA, JDBC Template, Mybatis 比較
今天就來認識一下使用 Spring Boot 的時候可能會碰到的三種資料存取框架 Spring Data JPA、JDBC Template 和 MyBatis ,他們都各有其特色和適合的應用場景,當你需要碰到資料庫的處理,肯定需要來了解一下。
Spring Data JPA特點:
ORM 的框架:將資料庫表格映射到我們定義的 Java 物件上面,並提供自動化的資料庫操作。資料操作可以用物件的概念還進行操作,程式碼具物件特性和可讀性。
簡化資料存取:透過 JPA((Java Persistence API),可自動根據操作的慣例來減少手動撰寫 SQL 的需求,例如 findById, findAll 等等的直觀方法可以直接進行操作,不需要另外定義。
支援 JPQL (Java Persistence Query Language): 提供類似 SQL 的查詢語言,但更強調物件導向,使用的是物件屬性而非資料庫欄位。
與 Spring 整合:由於是 Spring Framework 的一部分,與 Spring 框架可自然引入整合。
優點:
減少 SQL 操作的細節,並專注於物件導向設計時 ...
Spring MVC - Thymeleaf
這篇來補充一下一些 Spring MVC 的 View 的部分吧,這部分其實就是前端的處理,雖然業界許多已經前後端分離,所以後端只需要著重在 Spring Boot 本身的後端 Server 上進行資料的處理,但其實過去前後端整合 FullStack 的部分也是有許多公司仍在使用, Spring Boot 其實也有提供和許多前端模板整合的方式來進行全端的處理,所以這部分如果碰到也是需要
Thymeleaf
SpringBoot 推薦使用的 web 前端模板引擎
能夠輕鬆實現 MVC 架構並配合後端資料動態渲染前端頁面
可在 Html 中嵌入動態內容
其他類似的模板引擎: JSP, Freemarker, Groovy, Velocity 等
引入套件及配置pom.xml
1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId></dep ...
Spring MVC - 基本介紹
Spring MVCSpring MVC 是基於 Servlet API 建構的網頁開發框架,根據 MVC 架構的原則,提供了的合適的開發流程和功能,也是 Spring 框架的一部分,可與 Spring 生態系統無缝整合。
Spring MVC 中的 MVC 架構一般我們常說到的 MVC 架構,就是 Model, View, Controller 這三層,在 Spring Boot 中則是定義成 Dao, Service, Controller, Template(View),前端部分就是 View 層的處理,而 Spring Boot 則是針對後端資料部分進行處理剩下的 Controller、Model。
Controller
Controller: 針對請求首先進入的位置,就是一個 API 或是 APP 的進入點,通常只負責將請求處理,驗證,並讓符合格式的請求進入到後面 Service 進行後續資料處理
Model
Service: 業務邏輯處理,根據請求與資料庫溝通,拿出對應的資料進行操作
Dao: 負責與資料庫溝通的介面,早期透過 JPA 來處理,現多半透過資料庫操作的框架輔 ...