成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 代碼測試時怎么打樁?給大家寫了幾個常用案例

開發(fā) 前端
gomonkey 是 Go 生態(tài)中的一個測試打樁框架,它能在單元測試中給函數(shù),導出方法,私有方法,接口,函數(shù)參數(shù),全局變量等進行打樁,覆蓋的場景很全。

gomonkey 是 Go 生態(tài)中的一個測試打樁框架,它能在單元測試中給函數(shù),導出方法,私有方法,接口,函數(shù)參數(shù),全局變量等進行打樁,覆蓋的場景很全。

這個庫由國人張曉龍開發(fā),注意哦,不是做微信那個,那個叫張小龍。嘿嘿,看來名字叫小龍、曉龍….等等同音字的容易出牛人。

今天我們就來一起看幾個典型的例子熟悉它的用法

常用打樁案例

使用前我們還是用 go get 在項目中添加一下依賴:

go get github.com/agiledragon/gomonkey/v2@v2.11.0

為了防止Go編譯時發(fā)生函數(shù)內(nèi)聯(lián),導致打的樁不起作用了。所以保險起見在執(zhí)行測試 case 像下面這樣加上gcflags

go test -gcflags=all=-l

函數(shù)打樁

給函數(shù)打樁是最常見的場景,ApplyFunc 接口定義如下:

func ApplyFunc(target, double interface{}) *Patches
func (this *Patches) ApplyFunc(target, double interface{}) *Patches

ApplyFunc第一個參數(shù)是函數(shù)名,第二個參數(shù)是樁函數(shù)。測試完成后,patches 對象通過 Reset 成員方法刪除所有測試樁。

這里我們看一個最簡單的示例,比如我們希望 time.Now() 返回固定時間,而不是當前的系統(tǒng)時間,就可以插樁來指定。最后通過 defer 來 Reset 。

now := time.Now()
var p = gomonkey.ApplyFunc(time.Now, func() time.Time {
 return now
})
defer p.Reset()

給函數(shù)打樁時,一定要與函數(shù)的聲明匹配上,即參數(shù)類型和返回值類型都不能有差別。再看一個例子假設我們在 cache 包下有一個 Get 函數(shù):

func Get(ctx context.Context, key string) (string, error)

那么同樣,對其插樁的時候也要用一樣的函數(shù)聲明:

returnValue := ""
patches := gomonkey.ApplyFunc(cache.Get, func(ctx context.Context, key string) (string, error) {
        return returnValue, nil
})
defer patches.Reset()

gomonkey 還支持對函數(shù)打一個特定的樁序列,如果程序里有對這個函數(shù)的多次調(diào)用的場景可以看一下 gomonkey.ApplyFuncSeq。

方法打樁

除了給函數(shù)打樁,我們還能用 ApplyMethod 給方法打樁。

func ApplyMethod(target interface{}, methodName string, double interface{}) *Patches
func (this *Patches) ApplyMethod(target interface{}, methodName string, double interface{}) *Patches

第一個參數(shù)是目標類的變量。第二個參數(shù)是字符串形式的方法名,第三個參數(shù)是樁函數(shù)。測試完成后,patches 對象通過 Reset 成員方法刪除所有測試樁。

假設我們在 util 包有如下代碼:

package util

type Slice []int

func NewSlice() Slice {
    return make(Slice, 0)
}

func (s* Slice) Add(elem int) error {}

func (s* Slice) Remove(elem int) error {}

func (s *Slice) Append(elems ...int) int {}

一個類型 Slice,以及下面的 Add, Remove, Append 三個方法。具體的實現(xiàn)省略。

現(xiàn)在我們要針對 Add 方法來打樁,就可以這樣:

slice := util.NewSlice()
var s *util.Slice

patches := ApplyMethod(s, "Add", func(_ *util.Slice, _ int) error {
 return nil
})
defer patches.Reset()

