YoloKokura

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

Tags: