Golang的常用单测工具
这篇博客分享和总结我自己目前用到的Golang单元测试库。
Falldio宜昌
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 键值对。 通过这种方式,我们可以将项目代码和外部的服务隔离开来,专注于测试项目运行是否正确。