go monkey

news/2024/11/25 3:13:05/

定义

golang用来做 monkey patching 的测试库。

monkey patch :在运行时,动态修改一些变量/函数/方法/模块 的行为的能力。

对于有些三方的库,我们没有权限去调整代码逻辑,而这又会对我们测试带来影响,所以,我们通过【运行时替换】的方法来改掉这些实体的行为。

导包

import "github.com/agiledragon/gomonkey/v2"

使用注意事项

  1. gomonkey库只支持Arch架构,不能够在x86/amd上运行使用。
  2. 测试时需要关闭内联优化

go test -gcflags=all=-l

因为内联消除了调用目标函数时的跳转操作,使得go monkey填充在目标函数入口处的指令无法执行,因而也无法实现函数体的运行时替换,使go monkey失效。

使用示例

函数打桩

func ApplyFunc(target, double interface{}) *Patches
参数:target 目标函数,double替代函数

1.将clean函数用匿名函数代替

func clean() bool {println("do clean()")return true
}
func TestMonkey(t *testing.T) {println("monkey test")patchers := gomonkey.ApplyFunc(clean, func() bool {return false})defer patchers.Reset() //重置桩if clean() == true {t.Fatal("true")} else {t.Fatal("false") //最后运行了这一行,clean函数被替代}
  1. time.Now永远返回固定时间
func TestMonkey(t *testing.T) {println("monkey test")now := time.Now()gomonkey.ApplyFunc(time.Now, func() time.Time {return now})defer patchers.Reset()fmt.Println(time.Now())time.Sleep(time.Second * 3)fmt.Println(time.Now()) //这里与上面的结果相同}

方法打桩

func ApplyMethod(target reflect.Type, methodName string, double interface{}) *Patches
参数:
target:目标类型,根据reflect.TypeOf()获得。
methodName:方法名
double:替代函数,替代函数的第一个参数需要为对象类型或对象的指针

type A intfunc (a A) Print1(n int) {println(n)
}
func TestMonkey(t *testing.T) {var g_A Apatches := gomonkey.ApplyMethod(reflect.TypeOf(g_A), "Print1", func(a A, n int) {println("hello world")})defer patches.Reset()g_A.Print1(3) //如果没有被替代会打印3,实际上打印了helloworldt.Fatal("end") //不出错的话,println不会显示}

全局变量打桩

var c = 3func TestMonkey(t *testing.T) {patches :=gomonkey.ApplyGlobalVar(&c, 4)defer patches.Reset()println(c)//输出4t.Fatal("end")
}

参考:https://juejin.cn/post/7133520098123317256


http://www.ppmy.cn/news/83001.html

相关文章

软考高级架构师笔记-4中间件、嵌入式技术

目录 1. 前言 & 考情分析2. 中间件3. 微处理器4. 嵌入式软件5. 嵌入式系统6. 嵌入式软件设计6. 结语1. 前言 & 考情分析 前文回顾: 软考高级架构师笔记-1计算机硬件软考高级架构师笔记-2计算机软件(操作系统)软考高级架构师笔记-3数据库本章考情: 本章节偶尔会考到…

第三十六章 状态管理工具与总结

Redux 是一个渐进式的状态管理库,它不仅仅是一个库,同时也是一个框架。它提供了一组用于构建复杂应用程序的工具和库,其中包括一些浏览器插件。 在 Chrome 和 Firefox 浏览器上,已经存在一些 Redux 的浏览器插件,例如 …

【Vue2.0源码学习】虚拟DOM篇-Vue中的DOM-Diff

文章目录 1. 前言2. patch3. 创建节点4. 删除节点5. 更新节点6. 总结 1. 前言 在上一篇文章介绍VNode的时候我们说了,VNode最大的用途就是在数据变化前后生成真实DOM对应的虚拟DOM节点,然后就可以对比新旧两份VNode,找出差异所在&#xff0c…

架构整洁之道上篇(编程范式设计原则)

目录 1.概述 2.编程范式 2.1.结构化编程 2.2.面向对象编程 2.3.函数式编程 3.设计原则 3.1.单一职责原则 3.2.开闭原则 3.3.里氏替换原则 3.4.接口隔离原则 3.5.依赖反转原则 4.小结 1.概述 软件架构的终极目标是,用最小的人力成本来满足构建和维护该系…

SEO优化需要天天更新文章吗?

SEO优化并不要求每天都更新文章。 更新频率取决于你网站的内容类型、目标受众和业务需求。以下是一些建议: 高质量内容:关键是提供有价值且吸引人的内容。不要为了更新而随意发布低质量或重复的内容。确保你的文章有深度、独特性和相关性,以…

关于K8S库中高可用的锁机制详解

简介 对于无状态的组件来说,天然具备高可用特性,无非就是多开几个副本而已;而对于有状态组件来说,实现高可用则要麻烦很多,一般来说通过选主来达到同一时刻只能有一个组件在处理业务逻辑。 在Kubernetes中,…

0基础学习VR全景平台篇第27章:场景管理-视角功能

大家好,欢迎收看蛙色平台免费教程! 功能位置示意 一、本功能将用在哪里? 视角功能:指观看者打开场景时,默认展示的位置内容,可针对视角显示范围、视角远近范围进行设置。 应用场景:几乎每个作品…

爬虫的工作程序

爬虫是一种自动化程序,用于从互联网上收集数据。它可以自动访问网站,提取有用的信息,并将其存储在本地计算机上。在本文中,我们将介绍爬虫的工作程序,包括爬虫的基本原理、爬虫的工作流程、爬虫的应用场景以及爬虫的优…