Вы ищете бесплатный инструмент для нагрузочного тестирования с открытым исходным кодом для вашего RESTful API? Не ищите дальше, чем k6.
k6 — это удобный для разработчиков инструмент с открытым исходным кодом для нагрузочного, производительного и нагрузочного тестирования API, микросервисов и веб-сайтов. Он разработан с учетом сценариев, масштабируемости и простоты использования даже для тех, у кого нет или мало опыта в нагрузочном тестировании. С помощью k6 вы можете имитировать реалистичный трафик и измерять, как ваша система реагирует на нагрузку, чтобы вы могли выявлять и устранять проблемы с производительностью до того, как они повлияют на ваших пользователей.
Одна из замечательных особенностей k6 заключается в том, что он позволяет вам кодировать сценарии тестирования на JavaScript. Если вы предпочитаете TypeScript, k6 даже предлагает поддержку шаблонов. Кроме того, вы можете создавать сценарии тестирования из OpenAPI или Postman.
Перейдем к следующему разделу настройки и установки.
Настраивать
Настройка и установка k6 на разных платформах очень проста, и этот процесс немного отличается в зависимости от вашей операционной системы.
Окна
Пользователи Windows могут легко установить k6 с помощью установщика MSI. Загрузите установщик с веб-сайта k6, запустите его, как любой другой установщик программного обеспечения, и вы готовы к использованию k6.
Мак
Для пользователей Mac более простым процессом установки k6 является запуск одной команды в терминале:
brew install k6
Убунту
Если вы используете Debian или Ubuntu, вы можете установить k6 через менеджер пакетов apt-get. Выполните следующие команды в своем терминале:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69 echo "deb https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list sudo apt-get update sudo apt-get install k6
Если у вас возникли проблемы с получением ключа из-за брандмауэров или прокси-серверов, вы можете попробовать использовать альтернативную команду ниже:
curl -s https://dl.k6.io/key.gpg | sudo apt-key add -
Основные сценарии K6
Основные ключевые элементы сценария k6 обычно содержат следующее:
import http from "k6/http"; import { sleep } from "k6"; //option section export let options = { vus: 10, duration: "30s" }; //default function section export default function() { const res = http.get("https://test-api.k6.io/public/crocodiles/"); check(res, { "status is 200": (r) => r.status === 200 }); sleep(1); }
- варианты
Раздел options
скрипта k6 используется для определения различных параметров конфигурации нагрузочного теста. Эти параметры могут включать количество виртуальных пользователей (VU) для имитации, продолжительность теста и многое другое.
- по умолчанию
Раздел default
сценария k6 используется для определения функции по умолчанию, которая будет выполняться для каждого БУ во время теста. Эта функция может включать в себя любой код, необходимый для моделирования поведения пользователя, такого как отправка HTTP-запросов, обработка данных или выполнение других задач.
- проверки
Раздел checks
сценария k6 определяет набор утверждений, которые оценивают производительность тестируемой системы. Эти утверждения могут включать проверки времени отклика, частоты ошибок и других показателей.
HTTP-запросы
Чтобы создать простой тестовый пример запроса GET с использованием встроенного модуля http в k6, вы можете выполнить следующие шаги:
- Создайте новый файл JavaScript в своем рабочем каталоге, например,
script.js
. - Импортируйте необходимые модули, т. е.
http
иsleep
, из библиотеки k6 с помощью оператораimport
:
import http from 'k6/http'; import { sleep } from 'k6';
3. Определите объект options
, указывающий, что тест должен имитировать 10 виртуальных пользователей (vus
) и выполняться в течение 30 секунд (duration
).
export let options = { vus: 10, // number of virtual users duration: '30s', // duration of the test };ja
4. Определите функцию по умолчанию, которая представляет основную логику вашего тестового примера. Внутри этой функции вызовите метод http.get()
, чтобы сделать запрос GET к вашему API или любому тестовому API, предоставленному k6:
export default function () { http.get('http://example.com/test'); sleep(1); }
5. Добавьте оператор sleep
в конце функции по умолчанию, чтобы имитировать использование вашей системы реальными пользователями. В зависимости от вашего тестового сценария вы можете установить значение в подходящее число. Например, если вы хотите имитировать пользователей, которые делают запрос каждую секунду, установите время ожидания на 1 секунду, как в приведенном выше примере.
6. Сохраните файл script.js
и запустите тест с помощью интерфейса командной строки k6, выполнив в терминале следующую команду:
k6 run script.js
Выходные результаты
Следующий вывод будет отображаться на вашем терминале.
Когда вы запускаете тест k6, он собирает набор метрик по умолчанию и выводит их на терминал после завершения теста. Эти метрики дают представление о том, как ваш API работает под нагрузкой, и могут помочь вам определить любые узкие места или проблемы.
Ниже приведены метрики по умолчанию, которые собирает k6:
vus
- количество активных виртуальных пользователей (ВУ) во время тестаvus_max
- максимальное количество ВУ, выделенных для тестаiterations
- общее количество вызовов функции по умолчанию всеми VU.iteration_duration
— общее время, затраченное на выполнение функции по умолчанию во всех VU.data_received
- количество данных, полученных всеми ВУdata_sent
- количество данных, отправленных всеми ВУchecks
- процент успешных проверок (будет рассмотрен позже)
В дополнение к этим метрикам по умолчанию k6 также генерирует следующие выходные данные для каждого HTTP-запроса, сгенерированного во время теста:
http_reqs
- общее количество HTTP-запросов, сгенерированных k6http_req_blocked
- время ожидания свободного TCP-соединения перед инициацией запросаhttp_req_connecting
- время, затрачиваемое на установление TCP-соединения с удаленным хостомhttp_req_tls_handshaking
- время, затраченное на рукопожатие TLS с удаленным хостомhttp_req_sending
- время, потраченное на отправку данных на удаленный хостhttp_req_waiting
- время ожидания ответа от удаленного хостаhttp_req_receiving
- время, потраченное на получение данных от удаленного хостаhttp_req_duration
- общее время выполнения запроса. Это рассчитывается как суммаhttp_req_sending
,http_req_waiting
иhttp_req_receiving
.
Вы можете использовать эти показатели и выходные данные, чтобы получить представление о производительности вашего API и определить области для оптимизации.
Настройка сценария нагрузочного теста:
Варианты дизайна:
Распространенным сценарием нагрузочного тестирования для API является постепенное увеличение и уменьшение количества виртуальных пользователей (VU) с течением времени для имитации реальных моделей использования. Объект k6 options
позволяет указать эти этапы с помощью свойства stages
. Вот пример того, как вы можете настроить тест для поэтапного запуска:
export let options = { stages: [ { duration: '10s', target: 20 }, // Ramp up to 20 VUs in 10 seconds { duration: '1m10s', target: 10 }, // Stay at 10 VUs for 1 minute 10 seconds { duration: '10s', target: 0 }, // Ramp down to 0 VUs in 10 seconds ], };
В этом примере массив stages
содержит три объекта, каждый из которых представляет отдельный этап теста:
- На первом этапе количество VU увеличивается с 0 до 20 в течение 10 секунд.
- Второй этап поддерживает устойчивую нагрузку 10 ВУ в течение 1 минуты 10 секунд.
- На третьем этапе количество VU уменьшается с 10 до 0 в течение 10 секунд.
Обратите внимание, что вы можете настроить продолжительность и целевые значения каждого этапа в соответствии с вашими конкретными требованиями. Кроме того, убедитесь, что продолжительность всего теста (сумма длительностей всех этапов) достаточна для сбора значимых данных и выявления любых проблем с производительностью.
Проверки:
При нагрузочном тестировании API важно иметь возможность подтвердить ответ, возвращаемый API, чтобы убедиться, что он соответствует ожидаемым критериям. k6 предоставляет способ сделать это с помощью функции «проверить». Важно отметить, что функция «проверить» не останавливает выполнение скрипта.
Ответ HTTP и поля Для запросов HTTP, сделанных в k6, возвращается объект ответа HTTP, который содержит различные поля, такие как
status
body
headers
timings
timings.blocked
timings.connecting
timings.tls_handshaking
timings.sending
timings.waiting
timings.receiving
timings.duration
Пример: проверка состояния на 200 Чтобы проверить состояние ответа HTTP в k6, вы можете сначала присвоить ответ переменной, а затем использовать функцию «проверить» с желаемым утверждением. Например, чтобы подтвердить, что ответ имеет статус 200, вы можете использовать следующий код:
export default function () { let res = http.get('http://example.com/test'); check(res, { 'is status 200': (r) => r.status === 200, }); }
Заключение
Подводя итог тому, что мы рассмотрели в этой статье —
- Мы начали с описания того, что такое k6, а затем установили k6 на нашу локальную машину.
- Затем узнал об основных ключевых элементах скрипта k6.
- После этого мы перешли к созданию простых тестовых сценариев на основе встроенного модуля
http
, предоставляемого k6. - Далее мы кратко проанализируем информацию о выводе k6.
- Двигаясь вперед, мы изучили, как настроить
options
иchecks
для имитации реальных сценариев.
Предыдущий блог о k6:
- Простое нагрузочное тестирование с K6: использование библиотеки Faker и CSV-файлов
- K6: платформа нагрузочного тестирования, которая меняет правила игры
Спасибо, что прочитали мою статью Введение в k6. Если вы нашли это полезным, подпишитесь на меня на Medium и в LinkedIn, чтобы получать больше обновлений и информации об обеспечении качества программного обеспечения. Я буду делиться новыми статьями и ресурсами, чтобы помочь улучшить ваш процесс и предоставить более качественные продукты. Еще раз спасибо за чтение, и я с нетерпением жду встречи с вами!