Иногда код, который написал нужно протестировать под нагрузкой. Сгенерить нагрузку можно и на коленке, особенно когда у тебя есть Go в кармане. Можно также и на питоне с помощью тредов. Такой подход хорошо работает для простых случаев. Когда прогнал тесты, проверил что твой код держит нагрузку и забыл.
Но когда нужно нагружать систему постоянно, либо перед каждым деплоем, либо как-то периодически, то такие коленочные варианты не подходят. Нужно видеть более подробные отчеты. А еще лучше, чтобы была история запусков и по ним рисовались графики.
В этом посте хочу поделиться своим опытом в использовании k6. Эмоции, опыт и примеры.
О k6
K6 — это инструмент для нагрузочного тестирования, у которого бекенд написан на Go, а сценарии для него нужно писать на javascript. Это классная смесь (хотя я бы предпочел чисто Go, но не суть) для того, чтобы генерировать нагрузку. Javascript хорош тем, что можно парсить html с помощью того же самого jquery например.
Документация у проекта очень подробная и хорошая. На все вопросы можно найти ответы. А если ответ не получается найти в документации, то можно сходить к ним в слак и они вас направят.
Примеры использования
Небольшой пересказ документации :)
В k6, функция, которая генерит нагрузку описывается таким образом
Есть инструменты для проверок, например check
И этих чеков для респонза можно делать множество.
Из более удобных штук у k6 есть запись скриптов, а еще такая штука как group, которая позволяет группировать шаги в BDD стиле.
Подробнее можно почитать тут.
Подключение js зависимостей в проект
Хоть это и классный инструмент, но он тупой и node.js не шарит. Он умеет только браузерный js и поэтому это может быть ограничением, ведь все зависимости, которые вы хотите добавить должны быть прогнаны через browserify.js
Например подключение cheerio выглядит так
git clone git@github.com:cheeriojs/cheerio.git
cd cheerio
npm install
browserify index.js -s cheerio > cheerio.js
mkdir tests/
cp -rf cheerio tests/cheerio
Генерирование конкурентной нагрузки
Какой инструмент для нагрузочного тестирования без конкурентной нагрузки. Для этого у k6 есть связь из vus, iterations и duration в настройках. Подробнее о настройках можно почитать тут.
То есть мы берем, пишем обычный скрипт для k6 с использованием check, group, sleep или еще чего-нибудь и для того, чтобы распаралелить мы используем vus & iterations.
Правда хочу предупредить о некоторой неочевидности с ними.
Vus шарится между iterations. Если вы хотите сгенерировать 100 одновременных запросов, то вам нужно выставлять vus=100, iterations=100.
Заключение
k6 — отличный инструмент для нагрузочного тестирования вместо jmeter. Он не особо требователен к ресурсам, у него удобный и хороший API для работы. Javascript API предоставляет возможность делать более расширяемые тесты. Можно брать и использовать в следующем проекте. У него даже графики есть и история запуска из коробки.
Ранее статья была опубликована тут.