Maison >développement back-end >Golang >Comment puis-je tester efficacement les services gRPC en Go sans utiliser de vrais ports ?

Comment puis-je tester efficacement les services gRPC en Go sans utiliser de vrais ports ?

DDD
DDDoriginal
2024-12-17 18:12:15437parcourir

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

Test d'un service gRPC

Le test des services gRPC écrits en Go peut être réalisé à l'aide du package google.golang.org/grpc/test/bufconn. Ce package facilite le test des RPC de streaming sans dépendre de numéros de port réels.

Exemple :

Pour tester le serveur Hello World fourni :

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.
}

Avantages :

  • Évite l'utilisation réelle du port pendant les tests
  • Fournit le comportement du réseau dans un environnement contrôlé
  • Simule des modèles d'utilisation réels pour tester les RPC de streaming

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn