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