一、gostub简介
GoStub是一款轻量级的单元测试框架,接口友好,可以对全局变量、函数或过程进行打桩。
场景1:打桩全局变量
场景2:打桩普通函数
场景3:打桩系统函数
func New() *Stubs
New返回用于打桩变量的*Stubs变量
func (s *Stubs) Reset()
Reset重置打桩的所有变量到其原始值
func (s *Stubs) ResetSingle(varToStub interface{})
ResetSingle重置打桩的单个变量到其原始值
func (s *Stubs) SetEnv(k, v string) *Stubs
SetEnv设置指定的环境变量到指定值
func (s *Stubs) UnsetEnv(k string) *Stubs
UnsetEnv还原指定环境变量的值
最常用的两个函数如下
func (s *Stubs) Stub(varToStub interface{}, stubVal interface{}) *Stubs
Stub使用stubVal替代存储在varToStub变量的值
varToStub必须是指向变量的指针。
stubVal是可赋值到变量的类型
func (s *Stubs) StubFunc(funcVarToStub interface{}, stubVal ...interface{}) *Stubs
StubFunc用返回stubval值的函数替换函数变量,返回*Stubs类型变量
funcVarToStub是指向函数变量的指针。如果函数返回多个值,返回的多个值被传递给StubFunc。
二、安装部署
go get github.com/prashantv/gostub
三、使用方法
//场景1:给全局变量打桩
func stubValue() {
//初始值为100
num := 100
fmt.Println("origin value is:", num)
//stub打桩后的值
stubs := gostub.Stub(&num, 150)
fmt.Println("after stub, value is:", num)
//还原到之前的值
stubs.Reset()
fmt.Println("after stub reset, value is:", num)
}
//场景2:给普通函数打桩
func Exec(cmd string) (string, error) {
return "hello world", errors.New("I am error!")
}
func stubFunc() {
var (
output string
)
//不能直接把Exec传递给gostub.StubFunc
var Exec = Exec //very important!!!
stubs := gostub.StubFunc(&Exec, "haolipeng", errors.New("stub error string")) //打桩
output, _ = Exec("action") //调用函数
fmt.Printf("output: %s\n", output) //验证结果
stubs.Reset()
}
//场景3:给标准库函数打桩(函数返回多返回值)
func stubLibraryFunc() {
host, err := os.Hostname()
if err == nil {
fmt.Printf("host:%s\n", host)
}
var hostName = os.Hostname
stubs := gostub.StubFunc(&hostName, "localhost", nil)
host, err = hostName() //import
if err == nil {
fmt.Printf("after stub host:%s\n", host)
}
defer stubs.Reset()
}
//场景4:设置环境变量
func stubEnv() {
stubs := gostub.New()
stubs.SetEnv("GOSTUB_VAR", "test_value") //设置环境变量
stubs.Reset()
}
四、总结
gostub基本上满足平时的测试需求,但是如果想更好的测试自己的程序,还需要搭配上其他的测试框架才行。
还想了解更多吗?
欢迎加入我们GOLANG中国社区:https://gocn.vip/
《酷Go推荐》招募:
各位Gopher同学,最近我们社区打算推出一个类似GoCN每日新闻的新栏目《酷Go推荐》,主要是每周推荐一个库或者好的项目,然后写一点这个库使用方法或者优点之类的,这样可以真正的帮助到大家能够学习到
新的库,并且知道怎么用。
大概规则和每日新闻类似,如果报名人多的话每个人一个月轮到一次,欢迎大家报名!(报名地址:https://wj.qq.com/s2/7734329/3f51)
扫码也可以加入 GoCN 的大家族哟~