Artillery - быстрая проверка работоспособности вашего сайта
- Published on
- Authors
- Name
- Vasiliy Kramarenko
- @kramvas07
Если Вам нужно провести быстро нагрузочное тестирование, то обратите внимание на Artillery. Этот инструмент позволяет:
- Тестировать любой API или бэкэнд: Artillery позволяет тестировать HTTP, Socket.io, WebSockets и AWS Kinesis из коробки.
- Эмулировать сложное поведение пользователя с помощью сценариев. Задать сложное поведение пользователя Вы сможете с помощью нескольких шагов , условий и кода Javascript.
- Просто настроить и использовать: сценарии Artillery написаны на YAML, что делает Ваши тестовые сценарии лёгкими для чтения, написания и сопровождения.
- Отображать подробные показатели производительности: время отклика / задержки, количество запросов в секунду, пропускную способность. Все метрики доступны в виде текстового или структурированного JSON, и Artillery может отправить их во внешнюю систему мониторинга, такую как Datadog, Librato или Influx.
- Легко использовать повторно созданные сценарии
- Легко интегрировать Artillery с системами CI / CD. Может работать с Docker. А саму Artillery легко расширить через Javascript с помощью пользовательских механизмов (для дополнительных протоколов), плагинов (например, для генерации данных для тестов или интеграции с внешними системами) или пользовательских репортеров (для отправки метрик и результатов тестов в другое место).
- Artillery Community Edition/ Artillery Pro - Для Вас это Free & open source / Но есть версия и для коммерческих организаций.
Установка
npm install -g artillery
Пример простейшего теста
artillery quick --count 10 -n 20 https://artillery.io/
Который создаст 10 виртуальных пользователей , каждый из которых отправит 20 HTTP GET запросов по адресу https://artillery.io/
Пример тестирования по сценарию (c одной фазой тестирования)
Создайте файл hello.yml:
config:
target: 'https://artillery.io'
phases:
- duration: 60
arrivalRate: 20
scenarios:
- flow:
- get:
url: "/docs"
При запуске этот скрипт будет выполнять одну фазу тестирования, во время которой он в течении 60 секунд будет добавлять пользователей (пачками по 20), при этом каждый пользователь отправит по одному GET запросу на адресс https://artillery.io/docs.
Для запуска этого теста наберите:
artillery run hello.yml
По умолчанию отчёт будет отображаться в консоле:
All virtual users finished
Summary report @ 12:31:00(+0300) 2019-12-09
Scenarios launched: 1200 //Число виртуальных пользователей созданных за последние 10 секунд теста
//(или всего времени теста как в нашем примере 60*20)
Scenarios completed: 1200 //Число виртуальных пользователей завершивших свои запросы
Requests completed: 2400 //Число запросов и ответов (HTTP/WebSocket)
RPS sent: 39.72 //Среднее число завершенных запросов в секунду
//(за все время теста или за последние 10 секунд)
Request latency:
min: 11.3 //Время самого быстрого запроса (в миллисекундах)
max: 343.8 //Время самого долгого запроса (в миллисекундах)
median: 52.4 //Среднее время запроса (в миллисекундах)
p95: 67.8 //Для 95 запросов из 100 время запроса составило не более 67.8 миллисекунд
p99: 142.3 //Для 99 запросов из 100 время запроса составило не более 142,3 миллисекунд
Scenario counts: //Число сценариев
0: 1200 (100%)
Codes: //Коды ответов и их количество
200: 1200
302: 1200
Если Вы видите NaN ("not a number") в отчете, это означает что достаточное количество данных не было получено для построения статистики. Иногда отчёт будет содержать и информацию об ошибках.
Пример тестирования по сценарию (с несколькими фазами тестирования)
Создайте файл first.yml:
config:
target: 'https://www.google.com'
phases:
- duration: 120
arrivalRate: 10
rampTo: 20
name: "Warm up the application" //на этой фазе будет создано 20 пользователей (пачками по 10 штук), которые будут в течении 120 секунд делать get запросы по адресу , указанному ниже
- duration: 240
arrivalRate: 20
rampTo: 100
name: "Ramp to high load" //на этой фазе будет создано 100 пользователей (пачками по 20 штук), которые будут в течении 240 секунд делать get запросы по адресу , указанному ниже
- duration: 600
arrivalRate: 100
name: "Sustained high load" //на этой фазе будут пребывать пользователи (пачками по 100 штук), которые будут в течении 600 секунд делать get запросы по адресу , указанному ниже
defaults:
headers:
x-my-service-auth:
scenarios:
- flow:
- get:
url: '/doodles/json/2019/11?hl=en'
Для запуска этого сценария и сохранения результатов в файл first.txt :
artillery run -o first.txt first.yml
artillery run --output report.json first.yml
Также мы можем создать отчет в html формате:
artillery report first
Затем отобразите этот JSON как HTML:
artillery report --output report.html report.json
Есть масса других вещей, которые может выполнять Artillery, включая более сложные пользовательские сценарии, выполнение крупномасштабных нагрузочных тестов, добавление синтетического трафика в производство для поддержания запаса безопасности от скачков трафика и т. д.
Этот пост пробегал мимо Artillery Core; Artillery Pro, который является платным сервисом, обеспечивает плавный переход от тестов, запущенных на компьютере разработчика, до масштабирования и запуска тех же тестовых скриптов из учетной записи AWS вашей организации.
Согласитесь, с помощью Artillery довольно удобно моделиривать нагрузку. Подробнее о возможностях этого интересного инструмента Вы сможете познакомиться на официальном сайте Artillery.
Это очень похоже на «быстрый» пример, просто запрос к определенной конечной точке.
Но в отличие от «быстрой» команды, использование конфигурации позволяет вам определять намного больше параметров запроса, таких как метод HTTP, заголовки, куки, полезная нагрузка запроса и т. Д. Вы даже можете динамически загружать полезную нагрузку из файлов CSV.
Вот более сложный пример, демонстрирующий, как выполнить запрос POST с данными полезной нагрузки, загруженными из файла CSV.
config:
payload:
# path is relative to the location of the test script
path: "users.csv"
fields:
- "username"
- "password"
scenarios:
- flow:
- post:
url: "/auth"
json:
username: "{{ username }}"
password: "{{ password }}"
Этот тест выполнит запрос «POST» к конечной точке «/ auth» с телом JSON, содержащим поля «имя пользователя» и «пароль», значения которых загружаются из CSV-файла «users.csv» из указанных полей. .
Обо всех возможностях вы можете узнать в документации.