精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Go項目實戰-代碼里有API調用時單元測試怎么做?

開發 前端
觀察 CreateOrderPay 中的代碼我們發現,方法中除了對微信支付API的請求外 getToken、genPayInvokeInfo 這兩個 WxPayLib 中定義的私有方法分別做了拿微信支付請求Token 和生成前端喚起微信客戶端進行支付的參數的工作。

與數據庫的CURD操作類似,當我們對包含API接口調用的代碼進行單元測試時,肯定也是希望即不用對接口發起真正的網絡請求調用,也能驗證我們的API對接程序是否符合預期。那么今天我們就聚焦于怎么為與API對接程序做單元測試,本節大綱如下:

圖片圖片

在開發項目的過程中總會遇到要調用依賴方接口的情況,如果依賴方的API接口還沒有開發好,通常我們會先約定好API接口的請求參數、響應結構和各類錯誤對應的響應碼。這時雙方再按照這個約定同步進行開發。

除了上面說的情況外,還有一種就是當你開發的功能需要與微信支付類的API進行對接時,因為各種訂單、簽名、證書等的限制你在開發階段也不能直接去調用支付的API來驗證自己開發的程序是否能成功完成對接,這種時候我們該怎么辦呢?很多人會說發到測試環境讓QA造單子測,很多公司里的項目也確實是這么干的。

針對上面說的這些情況,我們有沒有什么辦法在開發階段就能通過單元測試來驗證我們寫的程序符不符合預期呢?這就需要我們掌握對API調用進行Mock的技巧了。

API 調用Mock 基礎

gock 是 Go 生態下一個提供無侵入 HTTP Mock 的工具,用來在單元測試中Mock API 的調用,即不對要請求的API發起真正的網絡調用,而是由gock攔截到請求后返回我們指定的Mock響應。

它支持用請求參數、請求頭、請求體等方式設置攔截請求的匹配條件,一旦匹配成功就會攔截測試程序中對API的調用,返回我們提前預設好的響應。

gock 的安裝方法如下

go get -u github.com/h2non/gock

關于 gock 的基本使用方法,可以參考我寫的這篇文章:用gock 攔截HTTP請求,Mock API調用 。我們接下來直接進入API Mock的實戰環節。

API Mock 測試實戰

我們項目的API對接都放在了API對接層 library 中,實戰環節中我挑選了兩個API對接邏輯演示如何對他們進行Mock單元測試,它們正好能覆蓋了GET、POST兩種請求方式下按照請求參數匹配攔截API請求和JSON請求體匹配攔截API請求。

單元測試入口TestMain的設置

我們項目里的對外API對接都放在library層中,按照上節課我們為項目做的的單元測試目錄規劃,它的單元測試_test.go 文件都應該放在test/library 目錄中。

.
|---test
|     |---controller    # controller 的測試用例
|     |---dao    # dao 的測試用例
|     |---domainservice # 邏輯層領域服務的測試用例
|     |---library # 外部API對接的測試用例

在開始寫單元測試前我們還是需要在TestMain方法中做一些 library 包中單元測試的初始化基礎工作。

func TestMain(m *testing.M) {
 client := &http.Client{Transport: &http.Transport{}}
 gock.InterceptClient(client)
 // 把框架的httptool使用的http client 換成gock攔截的client
 httptool.SetUTHttpClient(client)
 os.Exit(m.Run())
}

因為我們項目中的API調用都是httptool來發起的,所以我們需要把 httptool持有的全局httpClient 替換成由 gock 做了攔截的httpClient,只有這樣才能為項目中library層中封裝的各個API對接程序做攔截和Mock。

實戰案例一:IP地址查詢的Mock測試

實戰環節先來一個簡單點的案例,在library中我們曾經演示過一個用 whois API 查詢本機IP詳情的程序,具體程序如下:

