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

    06 · Автоматизація: стратегія

    Стратегія автоматизації з нуля: аудит, пріоритети, метрики

    Зміст

    Тебе беруть на проєкт, де автотестів або немає взагалі, або є цвинтар червоних флакі-сценаріїв, які всі навчилися ігнорувати. Питання, на яке доведеться відповісти делом (а спершу — на співбесіді), звучить так: «З чого ти почнеш?» Слабка відповідь — «напишу автотести на все, розкладу піраміду, підключу CI». Сильна відповідь починається не з коду, а з розуміння, де саме болить бізнесу і скільки коштує кожен варіант рішення.

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

    Аудит: спершу зрозумій, де болить

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

    Аудит — це інвентаризація трьох речей: продукту, процесу і того, що вже є. Продукт: які флоу приносять гроші, які використовуються найчастіше, які найскладніші (а отже, найкрихкіші). Процес: як часто релізять, скільки триває ручна регресія перед релізом, де в пайплайні є місце для автотестів. Уже наявне: чи є хоч якісь тести, у якому вони стані, чи є тестове середовище, тестові дані, доступ до API і БД.

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

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

    Вибір кейсів: критичний шлях, смоук, найдорожчі баги

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

    Три орієнтири, у порядку пріоритету:

    • Критичний шлях (critical path) — флоу, без яких продукт не має сенсу: логін, оформлення замовлення, оплата, ключова дія заради якої користувач прийшов. Якщо це впаде — впаде бізнес, а не «одна фіча». Критичний шлях автоматизують першим, навіть коли він складний.
    • Смоук (smoke) — тонкий зріз «система взагалі жива»: застосунок піднявся, головні сторінки відкриваються, критичні API відповідають. Смоук дешевий, швидкий і дає найбільше сигналу на одиницю зусиль — його ставлять на кожен деплой як воротаря.
    • Найдорожчі баги — зони, де падіння коштує найбільше (гроші, репутація, дані користувачів) або де за історією найбільше регресій. Це перетин «часто ламається» і «дорого, коли ламається».

    Формалізувати вибір допомагає проста модель: цінність автотесту тим вища, чим частіше він виконуватиметься, чим дорожча його ручна альтернатива і чим стабільніша фіча під ним (нестабільну фічу тест доведеться переписувати щотижня — це негативна окупність). Розкладемо це у квадрант «цінність × вартість підтримки»:

    Ні

    Так

    Ні

    Так

    Кандидат на автоматизацію

    Висока цінність?
    критичний шлях або
    дорогий баг

    Не автоматизувати зараз
    лишити ручним або exploratory

    Фіча стабільна?
    інтерфейс і логіка
    не міняються щотижня

    Зачекати на стабілізацію
    покрити на нижчому рівні API

    Автоматизувати
    перша черга roadmap

    Ні

    Так

    Ні

    Так

    Кандидат на автоматизацію

    Висока цінність?
    критичний шлях або
    дорогий баг

    Не автоматизувати зараз
    лишити ручним або exploratory

    Фіча стабільна?
    інтерфейс і логіка
    не міняються щотижня

    Зачекати на стабілізацію
    покрити на нижчому рівні API

    Автоматизувати
    перша черга roadmap

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

    Рівні й інструменти: не все через UI

    Обравши що тестувати, обирають на якому рівні. Тут працює головне правило піраміди: кожну перевірку роби на найнижчому рівні, де вона ще має сенс. Валідацію знижки рахуй юнітом чи API-тестом, а не кліками через кошик; наскрізний сценарій «купив і отримав лист» — уже e2e. Детально рівні, їхню вартість і антипатерни (морозиво, пісочний годинник) розбирає глава «Піраміда тестування» — стратегія лише застосовує її як карту: дешевих і швидких перевірок має бути більшість, дорогих e2e — тонка вершина навколо критичного шляху.

    Вибір інструмента — похідне від контексту, а не від моди. Детальне порівняння фреймворків (Selenium, Playwright, Cypress, CodeceptJS) з їхніми архітектурними моделями належить розділу про інструменти автоматизації, глава «Ландшафт інструментів» — тут важливі критерії, за якими стратег робить вибір:

    КритерійЩо питати
    Стек командиЯкою мовою пишуть розробники? Тести на тій самій мові легше рев'ювати і ними легше ділити ownership
    Об'єкт тестуWeb, mobile, desktop, лише API? Один інструмент рідко закриває все однаково добре
    Навички командиХто підтримуватиме? Потужний інструмент у руках без експертизи — джерело флаку, а не стабільності
    Інтеграція з CIЧи легко запускати headless, паралелити, збирати артефакти для тріажу
    Екосистема і час життяАктивна підтримка, спільнота, документація — тест житиме роками

    Найпоширеніша стратегічна помилка тут — почати з важкого e2e-інструмента, бо «так по-дорослому», коли 80% ризику закривалося б API-тестами, які пишуться швидше і майже не флакають. Інструмент обирають під рівень, а не рівень під інструмент.

    Чесне покриття: чому «80%» бреше

    Покриття (coverage) — найпопулярніша і найпідступніша метрика в автоматизації. «У нас 80% покриття» звучить солідно, але саме по собі не означає майже нічого, поки не сказано: 80% чого і що ці 80% реально перевіряють.

    Розберемо пастку. Покриття коду (code coverage) — це частка рядків або гілок, які виконалися під час прогону тестів. Ключове слово — «виконалися», а не «перевірилися». Тест може прогнати весь модуль і не мати жодного змістовного expect — рядки «покриті», а поведінка не перевірена. 100% code coverage гарантує лише, що код не падає з винятком на щасливому шляху, а не що він робить правильну річ. Це інструмент розробника для пошуку зовсім неторканих ділянок, а не доказ якості.

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

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

    Метрики здоров'я сьюти

    Автотести — це продукт, який теж треба експлуатувати, тож у нього є свої показники здоров'я. Стратег дивиться не лише на «скільки написали», а на те, чи набору взагалі довіряють. Мертва сьюта, якій ніхто не вірить, гірша за її відсутність, бо ще й з'їдає час на прогони.

    Ключові метрики здоров'я:

    • Pass rate на стабільній гілці — яка частка прогонів зелена без втручання. Хронічно «жовтий» набір нікого не захищає, бо червоне перестають читати.
    • Flaky rate — частка тестів, які падають і проходять без змін коду. Це метрика №1 довіри до сьюти; її причини, діагностику й політику карантину розбирає канонічна глава «Флакі-тести». Один флакі-тест у quality gate здатний знецінити весь набір.
    • Час прогону — скільки чекають на зворотний зв'язок. Смоук на PR має вкладатися в хвилини; якщо повний прогін росте до годин, це вже не «швидкий фідбек», а гальмо (лікування — паралелізація і шардінг, глава «Паралелізація»).
    • Escape rate (defect leakage) — скільки багів просочилося у прод попри зелену сьюту. Ця метрика ловить головну ілюзію: тести зелені, а користувач бачить помилку. Зростання escape rate — сигнал, що покриття не там, де ризик.
    • Час на діагностику падіння — скільки треба, щоб від червоного тесту дійти до причини. Залежить від якості артефактів і тріажу (глава «Звітність»).
    • Частка регресії, покрита автоматично — скільки з ручного регресійного набору вже не треба ганяти руками. Це і є пряма окупність.

    Обережно з ефектом Ґудгарта: щойно метрика стає ціллю, вона перестає бути хорошою метрикою (докладніше — у главі про метрики тестування розділу основ). Поставиш команді KPI «кількість автотестів» — отримаєш тисячу порожніх тестів. Поставиш «pass rate 100%» — отримаєш try/catch навколо асертів. Метрики здоров'я потрібні, щоб приймати рішення, а не щоб ними звітувати вгору.

    Roadmap: цінність, а не кількість

    Roadmap автоматизації розкладають фазами, і кожна фаза має приносити відчутну цінність сама по собі — щоб проєкт можна було зупинити чи перепріоритезувати будь-коли, не лишившись із наполовину написаним нічим.

    Фаза 0
    Інфраструктура
    ранер, CI, тестові дані

    Фаза 1
    Смоук + критичний шлях
    воротар на кожен деплой

    Фаза 2
    Регресія за ризиком
    найдорожчі баги, широта

    Фаза 3
    Оптимізація
    швидкість, стабільність, підтримка

    Фаза 0
    Інфраструктура
    ранер, CI, тестові дані

    Фаза 1
    Смоук + критичний шлях
    воротар на кожен деплой

    Фаза 2
    Регресія за ризиком
    найдорожчі баги, широта

    Фаза 3
    Оптимізація
    швидкість, стабільність, підтримка

    Фаза 0 — фундамент: обраний інструмент, конфігурація середовищ, підготовка тестових даних (глава «Тест-дані»), стабільні локатори (глава «Локатори») і запуск у CI. Без цього перший же тест обросте болем. Фаза 1 — тонкий смоук плюс кілька e2e на критичний шлях: уже на цьому етапі команда отримує воротаря, який ловить катастрофи до релізу. Фаза 2 — розширення в глибину за пріоритетом ризику. Фаза 3 — коли набір великий, фокус зміщується на час прогону, стабільність і вартість підтримки.

    Головне правило roadmap: віхи прив'язані до захищеного ризику, а не до кількості тестів. «Критичний шлях оплати покрито наскрізним тестом на кожен деплой» — це віха. «Написали 500 тестів» — це не віха, це витрати. Ownership і місце автотестів у процесі розробки (shift-left, тести в DoD і PR-чеках) — тема окремої глави «Автоматизація в процесі розробки»; стратегія лише закладає в roadmap, що сьюту супроводжує команда, а не один герой.

    Практично розкладку прогонів зашивають тегами: смоук ганяють на кожен PR, повну регресію — вночі або перед релізом.

    // Теги розводять швидкий фідбек і повний прогін
    test('checkout: оплата картою проходить', { tag: ['@critical', '@smoke'] }, async ({ page }) => {
      // ...критичний шлях, ганяємо на кожен PR
    });
    
    test('checkout: експорт історії замовлень у CSV', { tag: ['@regression'] }, async ({ page }) => {
      // ...ширша регресія, ганяємо вночі
    });
    # У PR-чеку — лише смоук, щоб фідбек був за хвилини
    npx playwright test --grep @smoke

    Коли зупинитися

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

    Ознаки, що пора зупинитися або переключитися:

    • Вартість підтримки перевищує цінність. Якщо тест переписують щоспринту через зміни в нестабільній фічі, він коштує більше, ніж ловить. Іноді чесніше видалити, ніж підтримувати.
    • Сценарій рідкісний і дешевий у ручній перевірці. Одноразову міграцію чи екзотичний крайовий випадок дешевше перевірити руками, ніж автоматизувати.
    • Зона за природою ручна. Exploratory-тестування, оцінка usability, візуальна естетика, разові дослідження — те, де людське судження незамінне, автоматизація не покриває за визначенням.
    • Нестабільний UI на ранній фічі. Поки інтерфейс міняється щодня, e2e-тест на нього — це переписування коду замість тестування продукту.

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

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

    • Виглядає як прогрес, а насправді борг. «Написали 500 тестів за квартал» — звучить як досягнення, а виявляється тисячею дублів, з яких третина флакі й вимкнена. Кількість тестів — витрати, а не результат.
    • Виглядає як покриття, а насправді сліпа пляма. «80% code coverage» — код виконався, але половина без змістовних асертів. Покриття рядків ≠ перевірена поведінка ≠ покритий ризик.
    • Виглядає як стратегія, а насправді автоматизація найлегшого. Команда покриває просте й стабільне (бо швидко пишеться), а критичний платіжний флоу лишається ручним, бо він «складний». Пріоритет за ризиком, а не за легкістю.
    • Виглядає як зелена сьюта, а насправді втрачена довіра. Хронічно жовтий набір, де падіння ігнорують «бо воно завжди падає». Один живучий флакі знецінює весь gate.
    • Виглядає як здоровий процес, а насправді метрика-ціль. KPI «pass rate 100%» породжує try/catch навколо асертів; KPI «кількість тестів» — порожні тести. Метрика, що стала ціллю, перестає бути метрикою.
    • Виглядає як економія, а насправді дубль продукту. Автоматизували все підряд без плану підтримки — і тепер сьюта сама стала продуктом, який з'їдає більше часу, ніж повертає.

    Підсумок

    • Стратегія починається з аудиту, а не з коду: критичні флоу, історія багів у проді, стан інфраструктури — це вхід для всіх подальших рішень.
    • Перші кейси обирають за ризиком і цінністю: критичний шлях, смоук, найдорожчі та найчастіші баги. «Автоматизувати все» — це відсутність стратегії.
    • Кожну перевірку роблять на найнижчому доцільному рівні; інструмент обирають під контекст (стек, навички, об'єкт тесту), а не навпаки.
    • Покриття вимірюють у термінах ризику і вимог, і найчесніша його частина — явний список того, що не покрито. Покриття рядків і кількість тестів — метрики марнославства.
    • Автотести — продукт зі своїм здоров'ям: flaky rate, escape rate, час прогону і час діагностики важливіші за абсолютну кількість тестів; у автоматизації діє закон спадної віддачі, тож частину сценаріїв свідомо лишають ручними.

    Що питають на співбесіді

    • «Приходиш на проєкт без автотестів. З чого почнеш?» Інтерв'юер перевіряє, чи ти стрибнеш одразу в код. Сильна відповідь починається з аудиту (критичні флоу, історія багів, інфраструктура), далі — смоук і критичний шлях, тонка вершина e2e, решта ризику на нижчих рівнях.
    • «Що автоматизувати першим?» Чекають не «логін-форму», а критерій: критичний шлях + смоук + найдорожчі/найчастіші баги, з поправкою на стабільність фічі. Бонус — згадка, що нестабільне краще брати на рівні API.
    • «Що НЕ треба автоматизувати?» Улюблене питання на senior. Демонструє зрілість: exploratory, usability, разові й рідкісні сценарії, нестабільний UI, тести з вартістю підтримки понад цінність.
    • «У вас 80% покриття — це добре?» Пастка. Правильна реакція — уточнити, покриття чого і що воно перевіряє: code coverage ≠ перевірена поведінка ≠ покритий ризик.
    • «Як довести цінність автоматизації менеджменту?» Не кількістю тестів, а звільненою ручною працею, спійманими до прода багами, скороченим часом регресії — мовою ризику й грошей.
    • «Якими метриками міряєш здоров'я сьюти?» Дивляться, чи назвеш flaky rate і escape rate, а не лише pass rate, і чи розумієш ефект Ґудгарта (метрика-ціль).

    Джерела

    • ISTQB Certified Tester Foundation Level (CTFL) v4.0 — огляд і сам силабус (PDF) — розділ про тестові інструменти й аналіз вигід/ризиків автоматизації, принципи тестування (вичерпне тестування неможливе, скупчення дефектів). Глибша стратегія автоматизації — в окремому силабусі ISTQB Test Automation Engineer.
    • ISO/IEC/IEEE 29119-1:2022 — частина 1 серії стандартів тестування ПЗ: загальні концепції (роль тестування, ризик-орієнтований підхід, неможливість вичерпного тестування, тест-стратегія). Процеси, документацію й техніки деталізують частини 2–4 серії.
    • Martin Fowler — Test Pyramid — розподіл тестів за рівнями і чому спиратися на дорогі e2e — антипатерн.
    • Martin Fowler — TestCoverage — чому покриття коду не є метрикою якості й де воно оманливе.