>백엔드 개발 >Golang >실제 포트를 사용하지 않고 Go에서 gRPC 서비스를 효율적으로 테스트하려면 어떻게 해야 합니까?

실제 포트를 사용하지 않고 Go에서 gRPC 서비스를 효율적으로 테스트하려면 어떻게 해야 합니까?

DDD
DDD원래의
2024-12-17 18:12:15429검색

How Can I Efficiently Test gRPC Services in Go Without Using Real Ports?

gRPC 서비스 테스트

Go로 작성된 gRPC 서비스 테스트는 google.golang.org/grpc/test/bufconn 패키지를 사용하여 수행할 수 있습니다. 이 패키지는 실제 포트 번호에 의존하지 않고 스트리밍 RPC 테스트를 용이하게 합니다.

예:

제공된 Hello World를 테스트하려면 서버:

package main

import (
    "context"
    "log"
    "testing"

    pb "helloworld"

    "github.com/golang/protobuf/ptypes/empty"

    "google.golang.org/grpc"
    "google.golang.org/grpc/codes"
    "google.golang.org/grpc/status"
    "google.golang.org/grpc/test/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.Fatalf("Server exited with error: %v", err)
        }
    }()
}

func bufDialer(context.Context, 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.Fatalf("Failed to dial bufnet: %v", err)
    }
    defer conn.Close()
    client := pb.NewGreeterClient(conn)
    resp, err := client.SayHello(ctx, &pb.HelloRequest{"Dr. Seuss"})
    if err != nil {
        t.Fatalf("SayHello failed: %v", err)
    }
    log.Printf("Response: %+v", resp)
    // Test for output here.
}

이점:

  • 테스트 중 실제 포트 사용 방지
  • 통제된 환경에서 네트워크 동작 제공
  • 스트리밍 테스트를 위한 실제 사용 패턴을 시뮬레이션합니다. RPC

위 내용은 실제 포트를 사용하지 않고 Go에서 gRPC 서비스를 효율적으로 테스트하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.