Skip to content

GOOM问题答疑记录

Jakegogo edited this page Oct 16, 2024 · 1 revision

GOOM问题答疑记录

1 . 对于原先使用gomonkey的用户,可以逐步迁移到goom.

Q: gomonkey好像有个不稳定的报错,有见到过吗? 是不是到goom可以解决稳定性问题? image image

本地跑了400次都是成功的,上流水线就不稳定。

A:目前发现gomonkey的这个实现有并发问题: image

而单测的t.Run(tt.name, func(t *testing.T)在每次执行调用时候底层创建一个新的goroutine的: image

goom中不存在这个问题

另外goom修复了double函数被回收的问题,比如gomonkey的这个double函数apply之后并没有对其持有引用,一旦double被回收就会出现一些很奇怪的异常,这个问题是偶现的 image

2. 帮忙看看 haoran这个case是不是和jackieyu的一样原因?

A: 这个是mock函数(double)被gc回收导致的 image R: 临时解法办法: 替换成使用旧版的gomonkey.ApplyFunc API, 同时对double定义为变量,并且在函数末尾使用runtime.KeepAlive(double)持有变量 image

3. 这个fake类如果没有导出,在其他package可以mock吗?

image image

A: 我先说一下, 后续补充文档。 方法是在当前包下写一个和fake一样的结构体, 这个结构体的属性和mock的结构属性体保持一致,但是不需要给它定义方法

4. 好像也有bug, 有的时候mock不住(mock了3个函数,第三次mock失败)

image

A: 因为函数是空的,编译后被内联了,因此hook无效。有两种解决办法:

  1. go test执行加上 -gcflags="-l" 关闭内联
  2. 在函数定义处加上//go:noinline image image

5. 这篇km上有提到 增强版的gomonkey,不知道是什么东东?


我这里的想stub一个私有的【类】,不知道能否做到?多谢答疑~

A: 能支持的,详细请看README.md文档

6. 6-12 下午 2:45

目前我们的一个服务的所有文件和类都在一个main包下面,有一些类的方法用小写开头的(即所谓的对外隐藏的,实际在一个main包里都是能调的),在接口测试的时候会要mock掉这些方法。

6-12 下午 2:46 还有一种情况是:开放的方法里调了隐藏的方法,在做接口测试的时候想要mock掉某个隐藏的方法

函数我没试过,我试了一下方法,小写就不行,改成大写之后就可以了 image image

A: 这个改成用applyfunc吧: gomonkey.ApplyFunc((&DbAccess{}).batchQry..., func (dbAccess *DbAccess, otherparams...)) 这个错误是gomonkey里加了一个校验, 把校验去掉就可以了 建议做法是,再封装一个gomonkey方法, 把校验去掉。 换个名称比如ApplyMethodFunc()之类的

R: 此问题在GOOM中已解决