Как смоделировать gRPC api для интеграционного тестирования с golang - PullRequest
0 голосов
/ 21 декабря 2018

все

У меня есть служба, написанная на go, которая связывается с парой других служб по протоколу gRPC.Я хочу написать интеграционные тесты для своего сервиса, но у меня нет возможности использовать реальные зависимости.

Итак, мне нужно каким-то образом смоделировать зависимости.

Для меня идеальный сценарийвыглядит так:

  • Я могу запустить mock-сервер и передать его адрес вместо реальной зависимости моему приложению
  • Я могу зарегистрировать ожидаемый ответ для конкретного вызова зависимой службы
  • Я могу сбросить макет-сервер для разрыва данных после теста.

Я пытался использовать https://github.com/jekiapp/gripmock, но он не поддерживает всеСинтаксис protobuff.

Что может помочь с моей проблемой?Может быть, я совершенно не прав, и есть лучшие практики для интеграционного тестирования сервисов связи gRPC

Ответы [ 3 ]

0 голосов
/ 02 января 2019

Я просто слил какой-то патч, чтобы покрыть большую часть объявления protobuf.Я предлагаю вам проверить это.

известная проблема: он все еще не может проанализировать protobuf, у которого есть объявление тела метода

0 голосов
/ 12 февраля 2019

Другой альтернативный инструмент, который вы можете использовать в этой ситуации: Traffic Parrot .

Недавно мы добавили поддержку gRPC в наш инструмент виртуализации служб , в который входит пользовательИнтерфейс, который можно использовать для определения поведения макета.

Существует учебник о том, как макетировать ответы gRPC по проводам с использованием файла прото.

Вы также можетенайти информацию о том, как записывать и воспроизводить по проводам в документации .

Traffic Parrot gRPC user interface Recording gRPC messages Replaying gRPC messages

0 голосов
/ 21 декабря 2018

Вы можете ускорить свою среду, определив все свои сервисы в файле docker-compose.Вы также должны добавить сервис, который хотите протестировать, в файл docker-compose.После этого вы можете запустить интеграционные тесты в сервисе, который хотите протестировать.

Пример docker-compose file:

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, чтобы вы могли фактически отправить им запрос в ваших интеграционных тестах.Обязательно добавьте эти конечные точки службы в переменные среды, чтобы можно было переопределить конечную точку, на которую вы отправляете запрос.

Для сброса данных, например, в вашей базе данных, вы можете записывать данные.Светильники - это просто вспомогательные функции для сброса данных вашей базы данных, кеша и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...