注意使用ApplyMethod時,第一個參數(shù) target 的入?yún)⒑蜆逗瘮?shù)第一個參數(shù) caller的入?yún)⒈仨毢驮椒ㄒ恢拢丛椒ㄊ墙Y構體的方法,那么它們就必須為結構體,如果是結構體指針的方法,那么它們就必須都得是結構體指針,就像咱們這個例子里一樣。

如果用的是gomonkey的老版本,target 和 caller 的類型都是目標類的反射類型,比如reflect.TypeOf(s),我們用的新版本不用這樣寫,直接傳s即可,假如有歷史代碼按照老版本的方式傳的參,在升級還是可以繼續(xù)使用的。

gomonkey還支持給包內(nèi)未導出的函數(shù)和方法打樁,這就讓單元測試變的很方便,不需要為了寫測試把包的所有函數(shù)和方法都定義成大寫開頭的公共方法。

給私有方法打樁使用的是 ApplyPrivateMethod ,使用方式與這里的 ApplyMethod 類似

func ApplyPrivateMethod(target interface{}, methodName string, double interface{}) *Patches
func (this *Patches) ApplyPrivateMethod(target interface{}, methodName string, double interface{}) *Patches

全局變量打樁

這個很簡單,直接用 ApplyGlobalVar。

var num = 10// 項目的全局變量是10
// 測試的時候用打樁把它變成150 來測試具體行為
func TestApplyGlobalVar(t *testing.T) {
  patches := ApplyGlobalVar(&num, 150)
  defer patches.Reset()
  assert.Equal(t, num, 150)
}
責任編輯:武曉燕 來源: 網(wǎng)管叨bi叨
相關推薦

2021-10-18 06:54:47

Go開源庫業(yè)務

2021-12-29 18:55:55

工具Go 代碼

2020-11-19 07:47:55

IDEA插件

2020-11-20 14:39:24

IDEA開發(fā)插件

2011-08-09 14:54:29

iPhoneNSDateanotherDate

2020-03-06 10:54:51

Go語言XML算法

2018-04-09 15:10:50

測試方法新手軟件

2020-07-09 07:57:01

私有云云原生微服務

2011-01-19 09:07:20

Thunderbird

2010-07-14 15:52:28

Telnet命令

2025-05-07 09:06:03

2021-10-10 23:02:49

Golang語言代碼

2021-04-15 12:10:42

Go語言Go開發(fā)者

2021-09-30 16:22:34

程序員工具編程

2022-07-18 08:08:16

Go?語言技巧

2023-12-30 10:22:57

Go語言函數(shù)開發(fā)

2022-06-06 06:00:00

開源無代碼測試工具

2021-10-12 09:20:02

數(shù)據(jù)庫SQL腳本

2010-10-13 09:45:50

Linux監(jiān)控腳本

2017-03-15 18:34:00

華為
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕乱码视频32 | 欧美男人天堂 | 四虎影视一区二区 | 激情五月婷婷丁香 | caoporn视频| 国产精品欧美一区二区 | 久久午夜视频 | 欧美日韩在线精品 | 国产精品日韩欧美一区二区三区 | 三级在线视频 | 无码日韩精品一区二区免费 | 亚洲九色| 欧美日韩一区二区三区四区 | 欧美日本久久 | 久久久久精| 久久久成 | 亚洲第一网站 | 久久国产精品免费视频 | 久久久久久亚洲 | 欧美精品一区二区三区在线 | 男人av在线播放 | 成人在线观看免费 | 久久久久久国产 | 成人在线免费av | 中文字幕一区二区三区四区不卡 | 久久9视频 | 日本一区二区电影 | 中文字幕乱码亚洲精品一区 | 综合在线视频 | 希岛爱理在线 | 日韩在线免费看 | 日本三级电影免费 | 国产91在线 | 亚洲 | 成人免费网站视频 | 国产在线精品一区二区 | 365夜爽爽欧美性午夜免费视频 | 国产一区二区三区在线 | 人人干天天干 | 国产精品无码永久免费888 | 观看av| 欧美在线视频不卡 |