为了账号安全,请及时绑定邮箱和手机立即绑定

如何模拟 gRPC api 以与 golang 进行集成测试

如何模拟 gRPC api 以与 golang 进行集成测试

Go
炎炎设计 2023-05-22 15:57:49
全部我有一个用 go 编写的服务,它通过 gRPC 协议与其他几个服务通信。我想为我的服务编写集成测试,但是我不可能使用真正的依赖项。所以,我需要以某种方式模拟依赖关系。对我来说,一个完美的场景是这样的:我可以运行模拟服务器并将其地址传递给我的应用程序而不是真正的依赖项我可以注册对依赖服务的特定调用的预期响应我可以重置模拟服务器以在测试用例后拆除数据。我尝试使用https://github.com/jekiapp/gripmock但它不支持所有的 protobuff 语法。什么可以帮助解决我的问题?也许我完全错了,并且有用于通信 gRPC 的服务集成测试的最佳实践
查看完整描述

2 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

您可以通过在 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 文件中,这样您就可以在集成测试中实际向它们发送请求。请务必将这些服务端点添加到您的环境变量中,以便您可以覆盖将请求发送到的端点。


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


查看完整回答
反对 回复 2023-05-22
?
桃花长相依

TA贡献1860条经验 获得超8个赞

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

我们最近在我们的服务虚拟化工具中添加了对 gRPC 的支持,该工具包括一个可用于定义模拟行为的用户界面。

有一个教程介绍如何在给定原型文件的情况下通过网络模拟 gRPC 响应。

您还可以在文档中找到有关如何通过网络进行记录和重放的信息。

//img1.sycdn.imooc.com//646b209900014ece06540415.jpg

//img1.sycdn.imooc.com//646b20a400011e4006120301.jpg

//img1.sycdn.imooc.com//646b20ae0001443805770283.jpg

查看完整回答
反对 回复 2023-05-22
?
暮色呼如

TA贡献1853条经验 获得超9个赞

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

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


查看完整回答
反对 回复 2023-05-22
  • 2 回答
  • 0 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信