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