Пять видов работ внутри тестирования API
Функциональное. Делает ли отдельный эндпоинт то, что нужно, в том числе при некорректных входных данных. Начинайте отсюда. Всё остальное это подразумевает.
Интеграционное. Приводят ли последовательности вызовов к правильному результату. Именно здесь на самом деле живёт большинство заметных пользователю багов.
Контрактное. Согласны ли два сервиса относительно формата данных. Полезно при независимых развёртываниях и ничего не говорит о корректности.
Оставшиеся два — это нагрузочное тестирование, которое отвечает на вопрос о пропускной способности и требует отдельного генератора нагрузки, и поведение с точки зрения безопасности, которое в основном сводится к проверкам авторизации и должно идти рядом с функциональным покрытием, а не превращаться в ежеквартальное мероприятие.
Порядок, в котором их стоит выполнять
Функциональное — на эндпоинтах, которые имеют значение. Включая негативные сценарии. На этом строится всё остальное.
Интеграционное — на ваших реальных пользовательских сценариях. По три-пять шагов в каждом, а не по двенадцать.
Проверки авторизации везде. Это дёшево, а авторизация на уровне объектов — самая часто эксплуатируемая уязвимость API.
Контрактное — если сервисы развёртываются независимо. Если вы выкатываете всё одновременно, пропустите его.
Нагрузочное — перед релизами. В последнюю очередь, потому что нагрузочное тестирование некорректного эндпоинта измеряет лишь то, как быстро вы можете выдавать неверный результат.
Четыре проблемы — какой бы инструмент вы ни выбрали
Переживёт ли набор API-тестов первый год, решают четыре вещи: истекающие сессии, значения, которые существуют только во время выполнения, вызовы, зависящие друг от друга, и записи, которые никто не убирает. В TestSprite за это отвечают Auto-Authentication, Dynamic Variables, Dependency Chains и Auto-Cleanup, описанные в документации по тестированию API.
Каждая команда встречает их в одном и том же порядке, и для большинства это оказывается неожиданностью. Заложить их в архитектуру заранее — вот что отличает набор тестов, который живёт, от того, который отправляют в карантин.
Проверка, которая важнее всего
Проверяйте тело ответа, а не только статус. Ответ 200 с пустым списком там, где должна быть запись, — это баг, который проверка статуса засчитает как успех. Одна эта привычка ловит больше настоящих дефектов, чем любое другое отдельное изменение.
Первые десять тест-кейсов, конкретно
Если набор тестов пуст, самое сложное — решить, с чего начать, а общий ответ отнимет неделю. Вот список, который подходит большинству продуктов.
Три — на главный объект вашего продукта: создать его, получить обратно и проверить поля, удалить и убедиться, что его больше нет. Два — на авторизацию: тот же запрос без учётных данных и с учётными данными другого пользователя. Два — на входные данные: отсутствующее обязательное поле и значение вне допустимого диапазона. Два — на ту последовательность, из-за которой вы нервничаете перед релизом, какой бы она у вас ни была. Один — на эндпоинт, который сломался в прошлый раз.
Десять тест-кейсов, работы на одно утро, и они закрывают те ситуации, из которых вырастает большинство инцидентов. Дальше расширяться стоит от того, что действительно ломается, а не в сторону целевого показателя покрытия: второй подход даёт большие наборы тестов, которые бьют мимо цели.
С чего начать сегодня
Направьте проект на свой сервис, дайте механизму обнаружения перечислить всё, что есть, и прочитайте сгенерированный план, прежде чем что-либо запускать. План расскажет о вашем API больше, чем первые результаты, и именно в него вы добавляете свои знания о продукте.
Терминал
npm install -g @testsprite/testsprite-cli
testsprite setup
Если вы предпочитаете ничего не устанавливать, то же самое можно сделать в панели управления. Всё остальное, что умеет командная строка, описано в репозитории CLI.
GitHub App — это вебхук, который вы настраиваете в панели управления TestSprite. Он слушает событие развёртывания, которое ваш пайплайн уже генерирует, поэтому в вашем репозитории ничего не меняется.
GitHub Actions встраивает этот шаг в ваш собственный workflow и настраивается из терминала.
Какое место TestSprite занимает среди этих пяти
Функциональное, интеграционное и поведенческая половина безопасности. Он проверяет работающий сервис, строит планы по результатам прохода обнаружения и вашей спецификации и закрывает негативные сценарии, которые пропускают написанные вручную наборы тестов.
Auto-Authentication поддерживает сессии живыми на протяжении всего прогона, Dynamic Variables переносят значения между вызовами, Dependency Chains выводят порядок выполнения из того, что каждый тест-кейс требует и что производит, а Auto-Cleanup удаляет ровно то, что создал прогон. Именно эти четыре вещи решают, переживёт ли набор тестов первый год, в любом инструменте, и когда они встроены в продукт, вы расширяете набор тестов, а не обслуживаете его.
Контрактное и нагрузочное тестирование остаются отдельными инструментами, а описанное здесь работает рядом с обоими. Вы получаете тот слой, где живёт большинство заметных пользователю дефектов, — покрытый без собственного фреймворка и запускающийся на каждом pull request.
Сколько покрытия нам нужно?
Покройте сценарии, сломать которые вам было бы стыдно, плюс каждый эндпоинт, связанный с деньгами или правами доступа. Расширяйтесь от инцидентов, а не в сторону процента.
Стоит ли тестировать на продакшене?
На репрезентативном окружении. Создавать и удалять записи в продакшене ради набора тестов — само по себе риск.
Нужна ли спецификация?
Она помогает, но не обязательна. Прохода обнаружения по работающему сервису плюс документа с требованиями достаточно, чтобы получить рабочий план.
А как насчёт моков?
Мокайте сторонние сервисы, которые вы не контролируете. Мокая собственный сервис, вы тестируете мок.
Как часто должен запускаться набор тестов?
Функциональные и интеграционные — на каждый pull request, нагрузочные — по расписанию. Набор тестов, который запускается раз в неделю, находит проблемы с недельным опозданием.
Пять видов работ, один порядок.
Тестирование API — это функциональное, интеграционное, контрактное, нагрузочное и поведение с точки зрения безопасности. Сначала функциональное и интеграционное, затем проверки авторизации везде, и с самого начала закладывайте в архитектуру сессии, захваченные значения, порядок выполнения и очистку.