Sitemap

Artillery.io для тестування навантаження

4 min readJul 8, 2020

Існує доволі багато інструментів для тестування навантаження. Безумовно, найпопулярнішим є Apache Jmeter. Він є чудовим інструментом, який підійде як і для початківців, так і для профі; як і для маленьких, так і для великих тестів. Але у нього існує декілька мінусів :

  • Jmeter — це суто UI інструмент. Тобто, створення та підтримка тестів лише через UI. З одного боку — це не проблема, але багатьом розробникам не хочеться розбиратись з інтерфейсом, їм хочеться бачити код. Тести як код мають багато переваг : їх зручніше читати, краще зберігати у системі контролю версій, не потрібно запускати UI щоб відредагувати тест чи налаштування.
  • Jmeter не підтримує протокол WebSocket з коробки. Існують два плагіни, але вони давно вже не оновлялись.
    І особисто у мене виникали труднощі при роботі з ними

Для вирішення саме цих проблем підходить такий інструмент як Artillery.io. Короткий опис :

  • Artillery немає UI. Тести зберігаються у YAML файлі. Також можна і JSON, але YAML читабельніший
  • Інструмент написаний на node.js, тому додаткові функції можна реалізувати на JavaScript
  • Вбудована підтримка протоколів WebSocket та Socket.io

Перші кроки з Artillery

Встановлення

Для початку потрібно встановити Artillery. Для цього нам потрібен npm та node.js встановлений. Це буде працювати як для Windows, так і для Linux та Mac OS X

Встановлення відбувається просто - лише одна команда

npm install -g artillery

і Artillery встановлено глобально.

Структура тесту

Тест складається з двох частин :

  • config, де описані загальні налаштування тесту
  • scenarios, де описаній сам тест, який буде виконуватись користувачем (Virtual User (VU)). Власне, ці VU і генерують навантаження (аналог потоку(thread) у Apache Jmeter).

Секція config виглядає десь так:

target — цільовий ресурс для тестування

defaults — стандартні атрибути. У даному прикладі є HTTP header, який подається як ключ-значення і буде додаватись до всіх HTTP запитів.

ensure — дуже корисна фіча. Це умова виконання всіх сценаріїв. Результати всіх HTTP запитів агрегуються, і перевіряється умова. Якщо вона не виконується, Artillery падає. Це буде зручно використовувати коли тест запускається на CI чи скриптом. Є декілька умов :

  • p95–95-й процентиль, тобто 95% від всіх запитів. Значення яке йде після (у прикладі це 100000) — час у мілісекундах. Також може бути p99, min, max, mean
  • maxErrorRate — к-сть прийнятних помилок. Значення встановлюється у відсотках.

phases — стратегія з якою буде генеруватись навантаження, тобто додаватись нові VU-s. Тут ми можемо налаштувати наступне:

  • duration — час у секундах, доки буде відбуватись сценарій. Їх може бути декілька і загальний час сценарію буде сумуватись
  • arrivalRate — к-сть нових VU-s, котрі будуть додаватись щосекунди протягом часу, зазначеного у duration
  • maxVusers — максимальну к-сть VU-s можна обмежити цим полем. Це поле є опційне
  • rampTo — лінійне зростання VU-s протягом зазначеного duration до зазначеного значення. Тобто, якщо rampTo 50, а duration 10, то кожної секунди будуть додаватись по 5 нових VU-s

Секція scenarios виглядає так:

Сценаріїв може бути декілька і вони будуть виконуватись послідовно для кожного VU. Сценарій починається з name — ім’я, котре буде відображатись у репорті.

Далі йде секція flow, яка містить конкретні HTTP запити. Кожен запит починається з назви методу. Підтримується GET, POST, PUT, PATCH, DELETE запити. Також у секції flow може бути мікс з іншими протоколами як WebSocket.

Формат YAML доволі легко зрозуміти, тому не бачу сенсу розписувати кожне поле. Хіба додам про важливі та неочевидні моменти.

body — вміст HTTP тіла. Його можна задавати звичайним рядком, як у прикладі; але якщо у вас HTTP body у форматі JSON, то можна задавати у вигляді ключ-значення. Замість секції body повинна бути секція json:

json:
username: "username"
password: "pass"

capture — у цій секції можна витягнути результат з HTTP response. Можна використовувати Regex, JsonPath та Xpath. Зберегти результат можна у змінну, яка йде після ключового слова as. У прикладі змінна називається token. Щоб використати змінну використовується нотація

{{ token }}

Змінну можна використати у будь якому місці.

think — тест буде чекати зазначену к-сть секунд. Це потрібно для моделювання реалістичної поведінки користувача. Люди не одразу переходять за посиланням, а очікують якийсь час для читання сторінки, пошуку якогось елемента. Тому, варто використовувати очікування

Запуск тесту та репортинг

Зберігаємо тест у файл YAML та можемо запускати його.

Тут я додаю опцію output, щоб отримати агрегований результат і згенерувати репорт.

artillery run simpleTest.yml -o result.json

Протягом тесту кожні 10 секунд буде виводитись проміжна статистика. Якщо у проміжній буде NaN — це означає, що Artillery ще не отримав відповідь. У кінці тесту виведеться сумарна статистика.

Щоб з результатів отримати репорт:

artillery report result.json

Репортинг доволі бідний, але містить основні дані.

Підсумок

Artillery.io є доволі простим та зручним інструментом для тестування продуктивності. На офіційному сайті можна знайти хорошу документацію, яка допоможе вам. Звісно, як і будь який інший інструмент є ряд мінусів.

До мінусів я би відніс :

  • Бідний репортинг
  • Немає масштабування, але існує платна версія, де воно є

Але навіть попри них його варто спробувати.

P.S.

Дякую, що ви прочитали цю статтю. Я хочу бути максимально корисний Вам і тому, витратьте ще 1 хв на заповнення форми фідбеку. За це вам плюсик у карму !

--

--

Oleg Zarevych
Oleg Zarevych

Written by Oleg Zarevych

Вирішив писати про ІТ українською

Responses (1)