GOLANG寬泛介面在測試中的大用處
考慮測試一個函式:
func request(ctx context.Context, hc *http.Client, api string) (err error) {
var hreq *http.Request
if hreq, err = http.NewRequest("GET", api, nil); err != nil {
return nil, errors.Wrap(err, "create request")
}
var hres *http.Response
if hres, err = hc.Do(hreq.WithContext(ctx)); err != nil {
return nil, errors.Wrap(err, "do request")
}
defer hres.Body.Close()
var body []byte
if body, err = ioutil.ReadAll(hres.Body); err != nil {
return nil, errors.Wrap(err, "read body")
}
// ......
return nil
}
這個函式的引數是一個*http.Client
,而不是介面,這個該如何測試?內嵌一個http.Client
像這樣嗎?
type mockHttpClient struct {
http.Client
}
但是,問題是這樣總是很噁心不是嗎?就像如果是C++中,我們只能寫一個mock類從要測試的類繼承,但是我們只需要重寫Do
這個方法啊。
注意:對於C++而言,這是為何要求建構函式只是初始化,而不能包含邏輯,想象一個類在建構函式就訪問了資料庫,請問如何MOCK它?是做不到的,因此只能在建構函式初始化資料庫的IP和賬號等資訊,提供
connect
這種函式連線資料庫。備註:上面只是拿資料庫連線打個比方,實際上從MOCK角度來說,建構函式只能初始化記憶體物件,其他的應該啥也不幹。
在GOLANG中,有個非常牛逼的方法,就是建立一個私有的介面,使用時用介面:
type httpDoer interface {
Do(req *http.Request) (*http.Response, error)
}
func request(ctx context.Context, hc httpDoer, api string) (err error) {
// ......
可以發現,很神奇的是,呼叫者也可以給*http.Client
,對這個改動一無所知,這難道不是極其巧妙的設計嗎?我們在mock中只需要mock這個方法就可以了。
一行程式碼處,深藏功與名~
相關文章
- Golang 單元測試 - 介面層Golang
- 在介面測試中如何加密 token加密
- golang中的介面Golang
- 介面測試的N中玩法
- 測試中,介面測試的必要性與介面測試的基礎用例設計
- 在Golang中使用泛型從任何map中獲取鍵的sliceGolang泛型
- 介面測試裡的查詢介面要測試嗎
- 『居善地』介面測試 — 1、介面測試的概念
- python 裝飾器在介面自動化測試中的應用Python
- python裝飾器在介面自動化測試中的應用Python
- 介面測試測試流程
- 驗證碼處理在自動化測試中的應用
- 人機介面測試在逐步被攻破
- 介面測試的價值(為什麼要做介面測試)
- jmeter介面測試教程以及介面測試流程JMeter
- API 測試 | 瞭解 API 介面測試 | API 介面測試指南API
- 介面測試
- golang 單元測試Golang
- 人工智慧在專案管理中的三大用途人工智慧專案管理
- 【軟體測試】——介面測試
- Jmeter介面測試+效能測試JMeter
- 介面測試 - 引數測試
- API測試:瞭解API介面測試與API介面測試指南API
- Apifox介面測試教程(一)介面測試的原理與工具API
- 介面測試和效能測試的區別
- 介面測試和功能測試的區別
- 在Golang中使用泛型reduce函式 - gosamplesGolang泛型函式
- 為什麼要做介面測試?可做介面測試的軟體測試公司分享
- 如何優雅的在Golang中進行錯誤處理Golang
- 介面測試--apipost中cookie管理器的使用APICookie
- 介面測試之 json 中的 key 獲取JSON
- 介面測試之json中的key獲取JSON
- JDBC 在效能測試中的應用JDBC
- 小白測試系列:介面測試與效能測試的區別
- 在持續測試中使用哪種測試?談談DevOps在測試策略中的實踐!dev
- webpack3--plugins大用處WebPlugin
- Golang 專案中如何對 API 進行測試?GolangAPI
- 『居善地』介面測試 — 10、介面測試的認證機制