開源 Mock 工具 [djmockserver]~~~歡迎使用 star

大瓶子發表於2020-04-15

djmockserver

介紹

本程式是基於django開發的mock server, 用於構造動態的複雜的mock響應.

在我另外的專案<BTest介面測試平臺>中使用開源工具moco作為mock服務. 然而, moco對於實際應用中構造複雜動態的響應的需求, 似乎並沒有很好的滿足, 需要二次開發定製. 為了滿足專案需要,就簡單的開發了此程式.

雖然簡單, 但也實用. 對照moco的用法, 本程式也使用json檔案來管理mock資料, 並可以使用多層目錄來管理檔案. 支援http/https.

專案地址: https://gitee.com/scu-zrb/djmockserver

特性說明

  1. json格式儲存mock資料(與moco類似),支援單檔案或多層目錄多檔案管理資料檔案
  2. 根據請求內容匹配,同一uri可配置多種響應結果
  3. mock資料修改實時更新無須重啟服務(增刪mock檔案需重啟)
  4. 支援python字串表示式(有白名單設定)執行,生成動態資料
  5. 支援自定義函式用於構造響應資料
  6. mock介面uri與真實uri保持一致
  7. 支援非mock介面的請求轉發

軟體架構

djmockserver 架構圖

安裝教程

  1. git clone下載專案
  2. 切換到專案根目錄 pip install -r requirements.txt
  3. 配置mock資料檔案,字尾為.json,可N個mock檔案,支援多層目錄管理
  4. 修改配置 djmockserverproject/settings.py 檔案(檔案路徑必填)
  5. 執行服務 python manage.py runserver
  6. 使用三方庫擴充後可支援https
# djmockserverproject/settings.py
# 必填 mock資料檔案路徑,可以是單個檔案,或資料夾
MOCK_FILE_PATH = os.path.join(BASE_DIR, 'djmockserver', 'mockdata')
# MOCK_FILE_PATH = os.path.join(BASE_DIR, 'mock.json')

# mock資料檔案重新整理間隔, 單位:
REFRESH_INTERVAL = 2

# 選填 設定後,mock在匹配請求失敗時,會把請求轉發到此地址, 否則返回404
# REMOTE_HOST = 'http://127.0.0.1:8000'

# 選填 設定函式白名單列表
ADD_FUNC = ['len', 'str']

使用說明

Mock檔案欄位

1. request 支援的欄位 (參考 RequestSerializer 類)
  • uri: str
  • method: str
  • queries: dict
  • form/json: dict
  • body: str 非form和json格式的內容,如文字、html、xml等資料
  • cookies: dict
  • description: str 描述性文字
2. response 支援的欄位 (參考 ResponseMaker 類)
  • status: int 響應碼
  • headers: dict 頭域
  • vars: dict 設定區域性變數, 從上往下,優先順序增加. 變數執行先於響應(text/json)
  • text: str
  • json: dict 預設content-type為application/json
  • text與json互斥,同在時json優先

Mock檔案格式

與moco格式一致, 以列表套字典的形式編寫, 具體欄位參考上面說明

[
{
"description": "",
"request": {},
"response": {}
},
{
"description": "",
"request": {},
"response": {}
}
]

可以多個檔案儲存多個URI響應列表(此時應該配置MOCK_FILE_PATH為檔案所在目錄)

構造動態響應

只要是符合python語法的字串表示式,且在白名單(變數函式)中,均可執行.

1. 變數
  • 只允許使用response中設定的區域性變數和settings中設定的全域性變數(如有).
2. 響應
  • 擴充函式(djmockserver\mock\extend_func\extend_functions.py): 自行擴充,定義函式,用於變數和響應中.

  • 函式白名單(ADD_FUNC):為了安全考慮,限制python內建函式的使用.如要使用,需要新增函式到白名單中.

3. mock配置樣例
  • 路徑: djmockserver\mockdata\

提取請求

配合函式collection_get和變數req, 可以提取請求資料, 處理後作為響應內容返回.

請求轉發

主要是開發同學會用得上. 考慮到在實際開發中, host都是一處配置全域性使用, 和uri分離. 而大多數的介面都有前置介面, 有上下文關係.

這時要使用mock,要麼把全域性host配置為mock地址而前置介面也mock掉,要麼在被mock介面程式碼增加區域性host(mock地址).

很明顯兩種方式都不好.這種情況下轉發請求就比前面的更合適.

只需配置全域性host為mock地址,並在本程式settings.py檔案中配置轉發地址即可.只要是未mock的請求都會轉發.
轉發請求

TODO

  1. 增加mock資料管理頁
  2. 更多協議的支援?

最後

程式碼設計地不夠優雅, 還有很多地方有待斟酌, 基本滿足工作而已.

相關文章