当前位置: 首页 > 知识库问答 >
问题:

如何使用Go语言模拟gRPC api进行集成测试

张可人
2023-03-14

全部的

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

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

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

  • 我可以运行模拟服务器,并将其地址而不是真正的依赖项传递给我的应用程序

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

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

共有3个答案

于高雅
2023-03-14

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

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

狄宗清
2023-03-14

在这种情况下,您可以使用的另一种工具是Traffic Parrot。

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

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

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

沈弘文
2023-03-14

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

为了重置您的数据,例如您的数据库,您可以编写夹具。夹具只是用于重置数据库、缓存等数据的辅助函数。

 类似资料:
  • 我发现可以使用以下方法模拟和: 它工作得很好,但当我尝试运行集成测试时,授权服务器仍然需要启动并运行。否则,Quarkus无法连接到它。 我试图禁用OIDC扩展(),但是代码当然不能编译(endpoint不能识别依赖项)。 那么,在运行集成测试时,哪一种方法是跳过OIDC连接的最佳方法呢? 最好的,

  • 集成测试是对已经进行单元测试的各个部分的一种整合测试。集成是昂贵的,并且它出现在测试中。你必须把这个考虑到你的预计和时间表里。 理想情况下,你应该这样组织一个项目,使得最后没有一个阶段是必须通过显式集成来进行的。这比在项目过程中,随着事情完成逐渐集成事情要好得多。如果这是不可避免的,请仔细评估。

  • 如何模拟集成测试所需的许多依赖关系? 我使用Mockito进行纯单元测试。在这种情况下,Pure意味着测试一个类,嘲笑它的所有依赖关系。漂亮。 现在是集成测试。假设在这种情况下,集成测试将测试以下内容: 消息被放入队列 我们也可以说,在第2步中发生的处理是严肃的事情。它依赖于大量的数据库交互、多种外部服务、文件系统,以及各种各样的东西。流还会引发很多副作用,所以我不能简单地确保响应是正确的——我需

  • 问题内容: 如何模拟使用PowerMock进行测试的专用方法?我有一个类,我想使用一个调用私有方法的公共方法进行测试。我想假设私有方法可以正常工作。例如,我想要类似的东西。我发现有使用PowerMock的解决方案,但该解决方案对我不起作用。怎么做?有人有这个问题吗? 问题答案: 我在这里没有问题。使用Mockito API的以下代码,我做到了: 这是JUnit测试:

  • 我正在使用MockMvc编写集成测试用例来测试RESTAPI。 在我的RESTAPI实现中,我在内部使用RestTemplate(不是直接来自控制器,而是来自控制器调用的util类)来调用第三方REST API。我使用的RestTemplate(制作第三方rest API)不是一个Spring托管bean,而是我将其实例化为RestTemplate restTemplate=new RestTem

  • 前面我们介绍了Go语言的安装,本节我们来为大家介绍几款强大的Go语言集成开发环境(Integrated Development Environment,IDE)和编辑器。 如何挑选合适的编辑器或集成开发环境呢?下面列举了一些Go语言集成开发环境或编辑器应该具备的特性: 语法高亮是必不可少的功能,这也是为什么每个开发工具都提供配置文件来实现自定义配置的原因。 拥有较好的项目文件纵览和导航能力,可以同