首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何模拟gRPC api与golang集成测试

如何模拟gRPC api与golang集成测试
EN

Stack Overflow用户
提问于 2018-12-21 09:35:48
回答 3查看 5.1K关注 0票数 6

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

因此,我需要以某种方式来模拟依赖关系。

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

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

我试着使用https://github.com/jekiapp/gripmock,但它不支持所有的原型语法。

有什么能解决我的问题吗?也许我完全错了,并且有一些用于服务通信gRPC集成测试的最佳实践

EN

回答 3

Stack Overflow用户

发布于 2018-12-21 11:05:10

您可以通过将您的所有服务都定义在一个坞-组合文件中来改善您的环境。您应该在文件中添加您想要测试的服务。在将其拆分之后,您可以在要测试的服务中运行集成测试。

示例docker-组合文件:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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

运行上述命令之后,您只需通过命令行执行集成测试:

代码语言:javascript
复制
go test -v path/to/integration_tests/...

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

例如,为了在数据库中重置数据,可以编写夹具。这些固定装置只是用来重置数据库、缓存等数据的辅助函数。

票数 2
EN

Stack Overflow用户

发布于 2019-02-12 14:00:45

在这种情况下可以使用的另一个替代工具是交通鹦鹉

我们最近将对gRPC的支持添加到我们的服务虚拟化工具中,其中包括一个可以用来定义模拟行为的用户界面。

有一个关于如何在给定proto文件的线路上模拟gRPC响应的gRPC。

您还可以找到有关如何在文档中通过连线记录和重播的信息。

票数 1
EN

Stack Overflow用户

发布于 2019-01-02 04:01:05

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

已知问题:它仍然不能解析具有方法体声明的原型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53882312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档