Паралельне тестування: найкращі практики для навантажувального та функціонального тестування

Вступ

Тестування стає надзвичайно важливим, коли складність і впровадження рішення зростає. На Kubecon NA 2020 Джіан з Airbnb говорив про 10 дивних способів "вибухнути" ваш Kubernetes. Перша важлива висновок з його виступу полягала в тому, щоб тестувати нові функції на тестових кластерах. Але як забезпечити належне тестування без значного збільшення часу на побудову чи розгортання пайплайнів?

Ось два попередні тести, які команда повинна виконати перед тим, як перемістити своє рішення в продуктивне середовище:

  • Рішення має працювати на таких системах, які здатні підтримувати пікове навантаження. Це вимагатиме симуляції багатьох користувачів для тестування пікової продуктивності.
  • Кожна функція рішення повинна мати очікувану поведінку та бути безшовною у використанні.
    ## Тестування в паралелі: Огляд

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

Тестування для обох цих сценаріїв вимагає часу та ресурсів, і тут тестування в паралелі стає потужним підходом для забезпечення тестування вашої системи на великій масштабі перед її запуском у продукцію. У цьому пості ми розглянемо концепцію паралелізації тестів та деякі з поширених підходів, таких як паралелізація навантаження та функціональне тестування. Ми детально обговоримо деякі виклики, що виникають при використанні цих підходів, та розглянемо фреймворк для тестування, орієнтований на Kubernetes, який може допомогти вирішити ці проблеми.

Огляд паралельного тестування

Паралельне тестування — це процес виконання паралельних симуляцій та тестів для перевірки функціональності та продуктивності тестованого додатку.

Паралелізація

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

Паралельне навантажувальне тестування

Щоб перевірити продуктивність рішення в умовах пікового навантаження, недостатньо створити навантаження, надіславши кілька запитів від анонімних користувачів. Необхідно змоделювати реальне середовище, створивши масивне навантаження від іменованих користувачів з кількох географічних регіонів, можливо, через різні браузери чи пристрої.

Паралельне навантажувальне тестування — це процес використання паралельних інстансів інструментів для навантажувального тестування, щоб змоделювати величезну кількість користувачів з кількох вузлів, розподілених по географічних локаціях. Рішення, які стикаються з великими обсягами одночасних користувачів, такі як соціальні мережі, банківські додатки, інтернет-магазини, онлайн-ігри тощо.
Все це може принести користь для тестування, щоб забезпечити безперервну роботу сервісів для користувачів навіть під час пікового навантаження.

Але паралелізація навантаження має свої виклики, давайте розглянемо їх.

Виклики паралелізації навантаження

  • Створення важкого навантаження: Паралелізація навантаження вимагає надсилання величезного трафіку до програмного забезпечення або додатка, можливо, з різних географічних регіонів, щоб протестувати продуктивність під час пікових годин і мережеву затримку. Наприклад, для сайту онлайн-ігор потрібно перевірити, чи не буде затримок у мережі, якщо гравці з різних географічних регіонів грають в багатокористувацькому режимі.
  • Параметризовані віртуальні користувачі: Для симуляції специфічної поведінки користувачів, вказуючи індивідуальні характеристики, потрібні параметризовані віртуальні користувачі. Генерація анонімних запитів від віртуальних користувачів не допоможе, якщо потрібно налаштувати тестові кейси.
    Припустимо, на сайті онлайн-ігор гравці використовують функцію чат-повідомлень, і потрібно протестувати, чи правильні їхні профільні дані.
  • Візуалізація результатів: Потрібно мати можливість реальної візуалізації тесту, щоб зрозуміти поведінку додатка або сценарію, який викликає проблему. Це також може вимагати агрегування таких результатів для спостереження за поведінкою. Наприклад, якщо тест показує велику мережеву затримку під час створення великого навантаження з кількох географічних регіонів, нам потрібні детальні результати для візуалізації проблеми та налагодження мережевої інфраструктури.
  • Моніторинг тестової системи: Для тестованої системи моніторинг може допомогти нам виявити використання ресурсів, таких як використання CPU або пам'яті, а також поведінку при масштабуванні та передбачити проблеми з продуктивністю, коли на рішення буде створено велике навантаження.
    Наприклад, якщо тест показує сплеск використання CPU під час пікових годин, то цей аналіз можна використати для оптимізації розподілу ресурсів.

