如何根據protobuf來Mock後台返回的資料

2021-09-16 12:54:54 字數 3119 閱讀 2187

google protocol buffer( 簡稱 protobuf) 是 google 公司內部的混合語言資料標準,他們用於 rpc 系統和持續資料儲存系統。

protocol buffers 是一種輕便高效的結構化資料儲存格式,可以用於結構化資料序列化,或者說序列化。它很適合做資料儲存或 rpc 資料交換格式。可用於通訊協議、資料儲存等領域的語言無關、平台無關、可擴充套件的序列化結構資料格式。為什麼要講到它,因為我們後台的協議就是用的它。

mock也可以叫mock object,模擬物件,在物件導向程式設計中,以可控的方式模擬真實物件行為的假物件。前端比較有名的庫是mock.js。

為什麼要mock呢?

1、前後端分離,並行開發,能夠充分利用人力,避免等待。

2、可以豐富測試用例,提前模擬很多的真實場景資料,而不必等到線上環境才發現問題。

但mock.js有個問題:學習和配置成本高。

// 配置 mock 路徑

require.config(

})// 載入 mock

require(['mock'], function(mock)]

})// 輸出結果

document.body.innerhtml +=

'' +

json.stringify(data, null, 4) +

'

'

})// ==>

, ,]}

用它之前必須要先配置乙個ajax的請求路徑,然後根據後台的協議,學習mock的語法,才能模擬出list這個陣列。所以這裡存在著兩個問題:

1、配置成本和語法學習成本

2、後台協議轉換為mock語法

很多時候,等到我們開發完業務邏輯,已經沒有多少耐心來寫這個mock邏輯,簡單的協議還好,如果涉及到很複雜的,寫這個mock的邏輯就更加不願意。

為了幫前端同學偷個懶,有必要把這個過程給省了。

git上已經有針對protobuf開源的js介面:因為構建工具我們使用的是gulp,同樣的也有個對應的外掛程式:gulp-protobufjs,但是沒法拿來就用。

首頁我們來看下這個gulp-protobufjs外掛程式所做的事情

var gulp = require('gulp');

var gulpprotobuf = require('gulp-protobufjs');

gulp.task('default', function () );

讀取proto檔案,然後生成乙個檔案,檔案型別可以自定義。

如果產出的是.js檔案,那麼結果是commonjs模組檔案:

module.exports = require("protobufjs").newbuilder({})['import'](,,]

},……

很顯然,這不是我們想要的最終結果。我們想要的結果是最終的ajax返回的資料。當然有了協議的json結構,字段型別、欄位名也都有了,剩下的事情就只需根據他們mock一些資料。這個json檔案可以理解為對介面的乙個描述檔案。

pb協議的rule常見的有以下幾種:

資料型別,有以下幾種最基本的型別,基本都可以對映為js常用的資料型別。

在解析pb檔案的時候,後台cgi介面名會被定義為message。

message getdicegameroomrequest

message getdicegameroomresponse }

乙個cgi介面在pb協議中的定義一般會成對的出現。requestresponse是所有介面標準的字尾,以區別普通的message。依賴這種規則,就可以把介面解析出來,並且也能夠知道其請求、返回的message。

從上面的pb協議看,message可以被巢狀,okresult是屬於getdicegameroomresponse子message。同乙個pb檔案下,message名可能重複,整個協議可以看成是一顆樹。如果要找對應的message,必須從當前節點的子節點開始查詢,否則可能找錯。

處理的流程比較簡單。如下圖所示:

通過分析知道介面名後,如果前端的請求都是統一的,就可以通過請求介面的**模板生成請求**。生成對應的api.js:

var promise = require('js/libs/promise');

var util = require('js/common/util');

var mock = require('./mock');

module.exports =

url: fetch_url + 'getsmobapremadeinfo',

data: ,

method: "post",

header: ,

success: resolve,

fail: reject,

……

這裡的資料都是呼叫mock.js生成的,當然我們可以加入一些業務的資料,這樣測試起來更加真實。

1、前端安全,模擬xss例子。

隨機生成一些xss用例,用於前端頁面的測試。

2、前端ui測試。

在實際工作中,經常會遇到文字截斷的問題。ui介面在多行文字的情況下會不會表現正常這個問題,在這種情況下就可以輕易的測試出來,而不需每次叫後台開發配合加一些假資料。

如下圖,我們可以針對字串型別的資料生成一些長文字。

所有的專案都在統一框架下,每個專案都保持統一的目錄結構,只需要自定義一些配置就能初始化專案腳手架,剩下的只需要專注於業務開發。

sqlalchemy根據表名動態建立model類

sqlalchemy根據表名動態建立model類 作用如題,直接上 吧,另外還支援 copy一張表的表結構,新建表並獲得model物件 coding utf 8 import traceback from sqlalchemy import biginteger,column,datetime,in...

sqlalchemy根據表名動態建立model類

作用如題,直接上 吧,另外還支援 copy一張表的表結構,新建表並獲得model物件 coding utf 8 import traceback from sqlalchemy import biginteger,column,datetime,integer,metadata,string,tab...

jquery如何根據多選框name來獲得選中的值。

根據多選框name來獲得選中的值可用如下 jquery 實現12 3 input checkbox name test checked each function 例項演示 給出兩組多選框,點選按鈕後分別獲得兩組中被選擇的專案 示例 如下 建立html元素12 3456 78910 1112 131...