Sitemap

Навантажуємо разом з C# та Nbomber

3 min readMay 26, 2021

Існує багато інструментів для тестування навантаження. Лідером серед них є 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 та офіційний сайт

--

--

Oleg Zarevych
Oleg Zarevych

Written by Oleg Zarevych

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

Responses (1)