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