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

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

    Автоматизація в процесі розробки: shift-left і ownership

    Зміст

    Автотести на проєкті є, але пишуться «колись потім» і вічно відстають від фіч. Володіє ними одна людина — і коли вона у відпустці, червону сьюту не чинить ніхто. Половина тестів «іноді падає», тож команда звикла перезапускати прогін, поки не позеленіє. Формально автоматизація є; фактично вона нічого не гарантує. Ця глава — про два питання, які вирішують, працює автоматизація чи лише імітує роботу: коли писати тести (shift-left) і хто за них відповідає (ownership).

    Це поглиблена глава про процес, а не про код, і розрахована на senior-рівень. Якщо ви тільки вчитеся писати автотести, її можна пропустити при першому проході й повернутися, коли постане питання «як вбудувати тести в роботу команди». Тут — єдиний повний виклад shift-left і володіння тестами на сайті; інші глави розділу посилаються сюди. Механіка самого пайплайна і quality gates докладно розібрана в розділі про Git і CI/CD — у цій главі ми дивимося на них з боку автоматизації.

    Shift-left: тестувати раніше, а не «наприкінці»

    Класична модель роботи: спочатку розробники пишуть код, потім він «перекидається через стіну» в тестування, і аж наприкінці спринту (а то й релізного циклу) QA починає шукати баги. Проблема — у ціні дефекту. Баг, спійманий на етапі вимог, коштує виправити копійки; той самий баг у проді — на порядки дорожче: перевипуск, регресія, інцидент, репутація. Це один із семи принципів тестування — раннє тестування економить (early testing). Розділ «Основи тестування» розкриває його докладно.

    Shift-left (зсув вліво) — це зсув перевірок вліво по таймлайну розробки, ближче до моменту, коли дефект створюється. У контексті автоматизації це означає дуже конкретну річ: тест пишеться разом із кодом фічі, у тому ж pull request, а не окремою задачею «покрити автотестами» через два спринти. Петля зворотного звʼязку (feedback loop) стискається з тижнів до хвилин — розробник дізнається, що зламав, ще до рев'ю.

    Важливо: shift-left ширший за автоматизацію. Він охоплює й рев'ю вимог (ловимо неоднозначність до написання коду), і статичний аналіз (лінтери, типізація), і тест-дизайн на етапі уточнення історії. Але саме в автоматизації він найвідчутніший — через ідею self-testing code (код, що сам себе перевіряє): будь-яка збірка автоматично проганяє свій набір тестів і сама каже, справна вона чи ні.

    зелено

    червоно

    Розробник пише код

    Разом пише автотест

    Пуш у гілку

    PR-чеки:
    lint, typecheck,
    unit, смоук

    Рев'ю і мерж

    зелено

    червоно

    Розробник пише код

    Разом пише автотест

    Пуш у гілку

    PR-чеки:
    lint, typecheck,
    unit, смоук

    Рев'ю і мерж

    Головна пастка тут — плутати shift-left з «тестувати все і одразу вручну на ранній стадії». Це не про більше ручної роботи раніше. Це про дешеві автоматичні повторювані перевірки, вбудовані в момент, коли дефект коштує найменше.

    Хто пише автотести: три моделі володіння

    Питання «хто пише автотести» — не про посади в штатному розписі, а про відповідальність (ownership). Від відповіді залежить, чи будуть тести жити разом із продуктом, чи перетворяться на занедбаний цвинтар, який усі бояться чіпати.

    • Окрема AQA-команда пише всі тести. Розробники кидають фічу, автоматизатори наздоганяють її тестами. Наслідки: тести структурно відстають від коду; розробники не почуваються відповідальними за зелену сьюту; знання про фічу й знання про її тест живуть у різних головах. Класична сегрегація, що народжує тести-сироти.
    • Розподіл за рівнями піраміди. Розробники володіють unit- та інтеграційними тестами (вони ближче за всіх до внутрішнього коду), AQA/SDET — API- та e2e-рівнем. Розумний компроміс, який спирається на природу рівнів (див. главу «Піраміда тестування»).
    • Спільне володіння (whole-team approach). Тест — частина визначення «готово» для фічі; він лежить у тому ж PR, що й код; полагодити червоний тест — обовʼязок того, хто його зламав, а не абстрактної «команди тестування». За якість відповідає вся команда, а не окремий відділ контролю.
    МодельШвидкість фідбекуРизик тестів-сирітХто чинить червоне
    Окрема AQA-команданизькависокийавтоматизатори
    Розподіл за рівнямисереднясереднійавтор рівня
    Спільне володіннявисоканизькийавтор зміни

    Whole-team approach — усталений термін з Agile-тестування. Він не скасовує спеціалізацію (глибокі e2e-сценарії й тестову архітектуру все одно тягне AQA/SDET), але прибирає головну хворобу сегрегації: коли ніхто не почувається власником червоної збірки, вона просто лишається червоною. Піраміда підказує природний розподіл: unit-тести живуть найближче до коду, тож їх логічно писати тим, хто цей код написав; що вище рівень, то більша роль автоматизаторів.

    Тести в Definition of Done і PR-чеках

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

    Definition of Done (DoD). Фіча не вважається завершеною, поки на неї немає тестів відповідного рівня. Це рядок у командному DoD (поняття з Agile, див. розділ «Основи тестування»), а не усна домовленість. Логіка проста: якщо тест не входить у визначення «готово», його завжди можна відкласти на «потім» — а «потім» на практиці означає «ніколи», бо наступна фіча вже горить.

    PR-чеки (required status checks). Технічне втілення DoD у системі контролю версій. Через branch protection репозиторій налаштовують так, що злити гілку не можна, поки обовʼязкові перевірки не стануть зеленими: лінт, перевірка типів, unit-тести, вузький смоук. Гейт стоїть саме там, де дефект найдешевший — до потрапляння в основну гілку. Механіку PR і захисту гілок докладно розбирає розділ про Git і CI/CD.

    Ці два гачки й перетворюють shift-left з гасла на процес: тест зʼявляється разом із кодом, бо інакше зміна фізично не доїде до main.

    Довіра до сьюти: один флакі руйнує gate

    Гейт має цінність рівно доти, доки червоне означає реальну проблему. Це негласний контракт між сьютою і командою. Один стабільно-нестабільний (flaky) тест цей контракт ламає: команда бачить червоне, знизує плечима, перезапускає прогін — і він зеленіє сам собою. Одного разу спрацювало, другого, третього. Далі настає нормалізація відхилень (normalization of deviance): «червоне — це нормально, просто клікни retry». І в той день, коли червоним стане справжній регрес, його теж перезапустять у забуття. Один терпимий флакі знецінює всю сьюту — не тому, що ламає один сценарій, а тому, що вчить команду не вірити гейту.

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

    Розкладка прогонів: PR, nightly, реліз

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

    • PR-прогін — швидкий і блокувальний. Лінт, перевірка типів, unit-тести, вузький смоук найкритичніших шляхів. Ціль — хвилини, не десятки хвилин, бо саме він стоїть між розробником і мержем.
    • Nightly — повна регресія: e2e на всіх браузерах, довгі сценарії, крос-конфігурації. Іде вночі, довго, і зазвичай не блокує мерж, а дає команді ранковий звіт про стан продукту. Швидкість тут забезпечує паралелізація (див. главу «Паралелізація»), а розбір нічних падінь — окрема дисципліна тріажу (див. главу «Звітність»).
    • Перед релізом — повний прогін плюс ручні й дослідницькі перевірки; його результат входить у рішення про готовність до релізу.

    Quality gate (гейт якості) — це автоматичний критерій, який блокує просування зміни далі конвеєром: не пройшов — не мержиш або не деплоїш. Що саме зробити блокувальним — інженерне рішення з наслідками. Наприклад, повільні й історично флакі e2e часто виносять з блокувальних PR-чеків у nightly, лишаючи на PR тільки швидкий надійний смоук. А покриття (coverage) як гейт — палиця з двома кінцями: жорсткий поріг на цифру породжує тести без асертів, написані заради метрики, а не заради перевірки.

    PR-чек
    смоук + unit
    хвилини
    блокує мерж

    Nightly
    повна регресія
    довго
    не блокує, дає звіт

    Перед релізом
    регресія + ручні
    рішення про реліз

    PR-чек
    смоук + unit
    хвилини
    блокує мерж

    Nightly
    повна регресія
    довго
    не блокує, дає звіт

    Перед релізом
    регресія + ручні
    рішення про реліз

    Ця розкладка й політика quality gates — окрема велика тема; її канонічний виклад — у розділі про Git і CI/CD (стратегія якості в пайплайні). Тут ми зафіксували лише погляд автоматизатора: один і той самий набір тестів обслуговує різні стадії з різними вимогами до швидкості й до права блокувати.

    На рівні коду розкладка спирається на теги: критичні сценарії позначають, і PR ганяє лише їх, а nightly — усе.

    // смоук-сценарії позначаємо тегом
    test('логін відкриває дашборд @smoke', async ({ page }) => {
      // ...
    });
    
    // на PR: npx playwright test --grep @smoke
    // вночі:  npx playwright test

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

    • Виглядає як «у нас є автоматизація», а насправді тести пишуться окремою задачею через кілька спринтів після фічі й вічно відстають — shift-left не сталося, гейта на дешевій стадії немає.
    • Виглядає як «гейт працює, бо червоне блокує мерж», а насправді половина падінь — флакі, команда перезапускає прогін не дивлячись, і справжній регрес пройде тим самим шляхом у забуття.
    • Виглядає як «e2e на кожен PR — це максимальна якість», а насправді 40-хвилинний прогін на кожен пуш зупиняє команду, і люди починають шукати способи мержити в обхід — швидкість фідбеку вбита.
    • Виглядає як «розробники не хочуть писати тести, це робота QA», а насправді unit-тест без доступу до внутрішнього коду й контексту напише лише його автор — сегрегація народжує сироти й дублікати замість покриття.
    • Виглядає як «100% coverage як гейт — це якість», а насправді гейт на покриття женуть цифрою, і зʼявляються тести без жодного асерту, які нічого не перевіряють.

    Підсумок

    • Shift-left — це не «більше ручного тестування раніше», а дешеві автоматичні перевірки в момент створення коду: тест живе в тому ж PR, що й фіча.
    • Володіння тестами вирішує їхню долю; спільне володіння (whole-team) перемагає модель «окремий відділ пише тести пост-фактум».
    • Тест у Definition of Done і в обовʼязковому PR-чеку — єдиний надійний спосіб не відкласти його на «потім, тобто ніколи».
    • Гейт має цінність рівно доти, доки червоне означає реальну проблему; один терпимий флакі знецінює всю сьюту.
    • Розкладка прогонів — це компроміс швидкість/покриття: смоук блокує PR за хвилини, повна регресія йде nightly, релізний прогін годує рішення про реліз.

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

    • «Що таке shift-left?» — чекають не гасло, а механізм: раніше = дешевше, тест разом із кодом, коротка петля фідбеку; плюс приклад із власної практики. Відповідь «тестувати на початку проєкту» без пояснення ціни дефекту — слабка.
    • «Хто має писати автотести — розробники чи AQA?» — перевіряють, чи розумієте спільне володіння й піраміду. Сильний кандидат не рубає «звісно AQA», а розводить рівні: unit — ближче до розробника, e2e — до автоматизатора, відповідальність — спільна.
    • «Тест іноді падає в CI, а локально зелений — що робиш?» — дивляться, чи не запропонуєте «додати retry» першим рухом. Чекають діагностику причини й розуміння, що терпимий флакі отруює весь гейт.
    • «Що ганяти на кожен PR, а що — вночі?» — перевіряють відчуття компромісу швидкість/покриття і що таке quality gate; сильна відповідь називає смоук на PR і повну регресію в nightly з поясненням чому.
    • «Чи має падіння e2e блокувати мерж?» — єдиної правильної відповіді немає; інтервʼюер дивиться на аргументацію: стабільність сьюти, критичність шляху, час прогону, ціна помилково заблокованого мержу.

    Джерела