【问题标题】:How to mock gRPC api for integration testing with golang如何模拟 gRPC api 以使用 golang 进行集成测试
【发布时间】:2019-05-21 18:43:19
【问题描述】:

全部

我有一个用 go 编写的服务,它通过 gRPC 协议与其他几个服务通信。我想为我的服务编写集成测试,但是我不可能使用真正的依赖项。

所以,我需要以某种方式模拟依赖项。

对我来说,一个完美的场景是这样的:

  • 我可以运行一个模拟服务器并将其地址而不是真正的依赖项传递给我的应用程序
  • 我可以注册对依赖服务的特定调用的预期响应
  • 我可以重置模拟服务器以在测试用例后删除数据。

我尝试使用https://github.com/jekiapp/gripmock,但它不支持所有 protobuff 语法。

什么可以帮助解决我的问题?也许我完全错了,对于与 gRPC 通信的服务的集成测试有最佳实践

【问题讨论】:

  • 您有一项服务要测试。我希望您在测试中使用测试配置启动服务,然后使用客户端(您的测试客户端)向服务发出请求,然后将获得的数据与预期数据进行比较。集成测试的想法不是模拟某些东西,那么它就不再是集成测试了。
  • 抱歉术语有误。我需要对我的服务中的业务逻辑进行黑盒测试。问题是我的服务只有几个依赖项,但是这些依赖项需要很多基础设施。把它想象成一个微服务,它只使用单体应用中的一个处理程序
  • 大概您可以访问原型定义,对吧?因此,生成服务存根并根据需要实现它们。如果没记错的话,protoc 无论如何都会同时生成客户端和服务器代码,所以你应该已经有了服务器接口。
  • 你解决过这个问题吗?也在努力用 gripmock 完成这项工作,并怀疑我正在尝试做的一些事情可能不受支持
  • 这能回答你的问题吗? Testing a gRPC service

标签: go mocking integration-testing grpc


【解决方案1】:

您可以通过在 docker-compose 文件中定义所有服务来启动您的环境。您还应该在 docker-compose 文件中添加要测试的服务。启动后,您可以在要测试的服务中运行集成测试。

示例 docker-compose 文件:

version: '2.2'

services:
  service-you-want-to-test:
    build: .
    image: service-you-want-to-test
    container_name: service-you-want-to-test
    environment:
      - ENVIRONMENT=${ENVIRONMENT}
      - REDIS_ADDRESSES=[redis:6379]
      - SERVICE_YOU_DEPEND_ON_ENDPOINT=service-you-depend-on:8091
      - DB_HOST=mysql
      - DB_USER=root
    links:
      - redis
      - mysql
      - service-you-depend-on
    depends_on:
      mysql:
        condition: service_healthy
    ports:
      - 8090:8090

  service-you-depend-on:
    image: service-you-depend-on:latest
    container_name: service-you-depend-on
    environment:
      - DB_HOST=mysql
      - DB_USER=root
    links:
      - redis
      - mysql
    depends_on:
      mysql:
        condition: service_healthy
    ports:
      - 8091:8091

  mysql:
    image: mysql:5.7
    container_name: mysql
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "true"
    volumes:
    - ./.docker/mysql/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
    - ./.docker/mysql/healthcheck-5.7:/var/www/healthcheck
    healthcheck:
      test: "/var/www/healthcheck"
      interval: 5s
      timeout: 5s
      retries: 5
    ports:
    - 3306:3306

  redis:
    image: redis:3.2
    container_name: redis
    ports:
      - 6379:6379

要设置您的集成环境,您可以使用以下命令:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
docker build -t service-you-want-to-test .
docker-compose up -d redis mysql
docker-compose up -d --build service-you-want-to-test

运行上述代码后,您可以通过命令行执行集成测试:

go test -v path/to/integration_tests/...

因此,您还应该将所依赖的服务添加到 docker-compose 文件中,这样您就可以在集成测试中实际向它们发送请求。请务必在您的环境变量中添加这些服务端点,以便您可以覆盖您将请求发送到的端点。

为了重置您的数据,例如您的数据库,您可以编写固定装置。固定装置只是重置数据库、缓存等数据的辅助函数。

【讨论】:

    【解决方案2】:

    我只是合并了一些补丁来覆盖大部分 protobuf 声明。我建议你检查一下。

    已知问题:它仍然无法解析具有方法主体声明的 protobuf

    【讨论】:

      【解决方案3】:

      您可以在这种情况下使用的另一个替代工具是Traffic Parrot

      我们最近向 service virtualization tool 添加了对 gRPC 的支持,其中包括可用于定义模拟行为的用户界面。

      tutorial 介绍了如何通过给定 proto 文件的线路模拟 gRPC 响应。

      您还可以在documentation 中找到有关如何通过网络录制和回放的信息。

      【讨论】:

        猜你喜欢
        • 2022-01-24
        • 1970-01-01
        • 2017-01-23
        • 1970-01-01
        • 2021-11-10
        • 1970-01-01
        • 2014-02-01
        • 1970-01-01
        • 2016-08-19
        相关资源
        最近更新 更多