func (whois *WhoisLib) GetHostIpDetail() (*WhoisIpDetail, error) {
 log := logger.New(whois.ctx)

 httpStatusCode, respBody, err := httptool.Get(
  whois.ctx, "https://ipwho.is",
  httptool.WithHeaders(map[string]string{
   "User-Agent": "curl/7.77.0",
  }),
 )
if err != nil {
  log.Error("whois request error", "err", err, "httpStatusCode", httpStatusCode)
returnnil, err
 }
 reply := new(WhoisIpDetail)
 json.Unmarshal(respBody, reply)

return reply, nil
}

里面的邏輯很簡單,只有一個簡單的對whois API 的GET方式的請求調用,我們對 WhoisLib 的GetHostIpDetail 方法做單測時,可以對whois的API做Mock,讓API返回我們指定的IP地址,然后讓測試程序驗證 GetHostIpDetail 方法返回的是不是這個指定的IP地址。

具體的單元測試方法如下:

func TestWhoisLib_GetHostIpDetail(t *testing.T) {
 defer gock.Off()
 gock.New("https://ipwho.is").
  MatchHeader("User-Agent", "curl/7.77.0").Get("").
  Reply(200).
  BodyString("{\"ip\":\"127.126.113.220\",\"success\":true}")

 ipDetail, err := library.NewWhoisLib(context.TODO()).GetHostIpDetail()
 assert.Nil(t, err)
 assert.Equal(t, "127.126.113.220", ipDetail.Ip)
}

你可能會說這個例子也太簡單了,別著急,接下來我們來個難的。

實戰案例二:微信支付的Mock測試

當在開發的功能需要與微信支付類的API進行對接時,因為各種訂單、簽名、證書等的限制,在開發階段不能直接去調用支付的API來驗證自己開發的程序是否能成功完成對接,在這種情況下如果能掌握API Mock技巧,能讓我們提前做好自己開發程序的邏輯驗證。

我們拿項目 WxPayLib 中的 CreateOrderPay 方法來給大家舉例子,這個方法會根據訂單數據向微信支付的JSAPI發起支付預下單,拿到預下單ID后再生成前端喚起微信進行支付所需要的信息返給前端。

CreateOrderPay 方法的實現如下:

func (wpl *WxPayLib) CreateOrderPay(order *do.Order, userOpenId string) (payInvokeInfo *WxPayInvokeInfo, err error) {
// 創建預支付單
// 微信支付文檔:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_1.shtml
 payDescription := fmt.Sprintf("GOMALL 商場購買%s 等商品", order.Items[0].CommodityName)
 prePayPram := &PrePayParam{
  AppId:       wpl.payConfig.AppId,
  MchId:       wpl.payConfig.MchId,
  Description: payDescription,
  OutTradeNo:  order.OrderNo,
  NotifyUrl:   wpl.payConfig.NotifyUrl,
 }
 prePayPram.Amount.Total = order.PayMoney
 prePayPram.Amount.Currency = "CNY"
 prePayPram.Payer.OpenId = userOpenId
 reqBody, _ := json.Marshal(prePayPram)
 token, err := wpl.getToken(http.MethodPost, string(reqBody), prePayApiUrl)
if err != nil {
  err = errcode.Wrap("WxPayLibCreatePrePayError", err)
return
 }
 _, replyBody, err := httptool.Post(wpl.ctx, prePayApiUrl, reqBody, httptool.WithHeaders(map[string]string{
"Authorization": "WECHATPAY2-SHA256-RSA2048 " + token,
 }))
if err != nil {
  err = errcode.Wrap("WxPayLibCreatePrePayError", err)
return
 }
 prepayReply := struct {
  PrePayId string`json:"prepay_id"`
 }{}
if err = json.Unmarshal(replyBody, &prepayReply); err != nil {
  err = errcode.Wrap("WxPayLibCreatePrePayError", err)
return
 }
// 生成前端調起支付需要的參數
 payInvokeInfo, err = wpl.genPayInvokeInfo(prepayReply.PrePayId)
if err != nil {
  err = errcode.Wrap("WxPayLibCreatePrePayError", err)
 }
return payInvokeInfo, nil
}

