1.单元测试框架调研
名称评分特点
testing
golang 官方自带
不支持断言和 mock
gocheck
近几年无更新
基于testing,支持断言,setup,suit。
testify
start :10000+
持续更新
基于testing,与gocheck 相似.suite包可以给每个测试用例进行前置操作和后置操作的功能(例如初始化和清空数据库)。
goconvey
start :5000+
持续更新
直接集成go test;
可以管理和运行测试用例;提供了丰富的断言函数;
支持很多 Web 界面特性。
gomonkey
start :2000+
持续更新
可以为全局变量、函数、过程、方法mock。
httpexpect
start :1400+
持续更新
适用于对http的clent进行测试,对服务端的回包进行打桩;支持对不同方法(get,post,head等)的构造,支持自定义返回值json。
sqlmock
start :2600+
持续更新
适用于和数据库的交互场景。可以创建模拟连接,编写原生sql 语句,编写返回值或者错误信息并判断执行结果和预设的返回值
2. 方案基本选型:testify + gomonkey; 附加 sqlmock
需要写单元测试的代码原则:
外部依赖少,代码又简单的代码。自然其成本和价值都是比较低的,可选;
外部依赖很少,业务复杂代码,最有价值写单元测试的。
testify基于gotesting编写,所以语法上、执行命令行与go test完全兼容。testify的 assert包提供了丰富的断言方法,避免testing的多层if else。此外提供了suite包,可以给每个测试用例进行前置操作和后置操作的功能,这个方便的功能,在前置操作和后置操作中去初始化和清空数据库。同时,还可以声明在这个测试用例周期内都有效的全局变量。
//安装testify
go getgithub.com/stretchr/testify
//更新testify
go get-u github.com/stretchr/testify
前提:
测试文件,以_test.go结尾,与被测文件放于相同目录
测试函数,函数名以Test开头,并且随后的第一个字符必须为大写字母或下划线,如:TestCategoryService_AddCategory
测试函数,参数为t testing.T;对于bench测试,参数为btesting.B
1.快速添加测试方法。右键方法,选择go to-test,生成test文件
2.给定对应case,使用assert 包中的方法添加断言,替换testing 的if else 判断。
assert 包还提供了更多断言方法
assert 断言库
require包提供了与assert包相同的全局函数,但它们不返回布尔结果,而是终止当前测试。
测试套件:
一种针对拥有多个实现的通用接口的测试,一个接口多个实现的时候不用重复的为特定版本书写测试。
前提:
测试套件文件名必须以 test.go 结尾。例:abc_test.go
文件中的函数以 Test,Benchmark,Example 开头。例子:TestAbc(),BenchmarkAbc(), ExampleAbc()。
func (s *SuiteType)SetUpSuite(c *C)-在测试套件启动前执行一次
func (s *SuiteType)SetUpTest(c *C)-在每个用例执行前执行一次
func (s *SuiteType)TearDownTest(c *C)-在每个用例执行后执行一次
func