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