觀察 CreateOrderPay 中的代碼我們發現,方法中除了對微信支付API的請求外 getToken、genPayInvokeInfo 這兩個 WxPayLib 中定義的私有方法分別做了拿微信支付請求Token 和生成前端喚起微信客戶端進行支付的參數的工作。

那么想要對 CreateOrderPay 進行單元測試除了Mock方法中對微信支付預下單接口的API請求外,還需要Mock 依賴的getToken和genPayInvokeInfo兩個方法的返回,而且因為它們兩個是私有方法,在test目錄Mock 它們就必須使用支持 Mock 私有方法的工具,好在Go的生態夠全,這里我使用的是gomonkey這個庫。

完成這個測試程序中主要分三步

  • 造Order訂單數據。
  • 為WxPayLib的genToken方法打樁,指定我們期望的返回。
  • 使用 gock Mock 對 https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi 的調用。
  • 為WxPayLib的genPayInvokeInfo方法打樁,指定我們期望的返回。
  • 用 assert 斷言各種結果,決定單元測試是否成功。
責任編輯:武曉燕 來源: 網管叨bi叨
相關推薦

2022-05-09 08:55:52

ORMMockGo

2025-04-28 01:55:00

工具sqlmockSQL

2021-09-18 15:40:03

Vue單元測試命令

2022-04-08 09:01:56

腳本Go應用單元

2012-05-17 09:09:05

Titanium單元測試

2025-02-06 08:54:45

gockGoHTTP

2017-01-14 23:42:49

單元測試框架軟件測試

2022-08-02 08:07:24

單元測試代碼重構

2014-02-25 10:25:52

單元測試測試

2019-12-18 10:25:12

機器學習單元測試神經網絡

2024-01-09 08:08:12

Go單元測試系統

2025-08-28 01:00:00

Go單元測試

2011-07-27 17:02:12

Xcode iPhone 單元測試

2009-06-26 17:48:38

JSF項目單元測試JSFUnit

2017-01-16 12:12:29

單元測試JUnit

2017-01-14 23:26:17

單元測試JUnit測試

2021-05-17 05:51:31

KubeBuilderOperator測試

2020-08-18 08:10:02

單元測試Java

2016-09-21 10:18:26

阿里Dubbo性能測試

2017-03-23 16:02:10

Mock技術單元測試
點贊
收藏

51CTO技術棧公眾號

