Вы ищете бесплатный инструмент для нагрузочного тестирования с открытым исходным кодом для вашего 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, вы можете выполнить следующие шаги:

  1. Создайте новый файл JavaScript в своем рабочем каталоге, например, script.js.
  2. Импортируйте необходимые модули, т. е. 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-запросов, сгенерированных k6
  • http_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 содержит три объекта, каждый из которых представляет отдельный этап теста:

  1. На первом этапе количество VU увеличивается с 0 до 20 в течение 10 секунд.
  2. Второй этап поддерживает устойчивую нагрузку 10 ВУ в течение 1 минуты 10 секунд.
  3. На третьем этапе количество 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,
  });
}

Заключение

Подводя итог тому, что мы рассмотрели в этой статье —

  1. Мы начали с описания того, что такое k6, а затем установили k6 на нашу локальную машину.
  2. Затем узнал об основных ключевых элементах скрипта k6.
  3. После этого мы перешли к созданию простых тестовых сценариев на основе встроенного модуля http, предоставляемого k6.
  4. Далее мы кратко проанализируем информацию о выводе k6.
  5. Двигаясь вперед, мы изучили, как настроить options и checks для имитации реальных сценариев.

Предыдущий блог о k6:

Спасибо, что прочитали мою статью Введение в k6. Если вы нашли это полезным, подпишитесь на меня на Medium и в LinkedIn, чтобы получать больше обновлений и информации об обеспечении качества программного обеспечения. Я буду делиться новыми статьями и ресурсами, чтобы помочь улучшить ваш процесс и предоставить более качественные продукты. Еще раз спасибо за чтение, и я с нетерпением жду встречи с вами!