go单元测试框架介绍goconvey和gomonkey
2021-12-01 12:01:39 10 举报
AI智能生成
go单元测试框架介绍goconvey和gomonkey
作者其他创作
大纲/内容
GoConvey是一款针对Golang的测试框架,可以管理和运行测试用例,同时提供了丰富的断言函数,并支持很多 Web 界面特性。
简介
go get github.com/smartystreets/goconvey
如果需要使用web功能,go的版本为go1.17.3
安装
减少冗余代码,import goconvey包时,使用 ' . \"github.com/smartystreets/goconvey/convey\" '
每一个测试用例都需要使用Convey函数包裹,第一个参数是string类型,用于描述测试用例,第二个参数是*testing.T,第三个参数是不接受参数也不返回参数的匿名函数
判断是否
数值比较
集合
字符串
异常
类型
时间
常用断言
例,这是一个判断基本数据类型数值或者切片是否相同的断言
自定义断言
第三个参数中包含So函数完成断言判断
Convey可以无限嵌套,用于体现测试用例之间的关系,只有最外层需要传入*testing.T类型
Convey嵌套
Skip
针对某些想忽略又不想删除或者注释的断言操作
有时候需要在跑完一个用例后,清除converys中的一些预配置,这时应该使用Reset()来清除
Reset
要点
测试代码
可以用命令行自动化编译测试,还支持在Web界面上进行编译测试
go1.17.3
条件
在goconvey所在目录(例如go/src/github.com/smartystreets/goconvey)下执行go run goconvey.go
启动方式
界面
Web界面
GoConvey框架
桩,或称桩代码,是指用来代替关联代码或者未实现代码的代码。如果函数B用B1来代替,那么,B称为原函数,B1称为桩函数。打桩就是编写或生成桩代码。
概念
隔离是指将测试任务从产品项目中分离出来,使之能够独立编译、链接,并独立运行。
函数A调用了函数B,函数B又调用了函数C和D,如果函数B用桩来代替,函数A就可以完全割断与函数C和D的关系。
隔离
用桩来代替未实现的代码
函数A调用了函数B,而函数B由其他程序员编写且未实现,那么可以用桩来代替函数B,使函数A能够运行并测试。
补齐
在测试时,人为设定相关代码的行为,使之符合测试需求。
控制
目的
什么是打桩
gomonkey 是 golang 的一款打桩框架,目标是让用户在单元测试中低成本的完成打桩,从而将精力聚焦于业务功能的开发。
因为内联消除了调用目标函数时的跳转操作,使得go monkey填充在目标函数入口处的指令无法执行,因而也无法实现函数体的运行时替换,使go monkey失效。
在Go Tool Argument添加 -gcflags=all=-l 禁止内联
打桩失败
https://blog.csdn.net/qw790707988/article/details/119710144
执行ApplyFunc时PermissionDenied
遇见的问题
注意方法的大小写
特性
特性中示例会使用到的数据结构
示例
第一个参数是原函数,第二个参数是桩函数
ApplyFunc
如果只是想让方法返回指定值,返回值和入参无关则可以使用ApplyFuncReturn,第一个入参是原函数,第二个入参是可选参数,可以有多个值,填桩函数的所有返回值
ApplyFuncReturn
支持为一个函数打一个桩
第一个入参是值类型对象(一定要是值类型),第二个是原函数名,第三个是桩函数,桩函数第一个入参是值类型对象(一定要是值类型),其他入参依次是原函数的入参,返回值同原函数
值类型成员方法
第一个入参是指针类型对象(一定要是指针类型),第二个是原函数名,第三个是桩函数,桩函数第一个入参是指针类型对象(一定要是指针类型),其他入参依次是原函数的入参,返回值同原函数
指针类型成员方法
ApplyMethod
第一个入参是值类型对象(一定要是值类型),第二个是原函数名,第三个是桩函数的返回值
第一个入参是指针类型对象(一定要是指针类型),第二个是原函数名,第三个是桩函数的返回值
ApplyMethodReturn
支持为一个成员方法打一个桩
ApplyPrivateMethod
支持为一个private函数变量打一个桩
第一个入参是全局变量的地址,第二个是新的值
ApplyGlobalVar
支持为一个全局变量打一个桩
如果想让每一次返回都不一样,则使用ApplyFuncSeq,第一个入参是原函数,第二个入参是gomonkey.OutputCell数组,是桩函数的返回值
ApplyFuncSeq
支持为一个函数打一个特定的桩序列
如果想让每一次返回都不一样,则使用ApplyMethodSeq,第一个入参是原函数,第二个是原方法名,第三个入参是gomonkey.OutputCell数组,是桩函数的返回值。只能打public方法
ApplyMethodSeq
支持为一个成员方法打一个特定的桩序列
gomonkey
作者:_张晓龙_链接:https://www.jianshu.com/p/e3b2b1194830来源:简书
版权声明:本文为CSDN博主「lampNick」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/scun_cg/article/details/88244271
作者:_张晓龙_链接:https://www.jianshu.com/p/633b55d73ddd来源:简书
版权声明:本文为CSDN博主「wangwencong」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/wangwencong/article/details/8189778
版权声明:本文为CSDN博主「arong2048」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/pbrlovejava/article/details/120311944
https://github.com/agiledragon/gomonkey
https://github.com/smartystreets/goconvey
参考文章
go单元测试
0 条评论
回复 删除
下一页