Artillery.io для тестування навантаження
Існує доволі багато інструментів для тестування навантаження. Безумовно, найпопулярнішим є 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 хв на заповнення форми фідбеку. За це вам плюсик у карму !