模拟真实的 gRPC 服务器响应

Mar*_*rio 6 integration-testing google-kubernetes-engine grpc

我们的管道中有一个需要进行集成测试的微服务(真实调用,但没有与 kubernetes 中测试命名空间之外的任何内容进行网络通信)。它还依赖于我们无法控制的外部 gRPC 服务器。

集成测试图

上面是我们希望发生的情况的图片。左侧的白框是为微服务边界提供“外部”数据的代码。然后,它继续通过 REST 调用代码,直到返回正确数量的记录或超时。该代码从内部数据库中提取记录,以及从 gRPC 调用中提取与这些记录相关的数据。由于我们不拥有 gRPC 服务,但正在进行集成测试,因此我们需要对我们调用的两个 gRPC 服务(蓝色框)进行一些预定义的响应。

由于我们的集成测试现在是独立的,并且我们不想仅仅为了模仿调用而编写一个全新的实际 gRPC 服务器实现,有没有办法建立一个真正的 gRPC 服务器并将其配置为返回响应?该请求非常类似于模拟设置,只不过使用的是实际服务器。

我们需要能够:

  1. 为服务器提供多个原始文件进行解释,并将其公开为端点。Proto 文件必须能够具有不同的包名称
  2. 使用我们可以存储在源代码管理中的文件,配置对每个调用的响应
  3. 能够在Linux docker容器中运行(没有Windows)

我确实找到了grimock,它看起来几乎正是我们所需要的,但它只为每个容器提供一个原始文件。据说它可以服务多个文件,但我无法让它工作,并且他们提供两个文件的示例意味着每个原始文件必须具有相同的包名称,这在我们的场景中可能永远不会发生。与此同时,我们正在使用它,但如果我们有 10 个 gRPC 调用依赖项,我们现在必须运行 10 个 gigmock 服务器。

len*_*non 0

看一下这个 JS 库,希望它能满足您的需求:

https://github.com/alenon/grpc-mock-server

使用示例:

    private static readonly PROTO_PATH: string = __dirname + "example.proto";
    private static readonly PKG_NAME: string = "com.alenon.example";
    private static readonly SERVICE_NAME: string = "ExampleService";
    
    ...
        
    const implementations = {
        ex1: (call: any, callback: any) => {
            const response: any =
                new this.proto.ExampleResponse.constructor({msg: "the response message"});
            callback(null, response);
        },
    };
    
    this.server.addService(PROTO_PATH, PKG_NAME, SERVICE_NAME, implementations);
    this.server.start();
Run Code Online (Sandbox Code Playgroud)