iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0
Mobile Development

在 iOS 專案上加上 Unit testing - 因為 You need testing系列 第 5

D5 - 在 iOS 專案加上測試-You need testing {從後端回來的 json 開始寫測試 part 1}

  • 分享至 

  • xImage
  •  

現在的 iOS 專案,前端開發者的主要工作,通常是發 URLRequest 給後端,在收到後端的 response json 後,在前端進行畫面渲染。接下來我們進行 data model 的 Unit testing。

使用 JSON placeholder 進行解析

https://jsonplaceholder.typicode.com/

這個網站提供了假資料,讓前端開發者可以發 URLRequest 取得一包假資料,並使用這些假資料讓前端畫面看起來比較像一個產品。

一開始的範例是 posts,如果要取得 post_id 為 1 的貼文,可以直接按下網站上的 run script。

fetch('https://jsonplaceholder.typicode.com/posts/1')
  .then((response) => response.json())
  .then((json) => console.log(json));

就會得到

{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}

除了 posts (貼文)以外,這個網站還提供了其他的假資料,這邊例表如下。

https://jsonplaceholder.typicode.com/posts 100 posts
https://jsonplaceholder.typicode.com/comments 500 comments
https://jsonplaceholder.typicode.com/albums 100 albums
https://jsonplaceholder.typicode.com/photos 5000 photos
https://jsonplaceholder.typicode.com/todos 200 todos
https://jsonplaceholder.typicode.com/users 10 users

https://ithelp.ithome.com.tw/upload/images/20230915/20140622bWnVApQI4w.png

接下來,我們用 postman 打 users 看看

點擊 users 後,你會取得 10 個 users,而這串網址,就是讓你取得 json response 的地方。但,我們接下來會使用 postman 這個工具進行取 json response。在這種簡單的 request 上,使用網頁和 postman 來說,並沒有差別,甚致網頁還會快一點。但在實務上,你有可能遇到 POST, PUT, DELETE 等這些 method,這時候 postman 進行測試就會快很多。甚致, postman 還可以進行 script 等邏輯操作,學會使用 postman 的話,真的會讓開發工作加速不少。

https://ithelp.ithome.com.tw/upload/images/20230915/20140622NlMV2uMnwC.png

Postman

postman 的下載網站

https://www.postman.com

下載後,將 json placeholder 網址貼上

https://ithelp.ithome.com.tw/upload/images/20230915/20140622wAsQ9F5PfB.png

接下來,我們就可以拿這包 response json 進行 Unit testing 了。在寫 decode data model 的時候,並不會真的呼叫 api request,而是使用固定的 json response 進行 decode unit teting。如果真的打 api,在 FIRST 原則中,會在 fast 和 repeatable 這兩項中遇到挫折。假設後端回應時間在 0.2 秒,那 500 個 api 的 test,就會花上 100 秒,這會干擾開發。也因為真的打 api,無法保證 repeatable。所以在 api 的測試上,通常會用 mock response 進行測試。

單元測試的 F.I.R.S.T 原則

  • Fast:Unit test 應該快速執行,不要花費太多時間或資源。
  • Independent:Unit test 應該獨立於其他測試,不要互相影響或依賴。
  • Repeatable:Unit test 應該可以在任何環境或情況下重複執行,並得到一致的結果。
  • Self-validating:Unit test 應該有明確的通過或失敗的標準,不要需要人工檢查或驗證。
  • Timely:Unit test 應該及時編寫,最好在開發程式碼之前或同時進行,以驅動設計和重構。

快速宣告 Decodable Model 的方法: 使用網站幫你建立 Model

如果已經有 json response 的格式了,網路上有很多工具,可以快速的幫你把 Data Model 建立好。下面這個是我常用的網站。要注意的是,在得到 Model 程式碼後,還是要檢查一遍。有些時候,網站產生出來的型別不是最適合使用情境的。例如 Int 或 Double 的選擇,所以一定要人工再看一次產出來的程式碼。

https://app.quicktype.io/

https://ithelp.ithome.com.tw/upload/images/20230915/20140622FKXWaidb33.png

如上圖,只要在左邊把 json 貼上去,右邊就會生成 Model 物件的宣告。

以下就是 quicktype 生出來的物件

// This file was generated from JSON Schema using quicktype, do not modify it directly.
// To parse the JSON, add this file to your project and do:
//
//   let user = try? JSONDecoder().decode(User.self, from: jsonData)

import Foundation

// MARK: - UserElement
struct UserElement: Codable {
    let id: Int
    let name, username, email: String
    let address: Address
    let phone, website: String
    let company: Company
}

// MARK: - Address
struct Address: Codable {
    let street, suite, city, zipcode: String
    let geo: Geo
}

// MARK: - Geo
struct Geo: Codable {
    let lat, lng: String
}

// MARK: - Company
struct Company: Codable {
    let name, catchPhrase, bs: String
}

typealias User = [UserElement]

請記得,在使用上,還要再看一次這個網站幫你宣告的型別,是不是合理的。不合理就要手動進行修改。


上一篇
D4 - 在 iOS 專案加上測試-You need testing {情境假設: 在專案中擴充 feat 時,你會遇到的狀況}
下一篇
D6 - 在 iOS 專案加上測試-You need testing {從後端回來的 json 開始寫測試 part 2}
系列文
在 iOS 專案上加上 Unit testing - 因為 You need testing32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言