zvvq技术分享网

如何在 golang 框架中编写依赖外部服务的单元测试

作者:zvvq博客网
导读在 golang 框架中编写依赖于外部服务的单元测试可以使用以下技巧:模拟外部服务行为:定义并模拟服务接口。使用模拟类型来创建测试并断言外部服务行为。实战案例:使用模拟类型

在 golang 框架中撰写取决于外界服务的单元测试可以用下列方法:模拟外部服务行为:界定并模拟服务接口。应用模拟种类来创建检测并肯定外界服务行为。实战案例:应用模拟种类检测取决于 http 服务的内部服务。模拟服务端行为,并更新客户端偏向模拟服务端。实行检测并肯定结论。 内容来自samhan666

zvvq好,好zvvq

怎样在 GoLang 架构中编写依赖外部服务的单元测试 zvvq.cn

介绍 zvvq

撰写取决于外界服务的单元测试可能是一项艰巨的任务。在指南中,我们将介绍在 GoLang 框架中撰写该类检测技巧。

zvvq.cn

模拟外部服务

zvvq好,好zvvq

一种常见的理论是模拟外部服务行为。我们使用 [mock](https://github.com/golang/mock) 包来定义接口和模拟种类。

本文来自zvvq

packageservice

zvvq

// MyService 接口定义了外界服务行为

zvvq

type MyService interface {

内容来自zvvq,别采集哟

GetData() (string, error)

内容来自zvvq

} 内容来自zvvq

// MyServiceMock 是 MyService 接口模拟种类

zvvq.cn

type MyServiceMock struct { copyright zvvq

mock.Mock 本文来自zvvq

} 内容来自zvvq

// GetData 模拟外部服务的 GetData 方式

zvvq

func (m MyServiceMock) GetData() (string, error) {

zvvq好,好zvvq

ret := m.Called()

zvvq.cn

return ret.Get(0).(string), ret.Error(1)

copyright zvvq

} 内容来自zvvq,别采集哟

应用模拟种类

zvvq好,好zvvq

我们可以使用模拟种类来创建单元测试并肯定外界服务的行为。

内容来自zvvq

packageservice

copyright zvvq

import(

zvvq.cn

"testing" copyright zvvq

"time"

内容来自samhan666

) zvvq

funcTestService_GetData(ttesting.T){ 内容来自zvvq

//建立模拟服务

内容来自zvvq

mockService := &MyServiceMock{}

copyright zvvq

// 设定 mock 行为

zvvq

mockService.On("GetData").Return("sample data", nil).Once() 内容来自zvvq,别采集哟

service := NewService(mockService, time.Duration(0))

内容来自zvvq

data, err := service.GetData() zvvq

// 肯定 zvvq.cn

if err != nil {

zvvq好,好zvvq

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

} 内容来自zvvq,别采集哟

实战案例 内容来自zvvq

下列是如何在集成测试中应用模拟种类检测取决于外界服务的 HTTP 服务的实例:

copyright zvvq

55 内容来自samhan666

56 内容来自zvvq,别采集哟

57 zvvq好,好zvvq

58

内容来自samhan666

59 内容来自zvvq

60

内容来自zvvq,别采集哟

61 copyright zvvq

62

内容来自zvvq,别采集哟

63 zvvq好,好zvvq

packageservice_test 本文来自zvvq

import( 内容来自samhan

"context"

本文来自zvvq

"fmt"

内容来自samhan

"io" 内容来自zvvq

"net/http"

内容来自zvvq

"net/http/httptest" copyright zvvq

"strings" 内容来自zvvq,别采集哟

"testing"

内容来自samhan

"github.com/stretchr/testify/assert" 内容来自zvvq,别采集哟

)

本文来自zvvq

funcTestService_GetData(ttesting.T){

内容来自zvvq,别采集哟

typeargsstruct{

zvvq.cn

ctxcontext.Context zvvq好,好zvvq

rhttp.Request 本文来自zvvq

} zvvq.cn

tests:=[]struct{ zvvq.cn

namestring

内容来自samhan

argsargs 本文来自zvvq

mockStatusCodeint

内容来自samhan666

expectedBodystring

内容来自zvvq

}{ 内容来自zvvq,别采集哟

{

内容来自samhan

"Success", 内容来自zvvq,别采集哟

args{context.Background(),new(http.Request)}, 内容来自zvvq

http.StatusOK, zvvq好,好zvvq

"sampledata", copyright zvvq

},

内容来自zvvq,别采集哟

} zvvq.cn

for_,tt:=rangetests{

本文来自zvvq

t.Run(tt.name,func(ttesting.T){

本文来自zvvq

//模拟服务端行为

zvvq

server:=httptest.NewServer(http.HandlerFunc(func(whttp.ResponseWriter,rhttp.Request){

本文来自zvvq

ifr.Method!="GET"{ 内容来自zvvq,别采集哟

t.Errorf("Unexpected HTTP method:%s",r.Method)

内容来自samhan

} zvvq

w.WriteHeader(tt.mockStatusCode)

内容来自samhan666

_,_=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) {

内容来自zvvq,别采集哟

return net.Dial(network, strings.Replace(addr, "localhost", server.Listener.Addr().String(), 1)) 内容来自samhan666

},

内容来自zvvq

}})

本文来自zvvq

// 实行检测 zvvq.cn

result, err := Service.GetData(tt.args.ctx, tt.args.r)

内容来自samhan

assert.Nil(t, err) 内容来自samhan

assert.Equal(t, tt.expectedBody, result) zvvq好,好zvvq

}) 内容来自zvvq

} zvvq好,好zvvq

} 本文来自zvvq

以上就是怎样在 golang 架构中编写依赖外部服务的单元测试?的详细内容,大量请关注其他类似文章! 内容来自zvvq,别采集哟