这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
一个web项目的运行离不开网络的支持,在我们实际工作的业务场景中,网络这块往往比较复杂,他关系到各种各样的网桥、tcp、局域网之间的交互,往往比较多样化,而且在我们的测试过程中,通常都不想建立网络连接。在网上查阅相关质料之后,我们可以使用gock工具进行网络测试。
例如,我们有以下业务逻辑代码,依赖外部API提供的数据。
// api.go
// ReqParam API请求参数
type ReqParam struct {
X int `json:"x"`
}
// Result API返回结果
type Result struct {
Value int `json:"value"`
}
func GetResultByAPI(x, y int) int {
p := &ReqParam{X: x}
b, _ := json.Marshal(p)
// 调用其他服务的API
resp, err := http.Post(
"http://your-api.com/post",
"application/json",
bytes.NewBuffer(b),
)
if err != nil {
return -1
}
body, _ := ioutil.ReadAll(resp.Body)
var ret Result
if err := json.Unmarshal(body, &ret); err != nil {
return -1
}
// 这里是对API返回的数据做一些逻辑处理
return ret.Value + y
}
我们可以使用gock这个库
安装
go get -u gopkg.in/h2non/gock.v1
使用实例
使用gock对外部API进行mock,即mock指定参数返回约定好的响应内容。 下面的代码中mock了两组数据,组成了两个测试用例。
// api_test.go
package gock_demo
import (
"testing"
"github.com/stretchr/testify/assert"
"gopkg.in/h2non/gock.v1"
)
func TestGetResultByAPI(t *testing.T) {
defer gock.Off() // 测试执行后刷新挂起的mock
// mock 请求外部api时传参x=1返回100
gock.New("http://your-api.com").
Post("/post").
MatchType("json").
JSON(map[string]int{"x": 1}).
Reply(200).
JSON(map[string]int{"value": 100})
// 调用我们的业务函数
res := GetResultByAPI(1, 1)
// 校验返回结果是否符合预期
assert.Equal(t, res, 101)
// mock 请求外部api时传参x=2返回200
gock.New("http://your-api.com").
Post("/post").
MatchType("json").
JSON(map[string]int{"x": 2}).
Reply(200).
JSON(map[string]int{"value": 200})
// 调用我们的业务函数
res = GetResultByAPI(2, 2)
// 校验返回结果是否符合预期
assert.Equal(t, res, 202)
assert.True(t, gock.IsDone()) // 断言mock被触发
执行上面写好的单元测试,看一下测试结果
❯ go test -v
=== RUN TestGetResultByAPI
--- PASS: TestGetResultByAPI (0.00s)
PASS
ok golang-unit-test-demo/gock_demo 0.054s
测试结果和预期的完全一致。
总结
在日常工作开发中为代码编写单元测试时如何处理外部依赖是最常见的问题,上诉内容介绍了如何使用gock工具mock相关依赖。
以上就是我对于网络测试工具的总结笔记,谢谢浏览。