Методики тестирования AWS без серверов - PullRequest
0 голосов
/ 13 июля 2020

Я новичок в безсерверном мире, использующем Amazon AWS, и я пытаюсь понять основные правила написания интеграционных тестов.

Приведем следующую простую систему, которую мы хотим протестировать:

У нас есть супермаркет, для которого мы хотим сохранить все чеки. Система содержит БД с единой таблицей для данных. Очередь заданий, которая содержит все транзакции, которые необходимо обработать, и пару рабочих, которые выполняют некоторую предварительную обработку для каждого задания в очереди, а затем фиксируют результат в БД.

Мы хотим протестируйте следующий сценарий:

  1. Инициализировать новую БД и очередь
  2. Инициализировать пару рабочих
  3. Вставить задания в очередь
  4. Подождать
  5. Проверить результат
  6. очистить среду

Очистив среду, при следующем запуске тестов будет тот же результат. Если мы этого не сделаем, и, например, данные останутся в БД, это повлияет на валидацию при следующем запуске тестов.

Мой опыт работы с докерами. С ними я мог docker-compose up новую БД и очереди при установке и docker-compose down все контейнеры при демонтаже. Это простое решение.

Теперь вопрос в том, как лучше проводить такие тесты для моего безсерверного приложения AWS? БД - dynamo db. Очереди - sqs, а «рабочие» - lambda s, которые запускаются при вставке sqs. Конечно, это «простой» пример, и он совершенно неубедителен, но вопрос больше, чем конкретный случай c.

Решения, которые я нашел до сих пор:

  1. Использовать локальный такие сервисы, как локальная динамо-база данных, официальная Amazon. Но также и местный SQS, который не является официальным и не поддерживается ими. Минусы: результаты могут отличаться для сервисов Amazon при развертывании.
  2. Используйте sam deploy каждый раз для запуска тестов на Amazon. Я могу создать новый стек, но ресурсы навсегда останутся на серверах Amazon (например, корзины и очереди s3). Минусы: код не является локальным и его трудно отладить + требуется время на развертывание.
  3. Используйте одни и те же ресурсы для всех тестов и очистите их в начале. Минусы: уродливый код и возможность большого количества дублирования кода между проектами.

Из того, что я искал, не существует единого «учебника по написанию тестов», и я хотел бы услышать ваш опыт.

1 Ответ

0 голосов
/ 14 июля 2020

Я провожу много тестов с подобной настройкой, и я так подхожу к делу. Цель состоит в том, чтобы найти баланс между полными имитами и тестированием на работающем сервере.

Для DynamoDb и elasticsearch я использую docker доступных экземпляров. Перед каждым тестом в моей настройке Jest я очищаю таблицы db и индексы elasticsearch. Просто написал простой код для go через список таблиц и стереть их.

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

У меня есть оболочки для все службы aws, которые я использую, такие как Cognito, SNS, SQS и др. c, которые для меня немного абстрагируют aws. Я провожу для них модульные тесты, используя nock , особенно я использую команду nock.recorder.rec(), которая позволяет мне получить ответ от aws. Я провожу эти тесты для всех этих вызовов уровня root. Это гарантирует, что мой код работает с живыми серверами, но его можно повторять без зависимости от этих серверов.

Для всех других модульных тестов (и под модульными тестами здесь я имею в виду тесты, которые просто тестируют функцию и не включают запуск sls offline например) Я буду использовать шутливые имитации и издеваться над методом aws. Поскольку мои обертки низкого уровня aws были протестированы и записаны с помощью nock, теперь я просто имитирую вещи для облегчения тестирования, поскольку я уверен, что макетные методы работают должным образом.

Для тестирования интеграции / e2e при использовании sls offline вещей сложнее, так как я не могу издеваться / проверять, когда что-то загружается на работающий сервер. Для этого я предоставляю каждой службе aws настраиваемую конечную точку (каждая служба aws имеет конфигурацию, которая принимает эти параметры - по умолчанию значение null, она будет использовать реальный сервер aws, но вы можете создать локальный http / express сервер, чтобы высмеивать ответы). Посмотрите этот SO вопрос , где я ответил, как это сделать с помощью Cognito - процесс такой же для всех других сервисов.

Требуется немного поработать, чтобы настроить всю эту среду тестирования но однажды он работает безупречно, а также обеспечивает тестовую настройку, которую могут запускать серверы CI.

Я также должен упомянуть потрясающую работу LocalStack , который предоставляет локальные docker серверы для большинство aws услуг. Я лично предпочитаю запускать только то, что мне нужно, поэтому моя установка выше, а также они не предоставляют локальную абстракцию для всего, что мне нужно, но это отличный вариант для изучения, и он может хорошо соответствовать вашим потребностям. Однако это большой стек (мой ноутбук пугается, если я пытаюсь его запустить).

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