Обработка запросов сторонних API в сквозном тестировании

Я хочу протестировать мой Rest API с помощью сквозных тестов. Насколько я понимаю, разница между интеграционными тестами заключается в том, что мы не выполняем конфигурацию системы в памяти, а используем реальные тестовые БД и сетевые запросы.

Но я не могу понять, как обращаться с сторонними запросами API (например, GitHub или Bitbucket API).

Это обычная практика создания поддельной учетной записи Github с поддельными данными, которые будут получены моими испытаниями?

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

Ответ 1

Это обычная практика создания поддельной учетной записи Github с поддельными данными, которые будут получены моими испытаниями?

Да. Цель теста E2E (против теста интеграции) состоит в том, чтобы проверить, что полная система работает со всеми реальными компонентами системы на месте, как с теми, которые вы контролируете, так и с теми, которые у вас нет. Это может быть трудно настроить и боль для поддержания; но многие из этих болевых точек будут подвергать реальным потенциальным проблемам в вашем производственном обслуживании. Как ваш сервис реагирует на эту нестабильность, сам по себе является функцией, которую нужно протестировать: происходит ли сбой системы и ее сбой, или изящно представляет сообщение об ошибке и поддерживает хорошую обработку повторных попыток?

Это также предоставляет вам тип покрытия, которое mocks не может обеспечить: если сторонний API, который вы используете, является непослушным и вводит какое-то изменение, ваши тесты E2E поймают его. Это достойная причина постоянно запускать ваш E2E-пакет; не только во время развертывания.

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

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

Ваша промежуточная среда должна быть сконфигурирована с отдельными учетными записями sandbox для внешних служб. Я не уверен, что вы подразумеваете под "не все сервисы являются общедоступными", а просто старайтесь держать свою промежуточную среду (или проверять пользователей на prod) как идентичную реальному пользователю prod. Для служб, которые не поддерживают множественные токены доступа, вы можете получить креатив и попытаться четко разграничить свои тестовые данные в своей системе.

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

Ответ 2

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

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

Что касается того, как писать тесты вокруг этих ситуаций, то это немного сложнее. В Ruby есть такие инструменты, как VCR, которые хорошо работают для заглушения ваших языковых интернет-соединений и позволяют вам заглушать, записывать и настраивать ответы (список аналогичных реализаций на других языках приведен ниже в их Прочти меня). Однако это не работает, когда ваш браузер подключается к этим ресурсам в автоматических сквозных тестах. Существуют инструменты для прокси-подключения вашего браузера, такие как Puffing Billy в Ruby, но это довольно сложный процесс настройки, включая управление сертификатами безопасности. Это кажется довольно хрупким и трудным для отладки, когда что-то работает не совсем правильно.

Лучшим вариантом для написания тестов, которые являются детерминированными и поддерживаемыми, может быть фальсификация сервиса в тестовом режиме. thinkbot имеет довольно приличное видео об этом, а здесь статью высокого уровня от CircleCI. По сути, вы меняете адаптер в тестовом режиме, который заменяет стороннюю интеграцию сервисов. Возможно, то, что вы можете сделать на своем локальном компьютере, - это возможность дополнительно использовать реальную службу или адаптер через переменную среды, чтобы убедиться, что тесты выполняются одинаково для обоих. Вы также можете настроить ежедневную сборку так, чтобы она работала с реальными вещами, чтобы она проверяла, что тесты по-прежнему работают нормально, не внося много ошибок в ваши более частые сборки. Однако я столкнулся с одной проблемой: даже если я настрою тестовую учетную запись в сторонней службе, результаты со временем будут меняться по мере добавления или изменения информации для тестирования новых функций, таких как добавление новых. репозитории, изменение проблем и т.д. Требуется дополнительное внимание для поддержания вашей тестовой учетной записи в качестве набора приспособлений для всех ваших тестов.

Еще один полезный инструмент, с которым я столкнулся, - это ngrok-tunnel (снова Ruby). Это актуально только в тех случаях, когда вам нужна сторонняя служба для связи с вашим приложением, поскольку они не могут отправлять запросы через Интернет на localhost:3000. Если вы настроили какие-то веб-зацепки, подобные сервисы могут сделать тестирование намного проще.