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 键值对。 通过这种方式,我们可以将项目代码和外部的服务隔离开来,专注于测试项目运行是否正确。