麻豆精品久久久久久久99蜜桃| av黄色一级片| 91麻豆国产福利在线观看宅福利| 国产激情精品久久久第一区二区 | 99久久综合狠狠综合久久止| 日本少妇bbwbbw精品| 日本激情一区| 精品国产1区2区3区| 国产自偷自偷免费一区| 精灵使的剑舞无删减版在线观看| 国产日韩欧美精品综合| 国产一区二区三区免费不卡| 91丨porny丨在线中文 | 欧美在线aaa| 久久五月精品中文字幕| 中文字幕亚洲欧美在线不卡| 欧美高清性xxxxhd| 亚洲成人黄色片| 人人超碰91尤物精品国产| 国内精久久久久久久久久人| 久久噜噜色综合一区二区| 欧美猛男同性videos| 亚洲国产精彩中文乱码av在线播放 | 麻豆精品国产免费| 欧洲乱码伦视频免费| 亚洲国产天堂网精品网站| 手机精品视频在线| 中文字幕久热精品视频在线| 日本大胆人体视频| 日本www在线观看| 久久久久久久久久美女| 国内视频一区| 免费看黄色一级视频| 国产乱码字幕精品高清av | 国产激情精品一区二区三区| 在线视频中文字幕一区二区| 乱人伦xxxx国语对白| 手机在线免费看av| 亚洲精选一二三| 综合视频在线观看| 黄色网在线免费观看| 国产精品第13页| 亚洲国产高清国产精品| 成人综合影院| 国产网站一区二区三区| 日韩av一级大片| 国产经典自拍视频在线观看| 久久精品人人做| 日韩片电影在线免费观看| 国产小视频在线| 久久蜜臀中文字幕| 日本精品二区| 成人精品一区二区三区校园激情| 国产日韩视频一区二区三区| 日韩欧美精品一区二区| 91精彩视频在线观看| 六九午夜精品视频| 国产精品嫩模av在线| 日韩一级片网址| 美女被艹视频网站| 豆花视频一区二区| 日韩精品高清在线观看| 中文字幕人妻一区二区三区在线视频| 国产一区二区三区电影在线观看| 最近2019免费中文字幕视频三| 美国精品一区二区| 亚洲综合五月| 国内揄拍国内精品| 在线观看日本视频| 免费av网站大全久久| 91久久国产精品91久久性色| 亚洲av少妇一区二区在线观看| 成人av午夜影院| 日韩高清国产精品| 粗大黑人巨茎大战欧美成人| 性做久久久久久免费观看| 人妻有码中文字幕| 黄页免费欧美| 精品av综合导航| 无码少妇精品一区二区免费动态| 国产电影一区二区在线观看| 欧美黑人视频一区| 男人日女人网站| 久久99精品国产| 精品一区二区三区日本| 99精品老司机免费视频| 亚洲一区二区三区四区在线| 熟妇人妻va精品中文字幕| 自拍偷拍亚洲| 日韩电影中文字幕| 国产精品嫩草影院俄罗斯| 亚洲国产一区二区精品专区| 国产精品视频在线观看| 刘玥91精选国产在线观看| 日本一区二区三区国色天香 | 欧美性久久久| 国产成人精品综合久久久| 精品国产999久久久免费| 久久综合狠狠综合| 800av在线免费观看| 奇米777日韩| 精品国产免费视频| 免费看特级毛片| 免费视频一区二区三区在线观看| 97神马电影| 午夜精品一区| 色94色欧美sute亚洲线路一ni| 日本黄色www| 成人一区二区| 45www国产精品网站| 国产99视频在线| 国产精品午夜春色av| 精品国产一二三四区| 亚洲精品a区| 日韩视频精品在线| 欧美特级黄色片| 波多野结衣在线aⅴ中文字幕不卡| 一本色道久久综合亚洲精品婷婷| 中文字幕影音在线| 精品女同一区二区| 精品欧美一区二区久久久久| 另类小说综合欧美亚洲| 欧美三日本三级少妇三99| xxxx在线视频| 日韩一区二区三区视频| 99精品中文字幕| 日本系列欧美系列| 欧美日韩电影一区二区| 午夜激情电影在线播放| 亚洲成人久久网| 久久久精品一区二区涩爱| 国产一区二区在线看| 中文字幕剧情在线观看一区| jizz久久久久久| 一区二区三区国产在线观看| 天干夜夜爽爽日日日日| 97精品超碰一区二区三区| 青青草精品视频在线| 国产精品极品国产中出| 国色天香2019中文字幕在线观看| 精品人妻午夜一区二区三区四区| 亚洲日本乱码在线观看| 国产精品自在自线| 久久久久久久久久久妇女| 成人精品久久一区二区三区| 黄网站在线免费看| 制服丝袜av成人在线看| 欧美日韩精品在线观看视频 | 综合五月激情网| 国产一区二区三区在线观看免费视频 | 欧美在线亚洲| 成人黄色在线免费观看| 自拍亚洲图区| 精品免费国产二区三区| 一级片免费网址| 久久色在线视频| 成人黄色一区二区| 奇米影视亚洲| 91在线色戒在线| 日本乱理伦在线| 亚洲激情在线观看| 日日夜夜狠狠操| 国产精品久久午夜| 中文字幕1区2区| 亚洲综合精品| 亚洲资源视频| 1313精品午夜理伦电影| 欧美性受xxxx白人性爽| av成人手机在线| 欧美一区二区三区婷婷月色| 久久婷婷综合国产| 久久久久久免费| 女人高潮一级片| 亚洲一本视频| 水蜜桃一区二区| 亚洲精品一区二区三区在线| 欧美亚洲视频在线看网址| 在线观看免费黄色| 精品久久久久一区| 波多野结衣日韩| 樱桃视频在线观看一区| 中文字幕第4页| 国产精选一区二区三区| 激情六月丁香婷婷| 女人色偷偷aa久久天堂| 欧美大香线蕉线伊人久久国产精品| 日本一区二区三区中文字幕| 国a精品视频大全| 在线中文资源天堂| 日韩激情片免费| 国产女人高潮毛片| 日本精品一区二区三区高清| 538精品在线视频| 久久久欧美精品sm网站| 第一页在线视频| 日韩在线a电影| 日韩 欧美 视频| 四虎成人精品永久免费av九九| 国产日韩二区| 91麻豆精品| 青青久久aⅴ北条麻妃| 日本高清成人vr专区| 永久免费毛片在线播放不卡| 蜜臀av免费在线观看| 欧美日韩亚洲综合一区| 天堂а√在线中文在线新版| 亚洲午夜在线电影| www.xx日本| 久久九九影视网| 国产伦精品一区三区精东| 激情另类小说区图片区视频区| 日韩少妇内射免费播放18禁裸乳| 欧美一区国产在线| 一本一本a久久| 成人3d动漫在线观看| 久久精品国产理论片免费| 最新精品在线| 91久久极品少妇xxxxⅹ软件| 精品亚洲a∨| 国产精品老女人精品视频| 爱搞国产精品| 午夜精品国产精品大乳美女| 怡红院在线播放| 久久九九免费视频| 1pondo在线播放免费| 夜夜躁日日躁狠狠久久88av| 日本国产在线| 亚洲精品视频中文字幕| 特黄视频在线观看| 精品国精品国产尤物美女| 精品国自产在线观看| 555www色欧美视频| 国产精品一区二区三区在线免费观看| 欧美性色黄大片| www.久久网| 欧美在线视频你懂得| 18国产免费视频| 欧美性生活影院| 亚洲综合免费视频| 欧美日韩高清一区| 国产又粗又猛视频免费| 欧美日韩三级一区二区| 一本色道久久综合无码人妻| 欧美日本韩国一区二区三区视频| 中文字幕在线观看精品| 欧美男女性生活在线直播观看| 一级aaaa毛片| 777午夜精品视频在线播放| 99久久精品国产一区色| 精品黑人一区二区三区久久| 少妇高潮一区二区三区99小说| 亚洲国产日韩欧美在线动漫| 欧美精品a∨在线观看不卡| 夜夜嗨av色一区二区不卡| 亚洲乱亚洲乱妇| 久久国产精品久久久| 国产99re66在线视频| 69视频在线免费观看| 欧美成a人片在线观看久| 国产精品嫩草视频| 国产成年精品| 精品婷婷色一区二区三区蜜桃| 久久综合影院| 国产又粗又大又爽的视频| 亚洲无线一线二线三线区别av| 精品视频免费在线播放| 久久亚洲欧洲| 免费看的av网站| 91视频一区二区| 国产成人免费观看网站| 亚洲精品欧美二区三区中文字幕| 精品无码一区二区三区蜜臀| 亚洲午夜免费福利视频| 日本a级c片免费看三区| 欧美裸体一区二区三区| 丰满少妇在线观看bd| 一本色道久久88综合亚洲精品ⅰ| 欧美成人三区| 性欧美视频videos6一9| 国产精品一区二区免费福利视频 | 日韩高清三区| 亚洲一区二区免费视频软件合集| 国产综合婷婷| 国产又大又黄又粗的视频| 国产乱码精品1区2区3区| 亚洲欧美色图视频| 亚洲欧洲精品成人久久奇米网| 国产第100页| 欧美日韩国产综合一区二区 | 国产蜜臀av在线一区二区三区| 日本妇女毛茸茸| 在线观看日韩av先锋影音电影院| 精品久久久无码中文字幕| 亚洲欧美另类国产| 亚洲h片在线看| 国产精品黄视频| 成人高潮视频| 亚洲最大免费| 久久久久国产一区二区| 久久久久亚洲av无码专区首jn| 日本一区二区三区国色天香| 日韩欧美三级视频| 欧美一区二区三区视频免费| 欧美18xxxxx| 韩国视频理论视频久久| 精品国产亚洲一区二区三区大结局| 久久久综合香蕉尹人综合网| 欧美午夜不卡影院在线观看完整版免费| 黄色一级免费大片| 91美女片黄在线| 18精品爽视频在线观看| 在线电影院国产精品| 电影av在线| 国产成+人+综合+亚洲欧美丁香花| 懂色av一区二区| 国产又粗又大又爽的视频| 免费观看30秒视频久久| 91网站免费入口| 精品欧美一区二区三区| 黄色美女一级片| 欧美另类xxx| 国产精品高清一区二区| 亚洲三级一区| 美洲天堂一区二卡三卡四卡视频| 免费看黄色的视频| 色婷婷av一区| 毛片在线播放网址| 欧美一区三区三区高中清蜜桃| 九九热播视频在线精品6| av片在线免费| 国产精品一二二区| 天天操夜夜操av| 欧美乱熟臀69xxxxxx| 最新真实国产在线视频| 国产日韩视频在线观看| 日韩免费高清| 潘金莲激情呻吟欲求不满视频| 中文字幕av一区 二区| 中文精品久久久久人妻不卡| 亚洲小视频在线| 福利视频一区| 一区二区视频在线播放| 国内成+人亚洲+欧美+综合在线| 二区三区四区视频| 91麻豆精品国产自产在线观看一区| 国产传媒在线播放| 91九色在线观看| 最新日韩欧美| 黄色国产在线观看| 一本色道久久综合亚洲精品按摩| 国产三级电影在线| 国产精品永久免费| 女人香蕉久久**毛片精品| 国产麻豆剧传媒精品国产av| 精品国产成人在线| 黄色大片在线看| 国产精品视频成人| 你懂的一区二区| 国产国语性生话播放| 色av一区二区| 黄色一级大片在线免费看产| 91视频免费在线观看| 亚洲国产日本| 国产又粗又猛又爽视频| 在线播放亚洲一区| caoporn-草棚在线视频最| 免费在线国产精品| 美女看a上一区| 久久久精品国产sm调教| 亚洲人成免费电影| 欧美亚洲综合视频| 成人在线播放网址| 国产日韩欧美高清| 亚洲h视频在线观看| 日本午夜人人精品| 久久久久蜜桃| 久久国产精品无码一级毛片| 欧美视频日韩视频在线观看| www.久久久久.com| 欧美中日韩一区二区三区| 久久成人久久鬼色| 亚洲精品77777| 久久久www成人免费精品| 欧美wwwsss9999| 国产视频1区2区3区| 精品久久久中文| 成人黄视频在线观看| 你懂的视频在线一区二区| 精品亚洲成a人在线观看| 午夜精品三级久久久有码| 色妞一区二区三区| 天堂av一区二区三区在线播放| 免费成年人高清视频| 午夜伦理一区二区| 久做在线视频免费观看| 快播亚洲色图| 国产成人精品影院| 一本色道久久综合无码人妻| 3344国产精品免费看| 欧美一区二区三区另类|