如何在go中对gRPC服务进行单元测试
我在go中对gRPC服务进行单元测试时遇到困难 我看了看,但它对我不起作用,不确定我做错了什么 Add方法的gRPC服务实现:如何在go中对gRPC服务进行单元测试,go,grpc,grpc-go,Go,Grpc,Grpc Go,我在go中对gRPC服务进行单元测试时遇到困难 我看了看,但它对我不起作用,不确定我做错了什么 Add方法的gRPC服务实现: type server struct{} func main() { listener, err := net.Listen("tcp", ":4040") if err != nil { panic(err) } srv := grpc.NewServer() service.RegisterMathOpServ
type server struct{}
func main() {
listener, err := net.Listen("tcp", ":4040")
if err != nil {
panic(err)
}
srv := grpc.NewServer()
service.RegisterMathOpServiceServer(srv, &server{})
reflection.Register(srv)
if e := srv.Serve(listener); e != nil {
panic(e)
}
fmt.Println("Service is running on localhost:4040")
}
func (s *server) Add(ctx context.Context, request *service.AddRequest)
(*service.AddResponse, error) {
a, b := request.GetX(), request.GetY()
result := a + b
return &service.AddResponse{Answer: result}, nil
}
添加方法的单元测试:
type server struct{}
func main() {
listener, err := net.Listen("tcp", ":4040")
if err != nil {
panic(err)
}
srv := grpc.NewServer()
service.RegisterMathOpServiceServer(srv, &server{})
reflection.Register(srv)
if e := srv.Serve(listener); e != nil {
panic(e)
}
fmt.Println("Service is running on localhost:4040")
}
func (s *server) Add(ctx context.Context, request *service.AddRequest)
(*service.AddResponse, error) {
a, b := request.GetX(), request.GetY()
result := a + b
return &service.AddResponse{Answer: result}, nil
}
包测试
进口(
“上下文”
pb“mathOp_服务/src/service”
“测试”
)
函数测试添加(t*testing.t){
s:=服务器{}看看您的代码组织,您似乎来自Java背景,将src和test放在各自的文件夹中。我在开始编写go时也遇到了同样的问题。我学到的是,最好将src和test放在同一个包和文件夹中,因此,要使代码习惯于go并得到解决删除同一包中的任何变量/方法引用。因此,在测试中,您只需要导入pb包
我还鼓励您查看Golang中的各种代码组织技术。包是否相同?单元测试必须与服务器的定义在同一个包中。
@Mark Yes,它们都在“main”中包。根据引用的SO答案,您需要导入生成的protobuf包-通常别名为pb
。并通过pb
包引用服务器RPC方法。@colminator谢谢。如何解决未定义:服务器
错误?再次查看您的代码,您的服务
似乎出现了要提供pb
,请参见@Mark的注释。unittest没有类型服务器的定义
——因此请确保包含定义顶行(packagw XYZ
等)的源文件与test.go文件的定义匹配。