最近項目在補充單元測試,這里介紹以下幾個go里流行的單元測試框架。
gomock
gostub
monkey
Convey
下面介紹下各個框架的主要用途
convey 主要用途是用來組織測試用例的
gomock 主要用來給接口打樁的。mockgen可以生成對應的接口測試文件。
gostub 主要用來給變量、函數、過程打樁 但是給函數打樁時,需要做侵入式修改
monkey 主要也是用來給變量、函數打樁的
gostub打樁的原理式通過反射,所以要求調用stub函數傳入第一個參數必須是指針,然而函數並沒有指針的概念,所以需要對函數做侵入式修改。
monkey打樁的原理則是在運行時通過匯編語句重寫可執行文件,將待打樁函數或方法的實現跳轉到樁實現,原理和熱補丁類似。但是moneky不是線程安全的,不能用在並發測試中
對於以上幾個框架,簡書上有大神已經做了詳細介紹了
下面給出鏈接
convey
https://www.jianshu.com/p/e3b2b1194830
gomock
https://www.jianshu.com/p/f4e773a1b11f
monkey
https://www.jianshu.com/p/2f675d5e334e
gostub
https://www.jianshu.com/p/70a93a9ed186
這里簡單提一下convey
一般都是convey+monkey或者convey+gostub結合使用
package tests import ( "errors" . "github.com/smartystreets/goconvey/convey" "testing" ) func Func(arg string) error { if len(arg) > 0 { return nil } else { return errors.New("arg is nil") } } func TestFunc(t *testing.T) { Convey("test Func", t, func() { Convey("Func should return nil when arg is not empty", func() { arg := "1" err := Func(arg) So(err, ShouldBeNil) }) Convey("Func should return error when arg is empty", func() { arg := "" exceptErr := errors.New("arg is nil") err := Func(arg) So(err, ShouldBeError, exceptErr) }) }) }
主要使用了兩個函數Convey和So函數
convey函數可以嵌套使用,第一個參數都是對測試用例的描述,第二個參數有所不同。外層的convery第二個參數必須時testing.T指針。第三個參數是函數,保存其他測試用例。內層的convey的第二個參數是測試執行函數
So函數用來對函數的返回值做判斷的。提供了很多類型,ShouldBeNil,ShouldBeERRor,ShouldBeEmpty等等。基本都覆蓋到了