Быстрое и лёгкое тестирование производительности с Artillery

9-12-2019

Если Вам нужно провести быстро нагрузочное тестирование, то обратите внимание на Artillery. Этот инструмент позволяет:

  1. Тестировать любой API или бэкэнд: Artillery позволяет тестировать HTTP, Socket.io, WebSockets и AWS Kinesis из коробки.
  2. Эмулировать сложное поведение пользователя с помощью сценариев. Задать сложное поведение пользователя Вы сможете с помощью нескольких шагов , условий и кода Javascript.
  3. Просто настроить и использовать: сценарии Artillery написаны на YAML, что делает Ваши тестовые сценарии лёгкими для чтения, написания и сопровождения.
  4. Отображать подробные показатели производительности: время отклика / задержки, количество запросов в секунду, пропускную способность. Все метрики доступны в виде текстового или структурированного JSON, и Artillery может отправить их во внешнюю систему мониторинга, такую ​​как Datadog, Librato или Influx.
  5. Легко использовать повторно созданные сценарии
  6. Легко интегрировать Artillery с системами CI / CD. Может работать с Docker. А саму Artillery легко расширить через Javascript с помощью пользовательских механизмов (для дополнительных протоколов), плагинов (например, для генерации данных для тестов или интеграции с внешними системами) или пользовательских репортеров (для отправки метрик и результатов тестов в другое место).
  7. 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

Также мы можем создать отчет в html формате:

artillery report first

Вот пример отчёта для последнего тестового сценария.

Согласитесь, с помощью Artillery довольно удобно моделиривать нагрузку. Подробнее о возможностях этого интересного инструмента Вы сможете познакомиться на официальном сайте Artillery.