Golang原生的testing套件和Table-Driven test风格减轻了TDD的负担, 但在单元测试的时候,隔离外部模块、模拟网络请求等场景仍然需要其它工具的帮助, 实现函数打桩、mock接口等功能。
assert:断言
assert
包主要用于对简化断言。比如,如果要判断一个字符串是否等于特定的值, 单纯使用原生testing的话,就必然要写出冗长的if else
语句,条件复杂的情况下测试代码都会变得难以维护。 而如果使用现有的断言函数的话可能就只有一行:
go
assert.Equal(t, actual, got)
assert
提供了丰富的断言场景函数,可以当作语法糖来对待。
gomonkey:函数打桩
gomonkey
用来对函数进行Patch操作,使用自己临时的函数版本去替换原有版本:
go
patch := gomonkey.ApplyFunc(helloWorld, func() string {
return "hello world!"
})
defer patch.Reset()
这里我们使用一个临时函数替换掉原有的helloWorld函数,两者确保签名相同, 当这段代码运行结束后,需要手动Reset patch。
在一些情况下,代码逻辑调用的函数逻辑复杂,或者很耗时,或者依赖外部模块,此时使用gomonkey直接模拟此类函数在不同情况下的输出,可以让我们专注于测试这一段代码。
gock:mock网络接口
gock
有点类似于gomonkey
,区别是它替换的不是函数,而是一个http接口:
go
defer gock.Off()
gock.New("http://foo.com").
Get("/bar").
Reply(200).
JSON(map[string]string{"foo": "bar"})
在这个代码片段中,我们使用gock模拟了foo.com/bar的Get接口,使之直接返回一个"foo": bar
键值对。 通过这种方式,我们可以将项目代码和外部的服务隔离开来,专注于测试项目运行是否正确。