如何在运行中对gRPC服务进行单元测试

时间:2019-05-26 20:05:30

标签: go grpc grpc-go

我无法在go中对gRPC服务进行单元测试。

我看了Testing a gRPC service,但它对我没有用,不确定我在做什么错。

Add方法的gRPC服务实现:

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
}

添加方法的单元测试:

package test

import (
    "context"
    pb "mathOp_service/src/service"
    "testing"
)
func TestAddition(t *testing.T) {
    s := server{}   <-- error occurs here
    req := pb.AddRequest{X: int64(1), Y: int64(2)}
    res, err := s.Add(context.Background(), req)

    if res.Answer != 3 {
        t.Error("Expected 1 + 2 to equal 3")
    }
}

Project Directory structure

s := server{}引发错误,提示undefined: server

我是Go的新手,找不到解决此问题的解决方案。

1 个答案:

答案 0 :(得分:1)

查看您的代码组织,似乎您来自Java背景,将src和test放在相应的文件夹中。当我开始写go的时候,我也为之挣扎。我了解到的是,最好将src和test放在同一个程序包和文件夹中,以便使代码习惯使用,并且还可以解析同一程序包中的所有变量/方法引用。因此,在测试中,您只需要导入pb软件包。

我还将鼓励您查看https://github.com/golang-standards/project-layout,了解Golang中的各种代码组织技术。