vyvchy
    Теми розділу

    10 · Performance testing

    Performance testing: цілі та місце в QA-процесі

    Зміст

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

    Ця глава — вхід у розділ. Вона не вчить писати скрипти навантаження: вона відповідає на питання, які стоять перед скриптом. Що саме ми міряємо, коли кажемо «продуктивність»; чим відрізняється від інженерії продуктивності; де перф-активності стоять у життєвому циклі; який словник треба мати, щоб розмова з розробником або девопсом не розсипалася на першій хвилині. Види тестів — у главі Види performance-тестів, метрики й — у главі Метрики.

    Продуктивність — це характеристика якості, а не «щоб швидко»

    Почнімо з означення, бо тут ховається половина непорозумінь. Продуктивність (performance efficiency) — ступінь, у якому компонент або система виконує свої функції з ефективним використанням ресурсів за заданих умов, пропускної здатності й часу. У продукту ISO 25010 вона стоїть як нефункціональна з трьома підхарактеристиками. Сама модель розбирається в розділі про основи тестування; тут беремо з неї рівно одну — і розкладаємо на три предмети виміру.

    ПідхарактеристикаЩо саме перевіряють
    Часова поведінка (time behavior)чи відповідає система на ввід у заданий час і за заданих умов; найпоширеніша ціль перф-тесту
    Утилізація ресурсів (resource utilization)скільки ресурсів на це витрачено; досліджують, якщо доступність ресурсів визнано ризиком
    Ємність (capacity)чи придатна архітектура на межах — за кількістю користувачів або обсягами даних

    Діапазон часової поведінки канон окреслює двома полюсами: від наскрізного системи на дію користувача — до кількості тактів процесора на конкретну задачу.

    Ключове речення: усі три підхарактеристики впливають на здатність системи масштабуватися. «Система не масштабується» — не діагноз, а симптом однієї з трьох причин, і перше питання до такої заяви одне: якої саме. Поруч у глосарії стоять означення, які плутають найчастіше: ємність — ступінь, у якому максимальні межі параметра системи відповідають вимогам, масштабованість — ступінь, у якому систему можна підлаштувати під змінну ємність. Наслідок неприємний: вимога «має працювати швидко» покриває одну з трьох частин предмета, і система, яка відповідає за 200 мс, тримаючи процесор на 99%, формально її виконує — хоча запасу на зростання навантаження в неї вже немає.

    Ціна повільності

    Сайти, які швидко вантажаться й вчасно реагують на ввід, утримують користувачів краще за повільні, причому планка не там, де здається: користувачі порівнюють продукт не лише з конкурентами, а з найкращими сервісами, якими користуються щодня. Ціна не тільки грошова — дослідження показало, що стресова реакція на схожа на реакцію під час перегляду фільму жахів і сильніша за реакцію на чергу в касі. І окремо про мобільні: у них обмежені процесор і памʼять, тож зайвий код створює погані умови продуктивності саме там.

    Що таке тестування продуктивності — і чим воно не є

    Тестування продуктивності (performance testing) означене коротко: тип тестування, що визначає продуктивність компонента або системи. Термін збірний — під ним живе будь-яке тестування, зосереджене на швидкості відгуку (responsiveness) системи чи компонента під різними обсягами навантаження, і предмет не обмежений вебом: канон називає поіменно класичний клієнт-серверний, розподілений і вбудований контекст.

    Форма роботи названа прямо: перф-тестування часто набуває форми експерименту, який дає змогу міряти й аналізувати конкретні параметри системи. Звідси й пʼять вимог, які канон ставить до самого тесту, — читайте їх як чеклист власного прогону.

    ПринципЩо вимагає
    Узгодженість з очікуваннямивирівняність з очікуваннями груп стейкхолдерів — користувачів, проєктувальників, експлуатації
    Відтворюваністьповтор на незміненій системі дає статистично ідентичні результати в межах заданого допуску
    Зрозумілістьрезультати зрозумілі й легко порівнянні з очікуваннями стейкхолдерів
    Можливість виконаннятест іде на повній або частковій системі чи на середовищі, репрезентативному щодо продового
    Економічністьтести доступні за ціною й здійсненні в межах терміну проєкту

    Друга вимога — та, об яку розбивається більшість домашніх спроб: прогін, який не можна повторити на незміненій системі й дістати той самий результат, тестом продуктивності за каноном не є.

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

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

    Testing чи engineering

    Тестування продуктивності тісно інтегрується з юзабіліті-інженерією та інженерією продуктивності — але це сусідні дисципліни, а не синоніми.

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

    • рецензія вимог із фокусом на продуктивності;
    • рецензія схем БД, , метаданих, і запитів;
    • рецензія архітектури системи й мережі;
    • рецензія критичних ділянок коду.

    Жодна не потребує ні , ні окремого стенда — і саме тут тестувальник зазвичай дає найбільшу віддачу за витрачений час. А динамічне перф-тестування має починатися щойно система будується, а не наприкінці.

    Місце в SDLC і shift-left

    Канон вимагає, щоб аналіз починався рано й повторювався регулярно, а тестувальник уникав того, щоб покладатися виключно на перф-тестування наприкінці системного й системно-інтеграційного рівнів. Причина економічна: пізно знайдені дефекти продуктивності можуть бути надзвичайно дорогими й навіть призвести до скасування цілих проєктів. Це не «дорогий фікс» — це перепроєктування, на яке ніхто не закладав бюджет.

    Ідеальна практика для послідовних моделей розробки сформульована одним реченням: включити критерії продуктивності до , визначених на самому початку проєкту. Далі кожна фаза має власну перевірку.

    Концепція
    цілі продуктивності —
    у критеріях приймання

    Вимоги
    чи визначені й чи справді
    відбивають потреби стейкхолдерів

    Статичні активності
    рецензії вимог, архітектури,
    схем БД і запитів

    Динамічні прогони
    щойно є що навантажувати

    CI
    підмножина: чи не стало гірше

    Приймальне тестування
    валідація проти початкових
    потреб і критеріїв

    Концепція
    цілі продуктивності —
    у критеріях приймання

    Вимоги
    чи визначені й чи справді
    відбивають потреби стейкхолдерів

    Статичні активності
    рецензії вимог, архітектури,
    схем БД і запитів

    Динамічні прогони
    щойно є що навантажувати

    CI
    підмножина: чи не стало гірше

    Приймальне тестування
    валідація проти початкових
    потреб і критеріїв

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

    Окремо про CI, бо тут найчастіше плутають ціль. Головна мета перф-тестів у — переконатися, що зміна не погіршила продуктивність. Через короткий час, доступний у CI, ці тести можуть бути підмножиною ширших прогонів, які в інший час ганяє спеціалізована команда. Тобто «у нас перф у CI» і «у нас є перф-тестування» — різні заяви. Дока k6 додає з боку практики: не всі перф-тести придатні для CI/CD-, а запуск тільки з CI на зміни коду обмежує цілі перф-тестування — є ще cron-, хмарне планування й ручний запуск як пункт релізного чекліста. Сенс руху — зміна режиму: у багатьох організаціях продуктивність лишається невідчутною і реагують лише тоді, коли стається погане.

    Коли проєкту (не) потрібне навантажувальне

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

    Другий бік того самого рішення — числа. Канон вимагає: перф-тестування не слід починати, не зрозумівши спершу, які виміри й метрики потрібні, і перелічує шість наслідків, коли порадою нехтують:

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

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

    Далі «має бути швидко» перетворюється на число. Форму дає (service level objective, SLO): вона мусить вказувати, як її міряють і за яких умов вона чинна — канонічний приклад звучить як «99% (усереднено за 1 хвилину) викликів Get RPC завершаться менш ніж за 100 мс, виміряно на всіх бекенд-серверах». Машинною ціль робить поріг (threshold): пороги якраз і кодифікують SLO — «95% запитів мають час відповіді нижче 200 мс», «менш ніж 1% запитів повертають помилку». Повний розбір SLI, SLO, SLA і — у главі про вимоги до продуктивності.

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

    Базовий словник: навантаження, віртуальний користувач, транзакція, сценарій

    Чотири слова, без яких не читається жоден перф-звіт.

    Навантаження і (load generation). Генерація навантаження — процес симуляції визначеного набору активностей на заданому навантаженні, які подаються компоненту або системі. Від функціональних кейсів навантаження відрізняється трьома речами: багато вводів користувачів, а не один; генерація може вимагати виділеного заліза й інструментів; вона залежить від відсутності функціональних дефектів у системі. Способів генерації канон називає чотири — через UI, натовпом реальних тестувальників, через API і захопленням протоколу; вибір між ними — компроміс «репрезентативність проти масштабу», а не суперечка про інструменти.

    Транзакція (transaction) — одиниця роботи, яку рахують і міряють. Через неї означена (system ): кількість транзакцій заданого типу за одиницю часу — замовлень за годину, HTTP-запитів за секунду. Це не та транзакція, що в базі даних: там ідеться про атомарність групи команд, тут — про бізнес-операцію, час і кількість якої ми звітуємо. Інструменти дають готові лічильники таких одиниць (у k6 запити рахує метрика http_reqs).

    (virtual user, VU) — симуляція активностей, що виконуються згідно з користувача. Це не людина і не браузер: конкурентність зазвичай моделюють в , задаючи кількість віртуальних користувачів. У JMeter один такий користувач — це потік: кожен виконує план тесту цілком і незалежно від інших, а окремі групи потоків семплюють різні функції. Межа, яку інструмент називає прямо: k6 не гарантує, що конкретний VU виконає конкретну ітерацію, тож дані привʼязують до VU, а не до номера ітерації.

    Сценарій — це і є (load profile): канон каже дослівно, що агрегування операційних профілів дає профіль навантаження, який зазвичай називають сценарієм. Операційний профіль (operational profile) — фактичний або передбачений патерн використання: що робить один тип користувача і наскільки інтенсивно; профіль навантаження додає кількість екземплярів і розподіл у часі. В інструментах так само: у k6 в одному скрипті оголошують кілька сценаріїв, кожен зі своїм патерном планування віртуальних користувачів, і працюють вони паралельно.

    Операційний профіль
    що робить один тип користувача

    Профіль навантаження, він же сценарій
    скільки екземплярів і як розподілені в часі

    Віртуальні користувачі
    потоки виконання інструмента

    Транзакції
    замовлення, запити, платежі

    Навантаження на систему
    транзакцій за одиницю часу

    Операційний профіль
    що робить один тип користувача

    Профіль навантаження, він же сценарій
    скільки екземплярів і як розподілені в часі

    Віртуальні користувачі
    потоки виконання інструмента

    Транзакції
    замовлення, запити, платежі

    Навантаження на систему
    транзакцій за одиницю часу

    Тепер головне, заради чого словник і потрібен. Навантаження задає системи, а не кількість користувачів. Кількість одночасних користувачів уживають замість неї часто — бо це число легше знайти й бо саме так навантаження задають інструменти, — але без визначення операційних профілів кількість користувачів не є доброю мірою навантаження. Арифметика з канону: 500 користувачів із короткими запитами щохвилини — це 30 000 запитів за годину; ті самі 500 із тими самими запитами раз на годину — 500 запитів. Різниця у 60 разів і щонайменше 60-кратна різниця у вимогах до заліза.

    Два застереження на додачу. Перше: навіть «запитів за секунду» неявно агрегує дані за вікном виміру — система, що віддає 200 запитів/с у парні секунди і 0 в решті, має те саме середнє, що й система зі сталими 100 запитів/с, але миттєве навантаження вдвічі більше. Друге: форму навантаження варто тримати простою — наростання, плато, спадання; «американські гірки» марнують ресурси й ускладнюють ізоляцію проблеми. Мережева частина часу відповіді — у главі Життєвий цикл запиту.

    Типові помилки

    • «Час відповіді в нормі — значить, прогін пройдено». Насправді канон описує окремий (performance failure mode), де час відповіді прийнятний, а на високих і позамежних навантаженнях деградує обробка помилок — через недостатні пули ресурсів, замалі черги й стеки та надто швидкі . Дивитися треба й на те, що система робить із запитами, яких не витягнула.
    • «Утилізація 70% — запас іще є». Насправді висока утилізація вже може бути проблемою, бо вимір за довгий період ховає короткі сплески до 100%. Задокументований випадок: моніторинг показував не вище 80%, бо звітував пʼятихвилинними середніми, усередині яких утилізація на секунди сягала 100%. Перше питання до графіка — яке в нього вікно усереднення. І окремо: будь-який ненульовий рівень (saturation) уже може бути проблемою, тобто приводом для розслідування.
    • «Повільно — отже, треба навантажувальне». Насправді є режим відмови, коли відповідь неприйнятна незалежно від навантаження — через погану схему чи реалізацію БД, мережеву затримку або фонові навантаження. Канон каже прямо: такі проблеми можуть виявитися під час функціонального й юзабіліті-тестування, не лише перф-тестування.
    • «Відкрили тридцять браузерів автотестами — це навантаження». Насправді генерація через UI годиться, якщо треба представити невелику кількість користувачів і є потрібна кількість клієнтів: для вона може бути найрепрезентативнішою, але тримається на стабільності UI, а часті зміни бʼють по відтворюваності й вартості супроводу. Для великих кількостей взаємодію захоплюють на рівні протоколу, а конкурентність інструмент моделює потоками, не вкладками браузера.

    Підсумок

    • Продуктивність — характеристика якості з трьох частин: часова поведінка, утилізація ресурсів і ємність. «Має бути швидко» покриває одну з них, а всі три разом визначають, чи система масштабується.
    • Тестування продуктивності — експеримент із вимогою відтворюваності. Прогін, який не повторюється на незміненій системі з тим самим результатом, вердикту не дає.
    • Критичні дефекти продуктивності вносяться в архітектуру, проєктування і вимоги — тому статичні активності тут часто важать більше, ніж для функціональної придатності, а динамічні прогони починають, щойно є що навантажувати.
    • Рішення «чи потрібне навантажувальне» ухвалюють за ризиком, а не за розміром проєкту, і починають не з інструмента, а з числа: без вимоги у вимірюваних термінах результат оцінюється субʼєктивною думкою.
    • Навантаження задає пропускна здатність системи, а не кількість користувачів. Ті самі 500 користувачів можуть означати 500 або 30 000 запитів за годину — різницю задає операційний профіль.

    Можливі питання

    • «Що таке performance testing і навіщо воно, якщо функціонально все працює?» Чекають розведення функціонального й нефункціонального боку якості та згадку трьох підхарактеристик. Слабка відповідь зупиняється на «перевіряємо, чи швидко».
    • «Чим тестування продуктивності відрізняється від інженерії продуктивності?» Перевіряють, чи розуміє кандидат, що критичні дефекти цього класу народжуються в архітектурі й вимогах, а не в коді останнього спринту. Вдалий хід — назвати статичні активності, які QA робить без генератора навантаження.
    • «На якому етапі проєкту починається перф-тестування?» Очікувана відповідь — на етапі концепції й вимог, із критеріями продуктивності у критеріях приймання, а не «після системного тестування». Плюс балів за уточнення, що в CI живе підмножина.
    • «Нашому проєкту потрібне навантажувальне тестування?» Питання-пастка: перевіряють, чи почне кандидат із розміру команди й трафіку замість ризику. Сильна відповідь ставить зустрічні питання — які цілі й числа вже є, які транзакції критичні, що буде з бізнесом, якщо вони деградують.
    • «Замовник каже: має працювати швидко. Ваші дії?» Дивляться на вміння перетворити побажання на вимогу: метрика, поріг, перцентиль, навантаження, точка виміру, умови чинності.
    • «Чи означає 1000 віртуальних користувачів тисячу реальних?» Перевіряють словник і чесність: VU — симуляція за операційним профілем, потік виконання інструмента, а навантаження визначає пропускна здатність системи.

    Джерела

    Продуктивність — це характеристика якості, а не «щоб швидко»

    • ISTQB® CT-PT — Foundation Level Specialist Syllabus, Performance Testing v1.0 (2018) — продуктивність як нефункціональна характеристика ISO 25010, три підхарактеристики, їхній вплив на масштабованість і діапазон виміру часової поведінки.
    • ISTQB Glossary — означення performance efficiency, capacity і scalability, які розводять три сусідні поняття.
    • web.dev — Why does speed matter? — утримання користувачів, порівняння з найкращими щоденними сервісами, стресова реакція на затримки, обмежені ресурси мобільних пристроїв.

    Що таке тестування продуктивності — і чим воно не є

    • ISTQB® CT-PT — Foundation Level Specialist Syllabus, Performance Testing v1.0 (2018) — збірний предмет і контексти застосування, пʼять вимог до тесту, форма експерименту, ітеративність і всі рівні тестування, статичні активності та їхня вага, дефекти під навантаженням.
    • ISTQB Glossary — означення performance testing як типу тестування, що визначає продуктивність компонента або системи.
    • Grafana k6 — Load test types — стратегія залежить від профілю ризику організації, і жоден окремий вид тесту не усуває всіх ризиків.

    Місце в SDLC і shift-left

    Коли проєкту (не) потрібне навантажувальне

    • ISTQB® CT-PT — Foundation Level Specialist Syllabus, Performance Testing v1.0 (2018) — ризик як підстава рішення й неусувний , три ключові цілі перф-тестування, шість наслідків «тестування без чисел», відсутність тест-оракула, хто задає цілі й три питання до стейкхолдерів, вимога описувати залишковий ризик часткою користувачів і порогом.
    • Google SRE Book — Chapter 4. Service Level Objectives — SLO мусить називати спосіб виміру й умови чинності; канонічний приклад формулювання цілі.
    • Grafana k6 — Thresholds — пороги як кодифікація SLO і приклади формулювань pass/fail.

    Базовий словник: навантаження, віртуальний користувач, транзакція, сценарій

    • ISTQB® CT-PT — Foundation Level Specialist Syllabus, Performance Testing v1.0 (2018) — навантаження проти тестових даних і чотири способи генерації, пропускна здатність системи через транзакції, конкурентність як кількість віртуальних користувачів, сценарій як агрегований профіль навантаження, арифметика «ті самі 500 користувачів — різниця в 60 разів».
    • ISTQB Glossary — означення load generation, virtual user, concurrency і load profile.
    • Apache JMeter — головна сторінка проєкту — конкурентність змодельована потоками: одночасне семплювання багатьма потоками й окремими групами потоків для різних функцій.
    • Apache JMeter — User's Manual: Elements of a Test Plan — один віртуальний користувач як потік, що виконує план тесту цілком і незалежно від інших.
    • Grafana k6 — Executors — інструмент не гарантує, що конкретний VU виконає конкретну ітерацію.
    • Grafana k6 — Metrics — готовий лічильник запитів http_reqs як інструментальна форма підрахунку транзакцій.
    • Grafana k6 — Scenarios — кілька сценаріїв в одному скрипті, кожен зі своїм патерном планування віртуальних користувачів, працюють паралельно.
    • Google SRE Book — Chapter 4. Service Level Objectives — «запитів за секунду» неявно агрегує за вікном виміру: приклад 200/0 проти сталих 100.
    • Grafana k6 — Load test types — тримайтеся простих патернів навантаження й уникайте «американських гірок» заради порівнюваності результатів.

    Пояснення

    «Поясни» працює з власним API-ключем Anthropic: запит іде з вашого браузера прямо до Anthropic.

    Свій API-ключ (BYOK)

    Вставте власний ключ Anthropic — пояснення працюватиме на реальній моделі. Ключ зберігається лише у вашому браузері (localStorage), нікуди не надсилається, крім api.anthropic.com, і не логується.