在 golang 框架中撰写取决于外界服务的单元测试可以用下列方法:模拟外部服务行为:界定并模拟服务接口。应用模拟种类来创建检测并肯定外界服务行为。实战案例 :应用模拟种类检测取决于 http 服务的内部服务。模拟服务端行为,并更新客户端偏向模拟服务端。实行检测并肯定结论。
怎样在 GoLang 架构中编写依赖外部服务的单元测试
介绍
撰写取决于外界服务的单元测试可能是一项艰巨的任务。在指南中,我们将介绍在 GoLang 框架中撰写该类检测技巧。
模拟外部服务
一种常见的理论是模拟外部服务行为。我们使用 [mock](https://github.com/golang/mock) 包来定义接口和模拟种类。
packageservice
// MyService 接口定义了外界服务行为
type MyService interface {
GetData() (string, error)
}
// MyServiceMock 是 MyService 接口模拟种类
type MyServiceMock struct {
mock.Mock
}
// GetData 模拟外部服务的 GetData 方式
func (m MyServiceMock) GetData() (string, error) {
ret := m.Called()
return ret.Get(0).(string), ret.Error(1)
}
应用模拟种类
我们可以使用模拟种类来创建单元测试并肯定外界服务的行为。
packageservice
import(
"testing"
"time"
)
funcTestService_GetData(ttesting.T){
//建立模拟服务
mockService := &MyServiceMock{}
// 设定 mock 行为
mockService.On("GetData").Return("sample data", nil).Once()
service := NewService(mockService, time.Duration(0))
data, err := service.GetData()
// 肯定
if err != nil {
t.Fatal(err)
}
if data != "sample data" {
t.Fatalf("Expected sample data, got %s", data)
}
// 认证启用是否发生
if !mockService.AssertCalled(t, "GetData") {
t.Error("GetData() was not called")
}
}
实战案例
下列是如何在集成测试中应用模拟种类检测取决于外界服务的 HTTP 服务的实例:
55
56
57
58
59
60
61
62
63
packageservice_test
import(
"context"
"fmt"
"io"
"net/http"
"net/http/httptest"
"strings"
"testing"
"github.com/stretchr/testify/assert"
)
funcTestService_GetData(ttesting.T){
typeargsstruct{
ctxcontext.Context
rhttp.Request
}
tests:=[]struct{
namestring
argsargs
mockStatusCodeint
expectedBodystring
}{
{
"Success",
args{context.Background(),new(http.Request)},
http.StatusOK,
"sampledata",
},
}
for_,tt:=rangetests{
t.Run(tt.name,func(ttesting.T){
//模拟服务端行为
server:=httptest.NewServer(http.HandlerFunc(func(whttp.ResponseWriter,rhttp.Request){
ifr.Method!="GET"{
t.Errorf("Unexpected HTTP method:%s",r.Method)
}
w.WriteHeader(tt.mockStatusCode)
_,_=io.WriteString(w,tt.expectedBody)
}))
deferserver.Close()
//升级要求以偏向模拟服务端
baseClient := Service.GetClient()
t.Cleanup(func() { Service.SetClient(baseClient) })
Service.SetClient(http.Client{Transport: &http.Transport{
Base: &http.Transport{DisableCompression: true},
DialTLS: func(network, addr string) (net.Conn, error) {
return net.Dial(network, strings.Replace(addr, "localhost", server.Listener.Addr().String(), 1))
},
}})
// 实行检测
result, err := Service.GetData(tt.args.ctx, tt.args.r)
assert.Nil(t, err)
assert.Equal(t, tt.expectedBody, result)
})
}
}
以上就是怎样在 golang 架构中编写依赖外部服务的单元测试?的详细内容,大量请关注其他类似文章!