Паралельне функціональне тестування

Паралельне функціональне тестування — це процес виконання паралельних функціональних тестів для збільшення покриття тестів та зменшення загального часу виконання тестів. Воно зазвичай поєднується з параметризованим виконанням тестів, де надається конкретний вхід і перевіряється очікуваний вихід. Наприклад, використовуючи версію браузера як вхід, ми можемо протестувати функцію в кількох браузерах або операційних системах паралельно, одночасно. Це не тільки допомагає прискорити вихід на ринок, але й дозволяє ефективно тестувати та оптимізувати використання ресурсів.
У наступному розділі ми розглянемо необхідність функціональної паралелізації на прикладі.

pic

Чому потрібна функціональна паралелізація?

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

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

Але увімкнення функціональної паралелізації також має деякі виклики, давайте розглянемо їх.

Виклики функціональної паралелізації

  • Ізоляція тестів: Кожен тест може мати свій набір залежностей, налаштувань та вимог щодо сумісності. Налаштування та конфігурація кількох тестових середовищ для різних тестів може зайняти багато часу і бути складним процесом, особливо коли потрібно забезпечити узгодженість середовищ.
  • Запис результатів: У наведеному прикладі нам потрібна система, яка може фіксувати різні варіанти вхідних даних, комбінацію браузера та фактичні результати тестів.
    Ці зафіксовані результати будуть використовуватися для порівняння з очікуваними результатами, щоб визначити ефективність функціональності.
  • Розподіл ресурсів: Визначити, який тест функціональності потребує більше ресурсів, а потім розподілити ресурси відповідно, може бути складним завданням. Припустимо, для банківського рішення потрібно протестувати функціонали входу в систему та транзакцій. Ці тести займають час, навіть якщо вони виконуються паралельно, тому потрібно визначити ліміт використання ресурсів для кожного з них.

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

Паралельне тестування з Testkube

Нещодавно Testkube представив Test Workflows, що використовує механізм виконання та оркестрації, спеціально побудований для виконання будь-яких інструментів тестування та сценаріїв в масштабах, а оскільки Testkube використовує Kubernetes як середовище виконання для тестування, він може масштабуватися і виділяти ресурси для виконання тестів відповідно до функціональності, яку надає сам Kubernetes.

Test Workflows визначаються за допомогою спеціалізованої YAML-нотації і можуть бути створені за допомогою розширених майстрів та шаблонів для різних сценаріїв, які можна потім покращувати будь-яким способом для задоволення вимог тестування за допомогою Testkube Workflow Editor.
Workflows також дають можливість детально контролювати використання ресурсів і їх розподіл для ваших тестів, що допомагає максимізувати використання вашої інфраструктури для виконання тестів.

Паралельне тестування є однією з багатьох функцій, доступних через Workflows:

  • Ключове слово parallel дозволяє запускати будь-який інструмент тестування на кількох вузлах.
  • Ключове слово shard дозволяє розподіляти тести на кілька вузлів, щоб кожен вузол виконував правильний набір тестів.
  • Ключове слово matrix дозволяє параметризувати тести, які виконуються як послідовно, так і паралельно.
  • Ключове слово service дозволяє керувати залежними сервісами для запуску розподілених тестів (наприклад, з JMeter або Selenium).
  • Ключове слово execute дозволяє оркеструвати кілька тестів для запуску як послідовно, так і/або паралельно, що дає змогу моделювати більш складні сценарії використання — читайте нашу статтю про Системне тестування.

Workflows для паралельного навантажувального тестування

Як описано вище, запуск навантажувального тесту з кількох вузлів паралельно часто необхідний для моделювання великого обсягу користувацького трафіку.
Ключове слово parallel у Test Workflows дозволяє паралелізувати будь-який інструмент для навантажувального тестування або сценарії для цієї мети, наприклад:

  • K6parallel можна використовувати для розподілу та параметризації скриптів k6 набагато більше, ніж це можна досягти за допомогою k6-operator — Читати більше,
  • JMeterservice у поєднанні з service.count можна використовувати для створення необхідної кількості розподілених робочих вузлів, які потім запускаються з головного вузла для виконання тесту.
  • Artillery, Gatling — подібно до K6, розподіляти та параметризувати тести Artillery і Gatling можна легко, використовуючи ключове слово parallel.

