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

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

    Звітність: артефакти, тріаж, тренди

    Зміст

    Автотести запустилися, ран завершився, на дашборді — «27 failed». Що далі? Хтось має відкрити цей результат, зрозуміти, що зламалося, і вирішити, чи можна релізити. Саме тут більшість молодих сюїт розсипається: тести є, а от звіту, з якого видно причину падіння за хвилину, а не за годину, — немає. Червоний прогін без артефактів (artifacts) — це не сигнал, а загадка: доводиться перезапускати локально, вгадувати крок, ловити стан. Ціна автоматизації окупається не в момент написання тесту, а в момент, коли впав чужий тест о третій ночі й треба швидко зрозуміти, хто винен.

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

    Звіт як продукт: хто його читає

    Перша помилка — думати, що звіт читає одна людина. Насправді той самий прогін дивляться кілька ролей, і кожній потрібне своє. Один HTML-файл на всіх не працює: інженеру мало «pass rate», а менеджеру не треба trace viewer.

    ЧитачЩо йому требаЩо для нього шум
    Автор тесту / AQAТочна причина падіння: трейс, скриншот, стекАгреговані відсотки
    Розробник фічіАртефакт, що вказує на регресію в його кодіВнутрішня механіка тесту
    Тімлід / QA leadТренд: pass rate, флак, час прогонуДеталі кожного окремого фейлу
    Реліз-менеджерОдна відповідь: gate зелений чи ніУсе інше
    Продакт / бізнесСтан покриття критичних сценаріївТехнічні артефакти

    Звідси практичний висновок: звітність — це кілька зрізів одних і тих самих даних. Детальний HTML-звіт з артефактами — для інженерів; коротка нотифікація «main зламався, 3 нові фейли» — для команди; тренд у дашборді — для ліда; статус у TMS — для менеджменту й трасування. Далі розберемо кожен шар.

    Прогін тестів

    Артефакти фейлу
    скриншот, відео, трейс, логи

    Звіт
    HTML / Allure / TMS

    Тріаж
    продукт / тест / інфра

    Нотифікація
    потрібному власнику

    Тренди
    історія прогонів

    Прогін тестів

    Артефакти фейлу
    скриншот, відео, трейс, логи

    Звіт
    HTML / Allure / TMS

    Тріаж
    продукт / тест / інфра

    Нотифікація
    потрібному власнику

    Тренди
    історія прогонів

    Артефакти фейлу: скриншот, відео, трейс, логи

    Артефакт — це доказ, який тест зберігає в момент падіння, щоб причину можна було встановити без повторного запуску. Це критично: у CI впав тест на воркері (worker), який уже погашено; стан не відтворити; єдине, що лишилось, — те, що тест устиг зафіксувати. Тому правило звучить так: якщо фейл не залишає артефакту, з якого видно причину, — тест наполовину марний.

    Чотири основні типи, від найлегшого до найважчого:

    • Скриншот (screenshot) — знімок екрана в мить падіння. Дешевий, миттєво відповідає на питання «що було на сторінці, коли assert не пройшов»: правильна сторінка? модалка перекрила кнопку? порожній список? Часто цього достатньо.
    • Відео (video) — запис усього сценарію. Показує послідовність: як тест дійшов до провального стану. Незамінне, коли фейл — наслідок чогось за кілька кроків до assert (не той клік, гонка редиректів). Дорожче за диском і за часом.
    • Трейс (trace) — найпотужніший артефакт. Playwright trace — це часова шкала всього тесту зі знімками DOM на кожній дії, мережею, консоллю й аргументами кожного виклику. У trace viewer можна «перемотати» тест і побачити стан сторінки на будь-якому кроці постфактум. Це те, що перетворює «тест упав» на «ось на цьому кроці кнопка ще була disabled».
    • Логи (logs) — консоль браузера, лог сервера, мережеві запити (у форматі HAR). Консольна помилка JS часто пояснює падіння напряму; серверний лог із correlation id показує, що бекенд віддав 500; HAR ловить запит, який завис або повернув не те.

    Чому не збирати все й завжди? Бо трейс і відео важкі: на тисячах тестів вони роздмухують час прогону й розмір артефактів у рази. Тому їх збирають вибірково — на падінні або на першому ретраї (retry), коли фейл уже стався:

    // playwright.config.ts
    export default defineConfig({
      use: {
        screenshot: 'only-on-failure',
        video: 'retain-on-failure',
        trace: 'on-first-retry',
      },
    });

    Логіка on-first-retry: перший прогін іде без важкого трейсу; якщо тест упав і пішов на повтор — трейс уже пишеться, і ви маєте повний доказ саме того запуску, який відтворив проблему. Це дешево для стабільних тестів і щедро для проблемних. Артефакти — центральний інструмент діагностики флаку; детально причини й лікування розібрані в главі «Флакі-тести».

    HTML-звіти й Allure (оглядово)

    Артефакти треба десь показати. Це робить репортер (reporter) — компонент ранера, що перетворює результати прогону в людиночитний формат. Тут — єдиний канонічний огляд репортерів на сайті.

    Репортери бувають двох сортів. Консольні (list, line, dot) друкують прогрес у термінал — для локальної роботи й логів CI. Файлові генерують артефакт-звіт: html — самодостатня сторінка з деревом тестів, вкладеними скриншотами, відео й трейсами; junit — XML у стандартному форматі JUnit, який розуміють майже всі CI-системи й дашборди. Репортери комбінують: людям — HTML, машині — XML.

    // playwright.config.ts
    reporter: [
      ['list'],
      ['html', { open: 'never' }],
      ['junit', { outputFile: 'results.xml' }],
    ],

    Allure — це окремий, надбудовний шар звітності поверх результатів будь-якого ранера (Playwright, CodeceptJS, JUnit тощо). Він дає те, чого вбудований HTML зазвичай не має: історію прогонів (тренд pass rate у часі), категорії (автоматичне сортування фейлів за типом дефекту), деталізовані кроки, вкладені атачі й розбивку за фічами. Працює через окремий крок: тести пишуть проміжні дані, а команда Allure збирає з них статичний сайт-звіт. Коротко: вбудований HTML відповідає на «що впало зараз», Allure — ще й на «як ми падали останній місяць». Вибір між ними — це вибір між простотою й історією; для невеликої сюїти рідного HTML достатньо, потреба в трендах приходить із масштабом.

    Інтеграція з TMS

    Звіт живе кілька днів, максимум — до наступного прогону. Але результати часто треба зв'язати з тест-кейсами в системі керування тестами (test management system, TMS) — Testomatio, TestRail, Xray, Zephyr. Навіщо: щоб менеджмент бачив живий стан покриття («які з задокументованих сценаріїв зелені прямо зараз»), щоб автотест і ручний тест-кейс були однією сутністю, а не двома паралельними списками, і щоб історія результатів кейса не губилася між ранами.

    Механіка проста: кожен автотест маркується ідентифікатором кейса в TMS, а спеціальний репортер після прогону відправляє статуси через API. У Playwright/CodeceptJS це часто окремий пакет-репортер або тег у назві тесту:

    test('@T1a2b3c логін валідним користувачем', async ({ page }) => {
      // ...
    });

    Так автоматизація перестає бути «річчю в собі» й вливається в загальну картину покриття. Це прямий місток до трасування вимог: методику покриття й побудову матриці трасування (RTM) розкрито в розділі «Тест-дизайн» (глава про покриття вимог), а тут TMS — канал, яким автотести повідомляють свій статус у ту матрицю. Ручний бік TMS (структура кейса, сюїти) оглянуто в розділі «Основи тестування».

    Тріаж: баг продукту / баг тесту / інфраструктура

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

    • Баг продукту (product bug) — застосунок справді зламався. Тест зробив свою роботу. Дія: завести баг-репорт, віддати розробнику. Це та єдина корзина, заради якої тести й пишуть.
    • Баг тесту (test bug) — застосунок здоровий, помиляється тест: крихкий локатор, гонка без правильного очікування, застаріле очікуване значення, погана ізоляція даних. Дія: лагодити тест, а не заводити баг на продукт. Сюди ж потрапляє більшість флаку.
    • Інфраструктура (infrastructure) — не винен ні продукт, ні тест: середовище лежить, БД недоступна, таймаут мережі, впав CI-раннер, скінчилися ресурси, протух токен. Дія: перезапустити / полагодити оточення; ні продукт, ні тест чіпати не треба.

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

    Як розрізняти на практиці — по артефактах і історії:

    Ні, миготить

    Так

    Таймаут / 5xx / DNS / немає БД

    Ні

    Так, баг видно руками

    Ні, руками працює

    Тест червоний

    Відтворюється
    стабільно?

    Баг тесту: флак
    карантин + лагодити

    Помилка про
    оточення?

    Інфраструктура
    перезапуск + чинити стенд

    Ручний флоу
    дає той самий результат?

    Баг продукту
    завести баг-репорт

    Баг тесту
    локатор / очікування / дані

    Ні, миготить

    Так

    Таймаут / 5xx / DNS / немає БД

    Ні

    Так, баг видно руками

    Ні, руками працює

    Тест червоний

    Відтворюється
    стабільно?

    Баг тесту: флак
    карантин + лагодити

    Помилка про
    оточення?

    Інфраструктура
    перезапуск + чинити стенд

    Ручний флоу
    дає той самий результат?

    Баг продукту
    завести баг-репорт

    Баг тесту
    локатор / очікування / дані

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

    Нотифікації: сигнал замість шуму

    Останній шар — доставити результат людям. І тут головна пастка — втома від алертів (alert fatigue): якщо канал пищить на кожен ран, у тому числі на відомий флак і на нічні інфра-збої, команда перестає читати сповіщення взагалі. Тоді справжня регресія тоне серед шуму. Мета нотифікації — сигнал, а не шум.

    Що відрізняє сигнал від шуму:

    • Алертити на зміну стану, а не на факт. Важливо не «є червоні тести», а «на main зʼявилися нові падіння, яких учора не було». Стабільно червоний карантинний тест не має будити нікого.
    • Не алертити на відомий флак. Тести в карантині й ретраї, що позеленіли з другої спроби, — не привід для сповіщення. Інакше канал вчить ігнорувати себе.
    • Маршрутизувати до власника. Падіння в чекауті — команді чекауту, а не всім. Персональна адресація підвищує шанс, що фейл полагодять, а не залишать «комусь».
    • Агрегувати. Одне повідомлення «12 fail, 3 нові, ось звіт» замість дванадцяти окремих. Посилання на HTML/Allure-звіт — щоб від сигналу можна було одразу провалитися в деталі.

    Різні розклади прогонів мають різну гучність: падіння PR-перевірки бачить лише автор PR у самому PR; нічний повний ран (nightly) шле зведення в командний канал; блокуючий gate перед релізом — найголосніший сигнал. Політику блокування релізу за результатами тестів — quality gates — розкрито в розділі «Git і CI/CD»; тут звітність лише постачає в цей gate свій вердикт. Довіра до сюїти й спільне володіння тестами — у главі «shift-left і ownership».

    Тренди: звіт у часі, а не знімок

    Один прогін відповідає на «зелено чи ні». Продукт-звіт відповідає ще й на «нам стає краще чи гірше», а для цього потрібна історія. Метрики, що варто вести в часі:

    • Pass rate — частка зелених. Різке падіння — сигнал регресії або зламаного оточення.
    • Flaky rate — частка тестів, що зеленіють лише з ретраю. Росте — сюїта гниє.
    • Час прогону (duration) — повзе вгору? Час думати про паралелізацію (див. главу «Паралелізація»).
    • Escape rate — баги, що проскочили тести й знайшлися вже в проді. Найчесніша метрика цінності сюїти.

    Саме тренди перетворюють звіт з разового артефакту на інструмент керування якістю. Загальні метрики здоров'я автоматизації й коли зупинитися — у главі «Стратегія автоматизації з нуля»; класичні метрики тестування взагалі (щільність дефектів, час життя) — у розділі «Основи тестування».

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

    • Виглядає як «звіт є — там написано 27 failed», а насправді без артефактів це не звіт, а лічильник. Звіт має вести до першопричини, а не лише повідомляти факт падіння.
    • Виглядає як баг продукту, а насправді баг тесту: крихкий локатор чи гонка. Симптом — руками флоу працює, тест падає. Лікується тестом, не баг-репортом.
    • Виглядає як «треба збирати трейс і відео скрізь, для надійності», а насправді це роздуває час прогону в рази. Важкі артефакти — тільки на падінні або ретраї.
    • Виглядає як дбайливість — «алертимо на кожен червоний тест», а насправді це шум, від якого команда глухне. Сигнал — лише нове падіння на захищеній гілці.
    • Виглядає як зелений прогін = все добре, а насправді тести могли позеленіти з третього ретраю, маскуючи флак. Дивіться на flaky rate, а не лише на фінальний колір.
    • Виглядає як «інфра впала — перезапустимо, і забули», а насправді повторювані інфра-фейли — теж дефект, тільки процесу/стенду; їх треба рахувати, а не ховати ретраями.

    Підсумок

    • Звіт — це продукт із різними читачами: інженеру потрібні артефакти, ліду — тренди, релізу — один вердикт. Один формат на всіх не працює.
    • Артефакт фейлу (скриншот/відео/трейс/логи) дає змогу встановити причину без повторного запуску; важкі артефакти збирають вибірково — на падінні або ретраї.
    • Червоний тест не дорівнює багу продукту. Тріаж сортує падіння на три корзини — баг продукту / баг тесту / інфраструктура — і в кожної свій власник.
    • Перед баг-репортом на продукт відтвори сценарій руками: часто падає тест, а не застосунок.
    • Нотифікація має нести сигнал, а не шум: алерт на нове падіння захищеної гілки, маршрутизований до власника, зі зведенням і лінком на звіт.

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

    • «Тест впав у CI. Твої дії?» — Інтервʼюер перевіряє, чи є у вас алгоритм тріажу, а не паніка. Сильна відповідь: відкрити артефакти (трейс/скриншот/логи), відтворити руками, класифікувати — баг продукту / баг тесту / інфра — і діяти за корзиною, а не одразу заводити баг.
    • «Які артефакти збираєте при падінні й чому не завжди?» — Дивляться на розуміння ціни: трейс і відео важкі, тому on-failure/on-first-retry; скриншот дешевий. Плюс — що саме дає trace viewer.
    • «Як відрізнити баг продукту від бага тесту?» — Ключове: стабільність відтворення, ручний флоу, артефакт як арбітр. Згадка «фейл тесту ≠ баг застосунку» — сильний сигнал зрілості.
    • «Як звітуєте про результати команді?» — Тут перевіряють, чи розумієте ви різних читачів і проблему шуму: різні зрізи, алерт на зміну стану, інтеграція з TMS/дашбордом.
    • «Що таке flaky rate / escape rate і навіщо тренд?» — Чи мислите ви звітом у часі, а не знімком; чи знаєте метрику реальної цінності сюїти (escape rate).

    Джерела