golang-Mock对单元测试的作用

简介: golang-Mock对单元测试的作用

为什么要Mock

  在一个复杂项目中,项目可能依赖于多个组件(DB,Cache,File等)。这些依赖都属于项目中的强依赖,如果没有这些组件,项目是不完整的,或者说某个功能是运行不了的。

  单元测试有两个目标,一个是幂等,一个是稳定

幂等:重复运行一个测试的case,每次的结果都是一样的

 稳定:单元测试相互隔离,在任何时间,任何函数,任何环境都能独立的运行

 那要实现这个目标,因为我们有这么多依赖,如果直接写单元测试,调用db,这样单元测试肯定是不稳定的,因为会依赖于网络的传输。那要怎么写能实现稳定的单元测试呢?

 对于强依赖的项目,如何实现稳定这个目标呢?因为我们有这么多强依赖,如果直接写单元测试,调用DB,这样的单元测试是不稳定的,因为会依赖于网络的传输,如果DB刚好挂了呢?那么怎样才能实现一个不依赖组件的稳定单元测试呢?


要解决这个问题,我们需要用到Mock,单元测试的过程中需要用到mork机制

什么是Mock

github地址:bouk-monkey

快速Mock函数

  • 为一个函数打桩
  • 为一个方法打桩

 下面我们来看一下Mock,打桩可以理解为用一个函数A替换成函数B,函数B就是原函数,函数A就是一个打桩函数。

 以函数打桩为例,有两个方法,一个是Patch,入参是原函数,replacement是我们需要打桩的函数,另一个是unpatch,是为了在保证在测试结束以后把这个桩卸载掉。

 monkey包的实现主要是在运行时,通过go的unsafe包,将内存中函数的地址替换成运行时函数地址,这样其实最终在测试的时候调用的是打桩函数,就实现了Mork的功能

做个测试

不用Mock

  可以看到,这里的单元测试是依赖于本地log文件的,一旦log文件被篡改,被删除,那么这个单元测试就失败了

func ReadFirstLine() string {
  buf, err := ioutil.ReadFile("log")
  if err != nil {
    panic(err)
  }
  return string(buf)
}
func TestProcessFirstLine(t *testing.T) {
  firstLine := ReadFirstLine()
  assert.Equal(t, "wxf", firstLine)
}

使用Mock

  这里对ReadFirstLine进行打桩,让其始终返回"wxf",通过一个Mork,就实现了单元测试不对本地文件的强依赖。这样我们的单元测试就可以在任何时间,任何环境去执行,完全不依赖于本地文件,测试依然能够正常运行

func TestProcessFirstLineWithMock(t *testing.T) {
  monkey.Patch(ReadFirstLine, func() string {
    return "wxf"
  })
  defer monkey.Unpatch(ReadFirstLine)
  line := ReadFirstLine()
  assert.Equal(t, "wxf", line)
}


目录
相关文章
|
6月前
|
安全 测试技术 Go
第十五章 Golang单元测试
第十五章 Golang单元测试
41 2
|
3月前
|
测试技术 Go
写出高质量代码的秘诀:Golang中的测试驱动开发(TDD)
写出高质量代码的秘诀:Golang中的测试驱动开发(TDD)
|
3月前
|
测试技术 Go 开发者
掌握Golang测试:从入门到实践
【8月更文挑战第31天】
55 0
|
4月前
|
运维 监控 测试技术
Golang质量生态建设问题之接入并使用Go单元测试插件的问题如何解决
Golang质量生态建设问题之接入并使用Go单元测试插件的问题如何解决
|
4月前
|
测试技术 Shell Go
Golang质量生态建设问题之单元测试在卓越工程中的问题如何解决
Golang质量生态建设问题之单元测试在卓越工程中的问题如何解决
|
4月前
|
测试技术 Shell Go
Golang质量生态建设问题之Go语言的单元测试的问题如何解决
Golang质量生态建设问题之Go语言的单元测试的问题如何解决
|
6月前
|
安全 测试技术 Go
Golang深入浅出之-Go语言单元测试与基准测试:testing包详解
【4月更文挑战第27天】Go语言的`testing`包是单元测试和基准测试的核心,简化了测试流程并鼓励编写高质量测试代码。本文介绍了测试文件命名规范、常用断言方法,以及如何进行基准测试。同时,讨论了测试中常见的问题,如状态干扰、并发同步、依赖外部服务和测试覆盖率低,并提出了相应的避免策略,包括使用`t.Cleanup`、`t.Parallel()`、模拟对象和检查覆盖率。良好的测试实践能提升代码质量和项目稳定性。
104 1
|
测试技术 Go
Golang 语言怎么编写测试代码?
Golang 语言怎么编写测试代码?
52 0
|
11月前
|
测试技术 Go
golang 测试模块使用
golang 测试模块使用
52 1
|
11月前
|
NoSQL 测试技术 Linux
Golang 单元测试合集整理,(我最常用 gomonkey)欢迎收藏
Golang 单元测试合集整理,(我最常用 gomonkey)欢迎收藏
158 1