酷Go推荐 golang 打桩测试库 gostub

haolipeng12345 · 2021年06月28日 · 127 次阅读

一、gostub 简介

1、gostub 是什么?

GoStub是一款轻量级的单元测试框架,接口友好,可以对全局变量、函数或过程进行打桩。

2、应用场景有哪些?

场景 1:打桩全局变量

场景 2:打桩普通函数

场景 3:打桩系统函数

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

三、使用方法

3、1 打桩全局变量

//场景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)
}

3、2 打桩普通函数

//场景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、3 打桩系统库函数

//场景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()
}

3、4 打桩系统环境变量

//场景4:设置环境变量
func stubEnv() {
   stubs := gostub.New()
   stubs.SetEnv("GOSTUB_VAR", "test_value") //设置环境变量
   stubs.Reset()
}

四、总结

gostub 基本上满足平时的测试需求,但是如果想更好的测试自己的程序,还需要搭配上其他的测试框架才行。

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册