Існує багато tool -зів для Тестування Навантаження (Performance Testing). Серед них, як от Jmeter або Gatling — є набагато популярнішими за Artillery. І дописом нашим ми хочемо наголосити, що представлений інструмент теж однозначно достойний уваги.

Artillery — сучасне, потужне, доволі функціональне та головне надзвичайно просте (майже як двері) у використанні рішення load testing and functional testing, від локальної машини розробника до інтеграції сервера CI. Особливість це CLI інструмент (англ. Command Line Interface) — тобто не має графічного інтерфейсу, працює з консолі виключно.

Що собою являє Artillery?

  • Built with NodeJS, у свою чергу робить його набагато легшим за інструменти на основі Java.
  • Підтримує тестування аплікацій, які використовують HTTP, Socket.io, Websockets, AWS Kinesis з коробки.
  • Одна із найбільших переваг, тести є декларативними у файлах YAML, тому вони легко читаються всіма і запускаються разом із кодом програми.
  • Сценарії та потоки забезпечують велику гнучкість і дозволяють перевірити за один раз різноманітні користувацькі сценарії.
  • Легко використовувати повторно створені сценарії
  • Artillery Community Edition / Artillery Pro — існує 2 версії  Для Вас це безкоштовно та з відкритим кодом / Немає версії та для комерційних організацій.

Реєстрація на захід за посиланням: https://forms.gle/KM2TcfTQtnsbRuZ27 

Продовжуємо…

Artillery  можна інсталювати як і будь-який інший Node package, використовуючи NPM:

npm install -g artillery

Приклад простого Load тесту:

Швидкий тест робиться логічно за допомогою швидкої команди. Даний тест запустить 10 віртуальних користувачів, які будуть робити 20 HTTP GET запитів по вказаній URL-адресі.

artillery quick --count 10 -n 20 https://artillery.io/

Команда quick підтримує деякі інші flags (зверніть увагу на букофффки через дефіс), щоб контролювати розподіл навантаження, наприклад, швидкість, яку можна використовувати для визначення кількості нових користувачів в секунду, або тривалості, яка визначає фіксований час для тесту тощо.

Ви можете комбінувати всі ці ключики прапорці, як вважаєте необхідним, щоби досягти бажаної схеми навантаження для Вашого тесту. Перелік до команди run

  Usage: run [options] <script>

  Run a test script. Example: `artillery run benchmark.json`

  Options:

    -h, --help                    output usage information
    -t, --target <url>            Set target URL
    -p, --payload <path>          Set payload file (CSV)
    -o, --output <path>           Set file to write stats to (will output to stdout by default)
    -k, --insecure                Allow insecure TLS connections, e.g. with a self-signed cert
    -e, --environment <name>      Specify the environment to be used
    -c, --config <path>           Load test config from a file
    --overrides <JSON>            Object describing parts of the test script to override (experimental)
    -v, --variables <definition>  Set variables for the test dynamically (JSON object)
    -q, --quiet                   Do not print anything to stdout

Наприклад, наступна команда запустить тест протягом 10 секунд, причому 2 нових користувачів прибувають щосекунди, в результаті чого загалом буде близько 20 запитів.

artillery quick https://artillery.io/ -r 2 -d 10 

Команда quick є досить обмеженою, бо дозволяє лише запити GET, не можна більше нічого конфігурувати на зразок визначення заголовків запитів.  

Тому коли потрібно трохи більше гнучкості в налаштуванні запиту, для разового тесту безпосередньо з командного рядка кращим варіантом буде інструмент Apache Benchmark.

Сценарії та конфігурація YAML

Приклад тестування за сценарієм (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

Запуск тесту і збереження результатів в файл txt:

artillery run -o hello.txt

Також ми можемо створити звіт в html форматі:

artillery report hello.yml

Приклад тестування за сценарієм (з декількома фазами тестування)

config:
  target: 'https://www.google.com'
  phases:
    - duration: 120  
      arrivalRate: 10
      rampTo: 20
      name: "Warm up the application"  //на цьому етапі створюється 20 користувачів, які будуть протягом 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"    //на цьому етапі 600 користувачів (по 100 штук), протягом 600 секунд робитимуть get запити   
  defaults:
    headers:
      x-my-service-auth: 
scenarios:
  - flow:
    - get:
        url: '/doodles/json/2019/11?hl=en'

Далі представлений приклад видає такий самий результат, як у прикладі із командою quick, просто запит на конкретний едпоінт. Але відміннність полягає у можливості використання конфігурації, яка дозволяє визначити набагато більше параметрів запиту, таких як метод HTTP, заголовки, файли cookie, тощо. Ви навіть можете динамічно завантажувати набір даних із файлів CSV.

config:
    payload:
      # path is relative to the location of the test script
      path: "users.csv"
      fields:
        - "username"
        - "password"
  scenarios:
    - flow:
        - post:
            url: "/auth"
            json:
              username: "{{ username }}"
              password: "{{ password }}"

Окрім того у Artillery можна створювати змінні у тестах і підставляти їх у сценарії куди потрібно.

А можна створювати так звані Multiple сценарії імітувати користувачів, які роблять різні речі у програмі одночасно. Скажімо, Ви хочете одночасно імітувати користувачів, які шукають та купують товари. Ви можете створити два різних сценарії для тестування обох потоків. Зауважте, що кожен користувач виконує лише один із сценаріїв, і Ви можете визначати якому сценарію він підлягає. Приклади з документації: https://artillery.io/docs/script-reference/

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

Успішність проходження тестів можна підлаштувати до заданих умов на основі набору параметрів, таких як швидкість помилок, мінімальна, максимальна та процентна затримка тощо.

Це дуже корисно в CI, оскільки можна щоб тест випав невдалим, якщо він не відповідає певним вимогам щодо продуктивності.

Наступна конфігурація забезпечить виконання щонайменше 95% запитів нижче 200 мс, інакше команда вийде з помилкою.

config:
  ensure:
    p95: 200

Як ще більше розшитирюються можливості Artillery

Artillery підтримує “hooks”, які дозволяють виконувати кастомні функції JS під час виконання сценарію. Кілька прикладів:

beforeScenario і afterScenario — викликається до / після того, як віртуальний користувач виконує сценарій
beforeRequest — викликається перед надсиланням запиту. Параметри запиту можна налаштувати тут.
afterResponse — викликається після отримання відповіді. Відповідь можна перевірити і тут можна встановити власні змінні.
function — яку можна вставити як крок у будь-яку точку сценарію.

Ви можете використовувати хуки, щоб ввести додаткову інформацію, яка потрібна, або змінити запит перед тим, як робити запит. Ця стаття показує дуже хороший приклад роботи із рамдомними емейлами.

Плагіни

Artillery підтримує кастомні плагіни. Як їх застосовувати більш детальніша інформація у документації. До речі у документації і на Блозі  їх є багато прикладів готових скриптів і коду, які можна достосовувати до власного проекту. Погодьтеся, наприклад корисним плагіном буде плагін artillery-publish-metrics, для інтеграції Artillery із зовнішньою системою моніторингу.

Підсумок

Погодьтеся, Artillery досить функціональний інструмент моделювати навантаження. Рекомендуємо його обов’язково спробувати !!!

Related posts

Leave a Comment

Цей сайт використовує Akismet для зменшення спаму. Дізнайтеся, як обробляються ваші дані коментарів.