Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 如何在Grpc服务器实现中模拟Grpc客户端_Performance_Unit Testing_Go_Grpc_Grpc Go - Fatal编程技术网

Performance 如何在Grpc服务器实现中模拟Grpc客户端

Performance 如何在Grpc服务器实现中模拟Grpc客户端,performance,unit-testing,go,grpc,grpc-go,Performance,Unit Testing,Go,Grpc,Grpc Go,我有一台GRPC服务器,它正在与许多其他GRPC服务器通信。 因此,我的服务器是许多其他GRPC服务器的客户端 我想测试我的服务器实现,但我一直在研究如何模拟GRPC客户端 我有一个来自GRPC服务器的方法,如下所示: func(s UserBackendServer)UpdateUser(ctx context.context,req*api.UpdateUserRequest)(*api.User,错误){ conn,err:=grpc.DialContext(ctx,s.usersvcad

我有一台GRPC服务器,它正在与许多其他GRPC服务器通信。 因此,我的服务器是许多其他GRPC服务器的客户端 我想测试我的服务器实现,但我一直在研究如何模拟GRPC客户端

我有一个来自GRPC服务器的方法,如下所示:

func(s UserBackendServer)UpdateUser(ctx context.context,req*api.UpdateUserRequest)(*api.User,错误){
conn,err:=grpc.DialContext(ctx,s.usersvcadr,
grpc.WithUnsecure(),
grpc.with statshandler(&ocgrpc.ClientHandler{}))
如果错误!=零{
返回nil,fmt.Errorf(“无法连接配送服务:%+v”,错误)
}
延迟连接关闭()
用户,错误:=api.NewUserServiceClient(conn)。
UpdateUser(ctx和api.UpdateUserRequest{
用户:无,
用户ID:“”,
})
返回用户,无
}
在这种类型的实现中,我无法模拟UserServiceClient,因为我在方法内部创建了一个:(

我想了两种方法来解决这个问题

  • 将客户机引用放在
    UserBackendServer
    struct中
  • 键入UserBackendServer结构{
    射影串
    userSvcClient api.UserServiceClient
    }
    func(s UserBackendServer)UpdateUser(ctx context.context,req*api.UpdateUserRequest)(*api.User,错误){
    conn,err:=grpc.DialContext(ctx,s.usersvcadr,
    grpc.WithUnsecure(),
    grpc.with statshandler(&ocgrpc.ClientHandler{}))
    如果错误!=零{
    返回nil,fmt.Errorf(“无法连接配送服务:%+v”,错误)
    }
    延迟连接关闭()
    user,err:=s.userSvcClient.UpdateUser(ctx,&api.UpdateUserRequest{
    用户:无,
    用户ID:“”,
    })
    返回用户,无
    }
    
    通过这种实现,我的副作用是与客户机保持持续的活动连接(我有10个客户机要与之通信)。在生产中可以吗?始终连接客户机会导致内存泄漏或连接过多吗

  • 使用将客户机作为参数的方法
  • func(s UserBackendServer)UpdateUser(ctx context.context,req*api.UpdateUserRequest)(*api.User,错误){
    conn,err:=grpc.DialContext(ctx,s.usersvcadr,
    grpc.WithUnsecure(),
    grpc.with statshandler(&ocgrpc.ClientHandler{}))
    如果错误!=零{
    返回nil,fmt.Errorf(“无法连接配送服务:%+v”,错误)
    }
    延迟连接关闭()
    客户端:=api.NewUserServiceClient(conn)
    updateUser(ctx、req.UserId、req.User、客户端)
    user,err:=s.userSvcClient.UpdateUser(ctx,&api.UpdateUserRequest{
    用户:无,
    用户ID:“”,
    })
    返回用户,无
    }
    func updateUser(ctx context.context,userId字符串,user*api.user,client api.UserServiceClient)(*api.user,错误){
    userUpdated,err:=client.UpdateUser(ctx和api.UpdateUserRequest{
    用户:无,
    用户ID:“”,
    })
    返回userUpdated,err
    }
    
    编写所有这些小函数似乎有点麻烦,我无法对服务器功能进行单元测试


    第一个策略是否可行?如果在服务器结构中维护连接,您是否有关于限制或如何重试失败连接的经验?您有一个对某些grpc服务器进行一元调用的客户端。当您调用客户端构造函数时,它不应实例化任何连接-仅当您调用updat时eUser方法。因此,这里最好也是唯一正确的选择是将您的客户端传递给构造函数并模拟您的依赖关系。@alvery所以当我执行客户端:=api.NewUserServiceClient(conn)时,我没有启动连接。如果我理解正确,请写一个答案,我会接受它(经过一些测试)。我将在接下来的几天进行测试。谢谢。我们找到解决方案了吗?我面临着类似的问题,可以对客户端模拟进行单元测试DL“无论我如何无法为客户端模拟设置构造函数,返回一个错误>对*mock…xyz_mock的意外调用。go:65因为:没有预期的方法“xyz”调用"对于该Receiver,您有一个对某些grpc服务器进行一元调用的客户端。当您调用客户端构造函数时,它不应该实例化任何连接-仅当您调用updateUser方法时。因此,这里最好也是唯一正确的选项是将您的客户端传递给构造函数,并模拟您的依赖关系。@alvery所以当我执行客户端时:=api.NewUserServiceClient(康涅狄格州)我没有启动连接。如果我理解正确,请写一个答案,我将接受它(经过一些测试)。我将在接下来的几天进行测试。谢谢。我们找到解决方案了吗?我面临类似的问题,可以对客户端模拟进行单元测试“但是,我无法为客户端mock设置构造函数,返回一个错误>对*mock…xyz_mock.go的意外调用:65,因为:该接收方没有预期的方法“xyz”调用。”