ZVVQ代理分享网

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

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

在 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 架构中编写依赖外部服务的单元测试?的详细内容,大量请关注其他类似文章!