我想测试用 Go 编写的 gRPC 服务。我使用的示例是 Hello World 服务器示例grpc-go 仓库 https://github.com/grpc/grpc-go/blob/master/examples/helloworld/greeter_server/main.go.
protobuf定义如下:
syntax = "proto3";
package helloworld;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
以及类型中的greeter_server
主要是:
// server is used to implement helloworld.GreeterServer.
type server struct{}
// SayHello implements helloworld.GreeterServer
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
return &pb.HelloReply{Message: "Hello " + in.Name}, nil
}
我查找了示例,但找不到任何有关如何在 Go 中实现 gRPC 服务测试的示例。
我想你正在寻找google.golang.org/grpc/test/bufconn
包可帮助您避免使用真实端口号启动服务,但仍允许测试流式 RPC。
import "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.
}
这种方法的好处是,您仍然可以获得网络行为,但是通过内存中的连接,而不使用操作系统级资源(例如可能会或可能不会快速清理的端口)。它允许您以实际使用的方式对其进行测试,并为您提供正确的流媒体行为。
我的脑海中没有一个流媒体示例,但神奇的酱汁就在上面。它为您提供正常网络连接的所有预期行为。技巧是设置 WithDialer 选项,如图所示,使用 bufconn 包创建一个公开其自己的拨号器的侦听器。我一直使用这种技术来测试 gRPC 服务,而且效果很好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)