[gRPC-Go] 서버 테스트를 네트워크 연결 없이 수행
9552 단어 gRPC
gRPC Server 테스트
gRPC 서버는 일반적으로 TCP 서버를 설정해야 하며 테스트하려고 하면 귀찮습니다.
그래서 통신 부분을 in-memory로 바꿔주는 grpc/test/bufconn 라는 패키지를 이용하면 편리합니다.
bufconn은 네트워크 서버처럼 동작하는
Listener
를 가지고 있으며 Dial()
메소드로 클라이언트 연결처럼 동작하는 net.Conn
도 가진다는 특징이 있습니다.bufconn을 사용하여 네트워크 연결없이 테스트
이제 실제로 bufconn을 사용한 테스트를 작성해 보겠습니다.
소스 코드는 다음 리포지토리에도 게시됩니다.
htps : // 기주 b. 코 m / 카 s 타네 아이 / grpc - s sing g-u-th-f f
예를 들면 gRPC 공식 튜토리얼에도 있습니다. 다음과 같은 간단한 RPC로 생각합니다.
syntax = "proto3";
package hello;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
protoc
에서 Go 정의 파일을 생성하여 다음과 같은 디렉토리 구성으로 만듭니다.$ protoc greeter.proto --go_out=plugins=grpc:.
.
├── go.mod
├── go.sum
├── greeter.pb.go
├── greeter.proto
└── server
├── server.go
└── server_test.go
server/
디렉토리 아래에 두 개의 파일을 만듭니다.server.go
서버 구현 server_test.go
서버 테스트 (bufconn을 사용하는 부분) server.go
는 아무것도 특별한 것은 없으며 일반 gRPC 서버 구현 입니다.둘째,
server_test.go
하지만 여기가 중요합니다!gRPC-Go에서는
grpc.Dial()
로 서버에 연결하지만 grpc.DialContext(grpc.WithCotnextDialer(...))
를 사용합니다.WithContextDialer
의 내용을 bufconn에 연결 lis.Dial()
로 바꾸는 방법입니다.server_test.go
package main
import (
"context"
"log"
"net"
"testing"
"google.golang.org/grpc"
"google.golang.org/grpc/test/bufconn"
pb "github.com/castaneai/grpc-testing-with-bufconn"
)
const bufSize = 1024 * 1024
var lis *bufconn.Listener
func init() {
lis = bufconn.Listen(bufSize)
s := grpc.NewServer()
pb.RegisterGreeterServer(s, &server{})
go func() {
if err := s.Serve(lis); err != nil {
log.Fatal(err)
}
}()
}
func bufDialer(ctx context.Context, address string) (net.Conn, error) {
return lis.Dial()
}
func TestSayHello(t *testing.T) {
ctx := context.Background()
conn, err := grpc.DialContext(ctx, "bufnet", grpc.WithContextDialer(bufDialer), grpc.WithInsecure())
if err != nil {
t.Fatal(err)
}
defer conn.Close()
client := pb.NewGreeterClient(conn)
resp, err := client.SayHello(ctx, &pb.HelloRequest{Name: "test"})
if err != nil {
t.Fatal(err)
}
if resp.GetMessage() != "Hello test" {
t.Fatal("hello reply must be 'Hello test'")
}
}
이제 테스트를 실행해 보면 즉시 테스트가 통과했습니다!
$ go test -v ./...
=== RUN TestSayHello
2019/10/04 12:50:04 Received: test
--- PASS: TestSayHello (0.00s)
PASS
ok github.com/castaneai/grpc-testing-with-bufconn/server 0.024s
Reference
이 문제에 관하여([gRPC-Go] 서버 테스트를 네트워크 연결 없이 수행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/castaneai/items/8f975204a79e9783ecc3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)