打桩框架:gomonkey
文章目录
介绍
gomonkey 是 golang 的一款打桩框架,目标是让用户在单元测试中低成本的完成打桩,从而将精力聚焦于业务功能的开发。gomonkey 接口友好,功能强大,目前已被很多项目使用,用户遍及世界多个国家。
特性列表
gomonkey 1.0 特性列表如下:
- 支持为一个函数打一个桩
- 支持为一个成员方法打一个桩
- 支持为一个全局变量打一个桩
- 支持为一个函数变量打一个桩
- 支持为一个函数打一个特定的桩序列
- 支持为一个成员方法打一个特定的桩序列
- 支持为一个函数变量打一个特定的桩序列
下载地址:
https://github.com/agiledragon/gomonkey/releases/tag/v1.0
习惯用法
gomonkey 提供的 API 包括函数接口和成员方法接口,接口契约一致,扩展性很强。
示例代码中用到了 goconvey,它是一款针对 golang 的测试框架,可以管理和运行测试用例,同时提供了丰富的断言函数,并支持很多 Web 界面特性。
ApplyFunc
ApplyFunc 接口定义如下:
|
|
ApplyFunc 第一个参数是函数名,第二个参数是桩函数。测试完成后,patches 对象通过 Reset 成员方法删除所有测试桩。
函数打桩的习惯用法:
|
|
ApplyMethod
ApplyMethod 接口定义如下:
|
|
ApplyMethod 第一个参数是目标类的指针变量的反射类型,第二个参数是字符串形式的方法名,第三个参数是桩函数。测试完成后,patches 对象通过 Reset 成员方法删除所有测试桩。
成员方法打桩的习惯用法:
|
|
ApplyGlobalVar
ApplyGlobalVar 接口定义如下:
|
|
ApplyGlobalVar 第一个参数是全局变量的地址,第二个参数是全局变量的桩。测试完成后,patches 对象通过 Reset 成员方法删除所有测试桩。
全局变量打桩的习惯用法:
|
|
ApplyFuncVar
ApplyFuncVar 接口定义如下:
|
|
ApplyFuncVar 第一个参数是函数变量的地址,第二个参数是桩函数。测试完成后,patches 对象通过 Reset 成员方法删除所有测试桩。
函数变量打桩的习惯用法:
|
|
ApplyFuncSeq
ApplyFuncSeq 接口定义如下:
|
|
其中,OutputCell 的定义为:
|
|
ApplyFuncSeq 第一个参数是函数名,第二个参数是特定的桩序列参数。测试完成后,patches 对象通过 Reset 成员方法删除所有测试桩。
函数打桩序列的习惯用法:
|
|
ApplyMethodSeq
ApplyMethodSeq 接口定义如下:
|
|
ApplyMethodSeq 第一个参数是目标类的指针变量的反射类型,第二个参数是字符串形式的方法名,第三参数是特定的桩序列参数。测试完成后,patches 对象通过 Reset 成员方法删除所有测试桩。
成员方法打桩序列的习惯用法:
|
|
ApplyFuncVarSeq
ApplyFuncVarSeq 接口定义如下:
|
|
ApplyFuncVarSeq 第一个参数是函数变量地址,第二个参数是特定的桩序列参数。测试完成后,patches 对象通过 Reset 成员方法删除所有测试桩。
函数变量打桩序列的习惯用法:
|
|
NewPatches
NewPatches 接口定义如下:
|
|
NewPatches 是 patches 对象的显式构造函数,一般用于目标和桩的表驱动场景。测试完成后,patches 对象通过 Reset 成员方法删除所有测试桩。
NewPatches 的习惯用法:
|
|
注意事项
如果 gomonkey 打桩失败,请确认:
- 打桩目标是否为内联的函数或成员方法?如果是,请在测试时通过命令行参数 -gcflags=-l (go1.10 版本之前)或-gcflags=all=-l(go1.10 版本及之后)关闭内联优化;
- gomonkey 是否在非 amd64 架构的处理器上运行?如果是,则需要开发相关的功能代码;
- gomonkey 是否被多协程并发用于同一个目标的打桩?如果是,则需要将之前的协程先优雅退出;
- go1.6 版本的反射机制支持私有成员方法的查询,而 go1.7 及之后的版本却不支持。然而,所有版本的反射机制都支持私有函数的查询,所以当用户使用 go1.7 及之后的版本时,gomonkey 对于私有成员方法的打桩将触发一个异常。
文章作者 Forz
上次更新 2020-01-27