pic

скріншот, що показує паралельне виконання тесту JMeter з 6 вузлами

Приклади для розподіленого навантажувального тестування з кількома з цих інструментів доступні в документації Testkube.

Workflows для паралельного функціонального/енд-то-енд (E2E) тестування

Паралелізація функціональних і енд-то-енд (E2E) тестів для підвищення покриття тестами та зменшення загального часу виконання тестів також добре підтримується за допомогою ключового слова parallel.
Залежно від інструменту тестування, який ви розподіляєте, ви також можете шардити тестові файли або вхідні параметри між вузлами, що підтримується за допомогою ключового слова shard, наприклад:

  • Тести Playwright можуть бути паралелізовані та поділені на шардовані частини між кількома вузлами, використовуючи вбудовану функціональність шардінгу Playwright
  • Тести Cypress можуть бути паралелізовані, а Workflow Express Language може бути використаний для шардінгу тестових файлів відповідно
  • Інструменти для тестування API, такі як Postman і SoapUI, можуть бути паралелізовані та параметризовані подібно для збільшення покриття тестами API
  • Інструменти для приймальних тестів, такі як Selenium і Robot-Framework, можуть бути паралелізовані та параметризовані для різних браузерів і введених користувачем даних, що підвищує покриття приймальних тестів перед випуском додатків у продакшн.
  • Будь-який інший інструмент тестування або сценарій можна розподілити між кількома вузлами з параметризацією, як це передбачено для кожного інструмента.

pic

скріншот паралельного виконання тесту Playwright з шардінгом

Як зазначено вище, приклади для розподіленого функціонального тестування з цими інструментами доступні в документації Testkube.

Composite Workflows для паралелізації тестів

Описані підходи з використанням ключових слів parallel та shard призначені для використання в межах одного робочого процесу.
Якщо ж ви хочете поєднати кілька робочих процесів для виконання їх послідовно або паралельно, ви можете використовувати ключове слово execute для оркестрації виконання будь-якого іншого робочого процесу в будь-якій необхідній комбінації.
Наприклад, ви можете:

  • Запустити кілька тестів навантаження паралельно, щоб побачити, як трафік, який вони симулюють, впливає один на одного
  • Запустити тест E2E або API паралельно з тестом навантаження, щоб перевірити, чи зберігається функціональність під навантаженням
  • Запустити тест безпеки паралельно з розподіленим тестом навантаження, щоб перевірити, чи зберігається безпека під час високого навантаження на ваші додатки.‍

pic

скріншот, що показує кілька робочих процесів, які комбінуються для паралельного виконання

Читати більше про композитне тестування в Вступ до системного тестування з Testkube та про ключове слово execute в документації.

Усунення неполадок, артефакти та звітність

Testkube автоматично захоплює вихідні логи будь-якого тестового інструменту, який він виконує на всіх вузлах, на яких ці інструменти працюють, щоб допомогти вам переконатися, що тести були виконані як бажано, а також для налагодження проблем з виконанням тестів.
Крім того, Testkube можна налаштувати на захоплення будь-яких артефактів, що генеруються вашими тестами, включаючи агреговані звіти, відео, JUnit-звіти тощо.
Коли артефакти захоплені, Testkube зробить їх доступними через панель керування.

pic

Приклад звіту JMeter, що показується на панелі керування Testkube

Висновок

Тестування ваших додатків на великому масштабі часто вимагає підходу до виконання тестів з паралельним запуском, будь то паралелізація навантажувальних тестів для створення великого навантаження, або паралелізація функціональних/E2E тестів для збільшення покриття тестами та покращення часу виконання тестів.

Нещодавно представлений механізм Test Workflows в Testkube дозволяє паралелізувати будь-який інструмент тестування, як навантажувальний, так і функціональний, з додатковою підтримкою шардінгу, параметризації та керування залежними сервісами для виконання ваших тестів.

Перейдіть на testkube.io/get-started, щоб дізнатися більше і спробувати Testkube, використовуючи наш демонстраційний середовище або ваші існуючі тести на вашій інфраструктурі.

Оригінально опубліковано на https://testkube.io.

Перекладено з: Parallel Testing: Best Practice for Load Testing & Functional Testing

Leave a Reply

Your email address will not be published. Required fields are marked *