《API Testing and Development with Postman》最新第二版封面
文章目錄
- 第十二章 模擬服務器(Mock servers)在 Postman 中的創建與用法
- 1 模擬服務器的概念
- 2 模擬服務器的創建
- 2.1 開啟側邊欄
- 2.2 模擬服務器的兩種創建方式
- 2.3 私有模擬器的 API 秘鑰的用法
- 3 常見的模擬服務器用法演示
- 3.1 Mock 服務器的工作原理
- 3.2 模擬 GET 請求:生成指定的響應內容
- 3.3 模擬報 500 錯誤碼的請求
- 3.4 模擬路徑參數
- 3.5 模擬從請求 JSON 中提取信息
- 3.6 模擬 PUT 請求
- 3.7 模擬第三方接口返回隨機數據
寫在前面
本章主要介紹了 Postman 中的模擬服務器(mock server)的基本用法。時隔四年,當初的操作界面和設置流程已經大大簡化了,掌握了本章介紹的基本用法,再結合 Postman 官方文檔的強大加持,模擬服務器這塊基本可以在工作中勝任了。
第十二章 模擬服務器(Mock servers)在 Postman 中的創建與用法
本章概要
- 模擬服務器的概念
- 在
Postman
創建模擬服務器的方法- 在
Postman
設置模擬數據的方法
Postman
中的模擬服務器(mock server)經過不斷地完善,現在已經比剛推出時好用很多了。本章內容看似很多,其實核心知識點只有幾個。重點把握模擬服務器的工作原理和常見的數據模擬方法即可。
1 模擬服務器的概念
基本概念:
- 本書中的模擬服務器(mock server),特指 API 接口的模擬服務器;
- 主要用途:模擬真實 API 服務器,可返回預設的 硬編碼 響應。
- 既可以模擬單一端點(簡單),也可以模擬多個端點(復雜),復雜程度取決于要測試的目標。
Mock 服務器的常見應用場景:
- 目標應用引入了第三方 API,但又不想為了測試專門去調該接口;
- 前端需要測試,但后端接口尚未就緒時;
- 進行與后端隔開的 UI 測試時(假設架構支持),通過 Mock 服務器提高測試速度與穩定性;
- 需要模擬特定錯誤場景來測試前端的響應時。
其他注意事項:
- Mock 服務器需要定期更新,以保持與真實服務的一致性。
- 要確保模擬數據的準確性,避免測試結果出現偏差。
Postman
對普通用戶僅提供每月累計 1000 次的模擬服務器總調用額度(注意:是對所有服務器的總調用次數),想要更多調用次數只能開通會員,或者換用其他免費帳號。
2 模擬服務器的創建
2.1 開啟側邊欄
首先開啟 Mock servers
側邊欄:
【圖 12.1 點擊側邊欄配置圖標,并開啟 Postman 模擬服務器側邊欄】
2.2 模擬服務器的兩種創建方式
創建模擬服務器的方法主要有 兩種:
-
從專門的
Mock servers
側邊欄創建: -
從
Collection
測試集合中創建:
具體創建根據界面提示進行即可,都沒有什么難度。
書中演示的是第一種,并且是從同步創建一個新的 Collection
集合開始:
【圖 12.2 Postman 模擬服務器創建頁面詳解】
2.3 私有模擬器的 API 秘鑰的用法
最后一項可將該模擬服務器變為私有服務器,除非提供有效的 API 秘鑰,否則任何人都無法訪問。API 秘鑰通過個人帳號的設置頁(https://web.postman.co/settings/me/api-keys
)創建:
【圖 12.3 設置私有模擬服務器時需要的 API 秘鑰的創建頁面截圖】
創建好后,將秘鑰存為一個變量(如 api_key
),然后在測試請求的 Authorization
標簽作如下配置即可:
【圖 12.4 用于訪問私有模擬服務器的 API 秘鑰的具體用法示例】
3 常見的模擬服務器用法演示
3.1 Mock 服務器的工作原理
按照剛才的流程創建出 Mock 服務器后,Postman
會自動生成一個同名的 Collection
測試集合,并在該集合下創建一個名為 url
的變量存放其基礎 URL,操作起來很輕松(Mock server
和 Collection
盡管同名,但各自的圖標有所不同):
【圖 12.5 創建好 Mock 服務器后,Postman 會自動創建同名集合與 url 變量】
在 Postman
中使用 Mock 服務器,其實就是通過對 請求示例 的各種配置,實現各種想要的 響應效果:
【圖 12.8 在 Postman 使用 Mock 服務器的基本流程】
3.2 模擬 GET 請求:生成指定的響應內容
通過修改請求示例的狀態碼和響應正文(Body
),可以模擬想要的響應內容:
【圖 12.9 修改請求示例的響應內容截圖】
注意,修改示例后 一定要保存,否則修改內容無法生效!
另外,響應正文的 JSON
代碼也支持 Alt + Shift + F 格式化,與 VSCode
一致,非常貼心。
3.3 模擬報 500 錯誤碼的請求
除了模擬正常情況,還可以新增一個示例,模擬請求報 500 錯誤的情況。方法只需兩步:
- 新建一個示例(Example),狀態碼改為 500,響應內容自擬;
- 在測試請求的請求頭添加
x-mock-response-code
屬性,值設為500
即可;
示例的設置如下:
對應的請求設置及測試結果如下:
3.4 模擬路徑參數
需求:從路徑中獲取 task_id
,并將該信息放入響應正文中。
方法:
-
定義示例:
-
URL 改為
{{url}}/tasks/{{task_id}}
; -
狀態碼暫定 200;
-
在響應正文中通過以下語法引用
task_id
:{"description":"Mock Task {{task_id}}","status":"Draft" }
-
-
修改測試請求:URL 直接寫
{{url}}/tasks/{{task_id}}
即可。
實測情況:
【圖 12.10 路徑參數的定義和獲取該參數的寫法示例】
【圖 12.11 實測請求參數的定義與捕獲情況(符合預期)】
3.5 模擬從請求 JSON 中提取信息
需求:從創建待辦事項的 POST
請求體 JSON
中,提取 description
和 status
字段信息,并作為響應內容的一部分。
方法:
-
創建一個名為
Create Task
的POST
請求:URL
設為{{url}}/tasks
,狀態欄填201 Created
,請求體的JSON
內容如下:{"description": "Read this book","status": "Draft","created_by": "user1" }
-
再在該請求下創建一個同名示例
Create Task
,其請求方式、URL
、狀態信息均與上述請求一致,唯獨響應體內容不同:{"description": "{{ $body 'description' }}","status": "{{ $body 'status' }}" }
-
保存示例,回到
POST
請求,發送請求即可看到如下效果:
重要提示
$body
是 Postman 引用請求體對象的固定寫法;訪問其中的某個屬性要寫成{{ $body 'key_name' }}
的形式,并且為了返回正確的數據類型,括號兩邊必須加引號,這一點書中是忽略的,很容易出現類型報錯。
3.6 模擬 PUT 請求
除了引用請求體的屬性值,Postman
還支持對該屬性設置默認值。例如,需要響應的 JSON
包含兩個字段 description
和 status
,示例還可以這樣設置默認值:
{"description": "{{$body 'description' 'Mock Task {{task_id}}'}}","status": "{{$body 'status' 'Draft'}}"
}
上述代碼中,如果請求體的 description
字段有效,則使用該字段值,否則以默認值 "Mock Task {{task_id}}"
進行響應,這里的 {{task_id}}
即上面演示過的路徑參數。同理,如果 status
能拿到有效值,則響應時返回對應的 status
屬性值,否則按默認值 "Draft"
處理。
實測示例:
實測請求1:兩個屬性值均有效
實測請求2:僅 description
有效
實測請求3:僅 status
有效
注意
經實測,
Postman
判定某個字段是否有效的方法,其實就是看該字段是否存在。如果存在,但賦值為""
、null
、"undefined"
,都會被視為有效值,如果不符合JSON
語法規范,則會直接報 400 錯誤:
【圖 12.12 違反 JSON 語法規范強行發送請求,Postman 將按 400 報錯處理】
3.7 模擬第三方接口返回隨機數據
Postman
內置了大量隨機變量,以應對各種需要設置隨機值的情況,例如城市名稱 $randomCity
、基于 uuid-v4
的唯一標識字符串 $guid
等,底層參考的是著名的第三方前端隨機模塊 Faker
(詳見:https://www.npmjs.com/package/@faker-js/faker)。更多內置變量列表及用法,詳見 Postman
官方文檔:https://learning.postman.com/docs/tests-and-scripts/write-scripts/variables-list/。
書中給出的示例寫法為:
{"country": "US","city": "{{$randomCity}}","language": "en_US","street": "{{$randomStreetAddress}}","Currency": "USD","id": "738964000000291009","state": "New York","first_name": "{{$randomFirstName}}","email": "{{$randomEmail}}","zip": 12345,"created_time": "{{$randomDateRecent}}","last_name": "{{$randomLastName}}","time_zone": "GMT","phone": "{{$randomPhoneNumber}}","dob": "{{$randomDatePast}}","status": "active"
}
可以得到如下結果:
{"country": "US","city": "East Hardyshire","language": "en_US","street": "73801 Isadore Villages","Currency": "USD","id": "738964000000291009","state": "New York","first_name": "Kylie","email": "Piper1@hotmail.com","zip": 12345,"created_time": "Sun Feb 02 2025 20:49:40 GMT+0000 (Coordinated Universal Time)","last_name": "Purdy","time_zone": "GMT","phone": "676-353-0567","dob": "Thu Jan 09 2025 19:30:06 GMT+0000 (Coordinated Universal Time)","status": "active"
}
實測截圖:
注意
Postman
中的內置隨機變量還可以用在測試腳本中,通過pm.variables.replaceIn()
函數進行訪問,例如:pm.variables.replaceIn('{{$randomFirstName}}')
,實測效果如下:
【圖 12.13 實測內置隨機變量在 Post-response 測試腳本中的用法】
由此也可以看出引號的重要作用,千萬不可忽略(感覺作者在這個細節上做得很不夠,多次出現漏掉引號的情況)。