Навантажуємо разом з C# та Nbomber
Існує багато інструментів для тестування навантаження. Лідером серед них є Apache Jmeter. Це хороший інструмент, але певні його особливості роблять його не завжди зручним у користуванні.
А саме:
- Jmeter — це інструмент який базується на UI. Тобто, у основному тест створюється за допомогою UI. І багато кому лінь розбиратись з цим UI і процесом створення тесту. А ось створювати тести в улюбленому IDE було би дуже кльово.
- Тести у Jmeter є у форматі xml. І працювати декільком людям над одним і тим тестом, зберігаючи його у git, може бути проблемним.
Ось ці особливості Jmeter роблять його інструментом зручним для початківців або для інженерів, не знайомим з програмуванням. Але взагалі, писати тести на якійсь мові програмування було би зручно. Дуже популярні інструменти, такі як Locust(python), Gatling(Scala), k6(JavaScript).
У світі .NET можна було писати тести у MS Visual Studio, але у платній версії. Там ми отримували симбіоз UI-base підходу та Code-base. Але починаючи з VS 2020 ці тести стали Deprecated і більше не підтримуються.
Nbomber
Nbomber — бібліотека, котра позиціонує себе незалежною від протоколу і розроблена на F#. Тести можна писати як і на F#, так і на C#. Поки у мене був досвід лише з C#, тому приклади будуть на ньому.
Nbomber дуже активно розвивається, і його API може трохи змінюватись, але в основному він базується на наступних абстракціях:
- Step
- Scenario
- Runner
Step
Step — це фундамент будь якого тесту. Власне, наш тест буде складатись з декількох Step-ів.
Step — це якась дія, котру ми хочемо виконати. Наприклад, HTTP запит.
Власне, ідея бути protocol agnostic реалізована за допомогою цих кроків. Кроки можуть бути різні: HTTP, WebSocket, mongo, etc. Існує також клас Step, у якому можна написати будь що, і воно також буде запущено паралельно.
Дані між кроками можна передавати. Nbomber містить механізм для передачі даних у форматі key-value. Також можна робити якісь перевірки.
Додам приклад HTTP кроку:
Scenario
І от маємо ми декілька кроків які вже можна їх організувати у сценарій. Сценарій містить кроки, які він виконуватиме послідовно та стратегію навантаження.
Стратегія навантаження — це підхід у якому визначено скільки паралельних потоків і протягом якого часу буде у нашому тесті.
На даний момент існує 5 стратегій:
RampConstant — лінійне зростання к-сті потоків протягом встановленого часу. Тобто, якщо встановити к-сть потоків 10, а час — 10 секунд, то кожної секунди буде створюватись новий потік.
KeepConstant — встановлена к-сть потоків, буде працювати протягом встановленого часу. Тобто, якщо встановити к-сть потоків 10, а час — 10 секунд, то одразу створиться 10 потоків і вони будуть виконуватись протягом 10 секунд.
Важливий момент для стратегій вище — це те, що потоки є зациклені. Коли потік завершиться, одразу буде створено новий, який буде виконувати сценарій з початку. І так до завершення часу.
RampPerSec — лінійне додавання к-сті потоків щосекунди до встановленої к-сті потоків. Наприклад, якщо встановити к-сть потоків 10, а час — 60 секунд, то перші 6 секунд буде запускатись 1 новий потік щосекундно,а з 7 секунди — 2 потоки щосекундно,а з 13 секунди — 3 потоки щосекундно.
InjectPerSec — встановлена к-сть потоків буде запускатись щосекунди протягом встановленого часу.
InjectPerSecRandom — те ж саме, що і в InjectPerSec, але к-сть нових потоків буде вибрана випадково
Важливий момент,що для цих стратегій потоки не зациклені, а завершуються по виконанні всіх кроків
Приклад Scenario наступний:
Runner
Переважно, тест містить один сценарій, але можна зробити і декілька. У такому разі вони будуть виконуватись паралельно.
Власне, сценарії які ми хочемо запусти потрібно передати Runner-у. Також, у ньому можна налаштувати конфігурації запуску, репортингу та подібне.
Метод Run() повертає статистику по виконанні тесту і відповідно по ній можна робити якісь перевірки
Як запускати тести
Є два Л̵ь̵в̵о̵в̵а̵ способи запустити тест з Nbomber :
- як xUnit \ Nunit тест: у такому випадку ваші тести навантаження нічим не відрізняються від інших тестів. Їх зручно запускати і структурувати
- як консольний додаток: у такому випадку вам запуститься графічне вікно, де будете бачити прогрес виконання тесту. Незручність тут лише у тому, що у вас буде лише один тест
Я надаю перевагу першому підходу. Тут можна подивитись на мої приклади, ле вони можуть бути трохи застарілі
Summary
Мені Nbomber дуже сподобався. Зручний API, активно розвивається, достатній функціонал. За допомогою C# ви можете реалізувати будь яку складність вашого флову і не структурувати код як вам подобається. Дуже рекомендую спробувати його. Їхній github та офіційний сайт