Звітність: артефакти, тріаж, тренди
Зміст
Автотести запустилися, ран завершився, на дашборді — «27 failed». Що далі? Хтось має відкрити цей результат, зрозуміти, що зламалося, і вирішити, чи можна релізити. Саме тут більшість молодих сюїт розсипається: тести є, а от звіту, з якого видно причину падіння за хвилину, а не за годину, — немає. Червоний прогін без артефактів (artifacts) — це не сигнал, а загадка: доводиться перезапускати локально, вгадувати крок, ловити стан. Ціна автоматизації окупається не в момент написання тесту, а в момент, коли впав чужий тест о третій ночі й треба швидко зрозуміти, хто винен.
Ключова ідея цієї глави — звіт як продукт. У нього є користувачі з різними потребами, є мета (дати рішення про реліз і привести до першопричини), і його треба свідомо проєктувати, а не отримувати «як вийде». Це канонічна глава про звітність на сайті: інші глави (флакі-тести, паралелізація, стратегія з нуля) посилаються сюди. Її можна пропустити при першому проході — щоб написати перший робочий тест, звітність не потрібна. Але щойно сюїта переростає десяток тестів і починає падати «іноді», без цих речей ви потонете в шумі.
Звіт як продукт: хто його читає
Перша помилка — думати, що звіт читає одна людина. Насправді той самий прогін дивляться кілька ролей, і кожній потрібне своє. Один HTML-файл на всіх не працює: інженеру мало «pass rate», а менеджеру не треба trace viewer.
| Читач | Що йому треба | Що для нього шум |
|---|---|---|
| Автор тесту / AQA | Точна причина падіння: трейс, скриншот, стек | Агреговані відсотки |
| Розробник фічі | Артефакт, що вказує на регресію в його коді | Внутрішня механіка тесту |
| Тімлід / QA lead | Тренд: pass rate, флак, час прогону | Деталі кожного окремого фейлу |
| Реліз-менеджер | Одна відповідь: gate зелений чи ні | Усе інше |
| Продакт / бізнес | Стан покриття критичних сценаріїв | Технічні артефакти |
Звідси практичний висновок: звітність — це кілька зрізів одних і тих самих даних. Детальний HTML-звіт з артефактами — для інженерів; коротка нотифікація «main зламався, 3 нові фейли» — для команди; тренд у дашборді — для ліда; статус у 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-раннер, скінчилися ресурси, протух токен. Дія: перезапустити / полагодити оточення; ні продукт, ні тест чіпати не треба.
Чому цей поділ настільки важливий: без нього команда або заводить фальшиві баги на розробників (і втрачає їхню довіру), або, навпаки, списує реальні регресії на «та то знову флак» — і пропускає їх у прод. Тріаж — це рутинний ритуал після кожного червоного прогону, а не героїзм.
Як розрізняти на практиці — по артефактах і історії:
Практичне правило з реального досвіду: перш ніж заводити баг на продукт, відтвори сценарій руками або попроси це зробити. Дуже часто «баг застосунку» виявляється тестом, який шукає елемент у пласкому списку без оновлення сторінки, — падає тест, а не 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).
Джерела
- ISTQB Certified Tester Foundation Level (CTFL) 4.0 Syllabus — розділ 5.3 «Test Monitoring, Test Control and Test Completion» (моніторинг, звітність, test completion report).
- ISO/IEC/IEEE 29119-3 — Test documentation — формати тестової документації, зокрема test status report і test completion report.
- Playwright — Reporters — вбудовані репортери (list, html, junit) і конфігурація.
- Playwright — Trace viewer — збір і читання трейсів як артефактів падіння.
- Allure Report — документація — надбудовний звіт з історією, категоріями й трендами.
Що таке артефакт фейлу і навіщо він потрібен?
Артефакт — це доказ стану, який тест зберігає в мить падіння, щоб причину можна було знайти без повторного запуску. Це головне: у CI тест часто падає на воркері, який відразу гаситься, і відтворити той самий стан локально вже неможливо — лишається тільки те, що тест устиг записати. Тому червоний прогін без артефактів перетворюється на здогадки: перезапусти, вгадай крок, спробуй зловити стан. Практичне правило звучить жорстко: якщо падіння не лишає доказу причини, тест зробив лише половину роботи. Цінність автоматизації окупається не тоді, коли тест написаний, а тоді, коли о третій ночі впав чужий тест і треба за хвилину зрозуміти, хто винен.
Які основні типи артефактів збирають при падінні тесту?
Чотири, від найдешевшого до найважчого. Скриншот — знімок сторінки в момент невдалого assert; миттєво відповідає на «що було на екрані»: правильна сторінка, модалка поверх кнопки, порожній список. Відео — запис усього сценарію; показує послідовність кроків, тому рятує, коли причина за кілька дій до самого assert. Трейс (trace) — найпотужніший: часова шкала тесту зі знімком DOM на кожній дії, мережею, консоллю й аргументами викликів, яку постфактум можна «перемотати». Логи — консоль браузера, серверний лог, мережа у форматі HAR; консольна помилка JS чи серверний стектрейс нерідко пояснюють падіння напряму. Скриншот дешевий і часто достатній, трейс і відео дорогі за диском і часом.
Чому не варто збирати трейс і відео на кожному тесті?
Бо важкі артефакти коштують дорого, і на масштабі ця ціна б'є по всій сюїті. Трейс пише знімки DOM і мережу на кожній дії, відео тримає запис усього прогону — на тисячах тестів це роздуває і час виконання, і сумарний розмір артефактів у рази. Тому їх вмикають вибірково: скриншот можна only-on-failure, а трейс — on-first-retry. Логіка ретраю тут елегантна: перший прогін іде легким, без важкого трейсу; якщо тест упав і пішов на повтор — трейс уже пишеться саме для того запуску, який відтворив проблему. Виходить дешево для стабільних тестів і щедро для проблемних — і ви маєте повний доказ рівно там, де він потрібен.
Що таке репортер і які його бувають різновиди?
Репортер (reporter) — компонент ранера, що перетворює сирі результати прогону в читабельний для людини або машини формат. Консольні репортери (list, line, dot) друкують прогрес прямо в термінал — це зручно для локальної роботи й для логів CI. Файлові генерують окремий артефакт-звіт: html дає самодостатню сторінку з деревом тестів і вкладеними скриншотами, відео та трейсами, а junit — XML у стандартному форматі, який розуміє майже будь-яка CI-система чи дашборд. На практиці їх комбінують: людям віддають HTML, машині — XML для парсингу. Тобто в одному конфізі спокійно живуть кілька репортерів одночасно.
Що показує trace viewer такого, чого не дасть скриншот?
Скриншот фіксує один кадр — стан екрана в мить падіння; trace viewer дає всю історію тесту, яку можна прокрутити крок за кроком. Трейс тримає знімок DOM на кожній дії, мережеві запити, консоль і аргументи кожного виклику, тож постфактум видно не лише «що зламалося», а й «на якому саме кроці й чому». Це перетворює безпорадне «тест упав» на конкретне «на цьому кроці кнопка ще була disabled, а тест уже клікнув». Для тріажу це часто вирішальний доказ: трейс показує, що елемент був на місці, але тест не дочекався його активного стану — і корзину видно одразу. Саме тому трейс — центральний інструмент розбору флаку.
Чим Allure відрізняється від вбудованого HTML-звіту?
Вбудований HTML відповідає на питання «що впало прямо зараз»: дерево тестів, артефакти, статус останнього прогону. Allure — це надбудовний шар звітності поверх результатів будь-якого ранера, який додає вимір часу: історію прогонів із трендом pass rate, автоматичні категорії дефектів, деталізовані кроки й розбивку за фічами. Працює він окремим кроком — тести пишуть проміжні дані, а команда Allure збирає з них статичний сайт-звіт. Простіше кажучи, рідний HTML знає лише сьогоднішній стан, Allure — ще й як сюїта падала останній місяць. Вибір між ними — це вибір між простотою й історією: маленькій сюїті вистачає HTML, а потреба в трендах приходить із масштабом.
Навіщо зв'язувати автотести з TMS?
Звіт живе недовго — до наступного прогону, — а результати часто треба прив'язати до конкретних тест-кейсів у системі керування тестами (TMS): Testomatio, TestRail, Xray. Це дає три речі: менеджмент бачить живий стан покриття («які задокументовані сценарії зелені прямо зараз»), автотест і ручний кейс стають однією сутністю замість двох паралельних списків, а історія результатів кейса не губиться між ранами. Механіка проста: кожен тест маркують ідентифікатором кейса, а спеціальний репортер після прогону шле статуси через API. Так автоматизація перестає бути «річчю в собі» й вливається в загальну картину покриття, стаючи каналом, яким автотести доповідають свій статус у матрицю трасування.
Червоний тест — це завжди баг застосунку?
Ні, і плутати ці речі — найдорожча помилка новачка. Червоний тест означає лише, що щось не збіглося з очікуванням, а причина може лежати у трьох різних місцях. Може бути справжній баг продукту — тоді тест зробив свою роботу і треба заводити дефект. Може бути баг тесту — крихкий локатор, гонка без правильного очікування, застаріле очікуване значення, погана ізоляція даних; тут лагодять тест, а не турбують розробника. А може бути інфраструктура — впав стенд, недоступна БД, таймаут мережі, протух токен; тоді не винні ні продукт, ні тест. Тому кожне падіння спершу тріажать в одну з трьох корзин, бо в кожної свій власник і свій ремонт.
Як на практиці відрізнити баг тесту від бага продукту?
Головний прийом — відтворити сценарій руками (або попросити когось), перш ніж заводити баг на розробника. Якщо той самий флоу вручну теж ламається — це кандидат на баг продукту, іди в баг-репорт. Якщо руками все працює, а тест падає — підозра зміщується на сам тест: крихкий локатор, гонка, застаріле значення, не та фікстура. Другий критерій — стабільність відтворення: тест, що миготить (зелений/червоний без змін коду), майже завжди флак, тобто баг тесту, а не регресія. Арбітром виступає артефакт: трейс покаже, що кнопка була на місці, але тест клікнув раніше, ніж вона стала активною. Дуже часто «баг застосунку» виявляється тестом, який шукає елемент без оновлення сторінки, — падає тест, а не app.
Як упізнати інфраструктурний фейл і чому його важливо відділяти?
Інфраструктурний фейл — це коли не винні ні продукт, ні тест: середовище лежить, база недоступна, мережа відвалилась, впав CI-раннер, скінчилися ресурси або протух токен. Упізнають його за характером помилки — таймаути з'єднання, коди 5xx, DNS-збої, «немає БД» — і за масовістю: якщо одразу після релізу червоніє півсюїти з 502/503/504, це радше стенд у процесі деплою, ніж раптова регресія в багатьох місцях. Дія тут — перезапустити чи полагодити оточення, не чіпаючи ні код продукту, ні тести. Відділяти цю корзину критично: інакше команда або заводить фальшиві баги на розробників, або ховає повторювані інфра-збої під ретраями. А повторюваний інфра-фейл — теж дефект, лише процесу чи стенду, і його треба рахувати, а не замітати.
Інтерв'юер питає: «Тест упав у CI. Твої дії?» Що відповісти?
Тут перевіряють, чи є в тебе алгоритм тріажу, а не паніка чи рефлекс «одразу заводжу баг». Сильна відповідь — покроково. Спершу відкрити артефакти: трейс, скриншот, логи — подивитися, на якому кроці й з якою помилкою впало. Далі глянути на сам запит або дію: чи правильно все зібралося, чи не протух токен, чи те середовище. Потім відтворити сценарій руками — це відсіює баги тесту від багів продукту. І аж тоді класифікувати падіння в одну з трьох корзин (продукт / тест / інфра) і діяти за корзиною: баг-репорт, фікс тесту або перезапуск стенду. Ключова дисципліна — не заявляти причину без доказу: «схоже на баг бекенда, стектрейс указує на конкретний контролер» вартує рівно стільки, скільки під ним артефактів.
Що таке alert fatigue і чому вона небезпечна для команди?
Втома від алертів (alert fatigue) — це стан, коли канал сповіщень пищить так часто й на такі дрібниці, що команда просто перестає його читати. Виникає вона, коли алертять на кожен ран підряд: на відомий флак, на нічні інфра-збої, на стабільно червоний карантинний тест. Проблема в тому, що серед цього шуму тоне справжня регресія — те єдине падіння, заради якого сповіщення й існують. Тобто надмірні алерти не підвищують пильність, а вимикають її: канал сам вчить себе ігнорувати. Лікується це не гучністю, а відбором: сповіщення має нести сигнал, а не факт, і будити людей лише тоді, коли справді щось нове й важливе зламалося на захищеній гілці.
На що варто алертити, а на що ні?
Правило перше — алертити на зміну стану, а не на факт: важливо не «є червоні тести», а «на захищеній гілці з'явилися нові падіння, яких учора не було». Стабільно червоний карантинний тест не має будити нікого, і тест, що позеленів з другого ретраю, — теж не привід для сповіщення, інакше канал вчиться ігнорувати себе. Друге — маршрутизувати сповіщення до власника: падіння в чекауті йде команді чекауту, а не всім підряд; персональна адресація підвищує шанс, що фейл полагодять, а не залишать «комусь». Третє — агрегувати: одне повідомлення «12 fail, 3 нові, ось звіт» замість дванадцяти окремих, і обов'язково з лінком на HTML/Allure, щоб від сигналу можна було одразу провалитися в деталі. Різні розклади мають різну гучність: PR-фейл бачить лише автор PR, нічний ран шле зведення в канал, реліз-gate — найголосніший.
Чому «звіт як продукт» означає, що один формат на всіх не працює?
Бо той самий прогін дивляться кілька ролей, і кожній потрібне своє. Авторові тесту потрібна точна причина падіння — трейс, скриншот, стек; агреговані відсотки йому марні. Тімліду навпаки — тренд pass rate, флак і час прогону, а деталі кожного фейлу зайві. Реліз-менеджеру взагалі треба одна відповідь: gate зелений чи ні. Продакту важливий стан покриття критичних сценаріїв, а не технічні артефакти. Тому звітність — це кілька зрізів одних і тих самих даних: детальний HTML з артефактами для інженерів, коротка нотифікація для команди, тренд у дашборді для ліда, статус у TMS для менеджменту. Свідомо спроєктований під читача звіт дає рішення за хвилину; «звіт як вийде» змушує кожного шукати своє вручну.
Що таке flaky rate та escape rate і навіщо дивитися на них у часі?
Це метрики, які перетворюють звіт зі знімка на інструмент керування якістю. Flaky rate — частка тестів, що зеленіють лише з ретраю; коли вона росте, сюїта гниє, і зелений фінальний колір це маскує, бо тест міг пройти з третьої спроби. Escape rate — баги, що проскочили тести й знайшлися вже в проді; це найчесніша метрика реальної цінності сюїти, бо показує, скільки дефектів вона насправді ловить. Дивитися на них у часі важливо, бо один прогін відповідає лише на «зелено чи ні», а тренд — на «нам стає краще чи гірше». Разом із pass rate і часом прогону ці дві метрики показують здоров'я автоматизації: різке падіння pass rate — сигнал регресії, повзучий duration — привід думати про паралелізацію, а зростання flaky rate чи escape rate — що сюїті потрібен ремонт, а не нові тести.
Три кейси, де звітність вирішує, чи дійдете ви до причини за хвилину чи за годину: конфіг Playwright, який збирає важкі артефакти лише там, де вони потрібні, розбір червоного нічного прогону за трьома корзинами тріажу, і перетворення шумного алерта на сигнал. Скрізь — що дивитися і чому.
Кейс 1. Playwright: артефакти й репортери під бюджет
Мета — щоб кожен фейл лишав доказ причини, але сюїта не тонула в гігабайтах трейсів. Скриншот дешевий, тож його можна на кожне падіння; трейс і відео важкі, тож лише на ретраї. Репортери розводимо за читачем: людям — HTML, машині CI — JUnit XML, у термінал — короткий список.
// playwright.config.ts
import { defineConfig } from '@playwright/test';
export default defineConfig({
retries: process.env.CI ? 2 : 0,
use: {
screenshot: 'only-on-failure', // дешево — можна на кожне падіння
video: 'retain-on-failure', // важко — тримаємо лише коли впав
trace: 'on-first-retry', // найважче — вмикаємо аж на повторі
},
reporter: [
['list'], // прогрес у термінал CI
['html', { open: 'never' }], // для інженерів — дерево + артефакти
['junit', { outputFile: 'results.xml' }],// для CI/дашборда — XML
],
});
Що дивитися і чому:
on-first-retry— це компроміс ціни й доказу. Перший прогін іде легким, без трейсу; якщо тест упав і пішов на повтор — трейс пишеться саме для того запуску, що відтворив проблему. Стабільним тестам це нічого не коштує, проблемним дає повний доказ.only-on-failureдля скриншота, а неon. Знімок на кожному кроці зеленого тесту — це диск на вітер; цінність скриншота саме в мить невдалого assert.- Кілька репортерів одночасно — норма.
htmlнечитабельний для машини,junitнечитабельний для людини; тому дашборд парсить XML, а інженер відкриває HTML з вкладеним трейсом. Один формат обидві задачі не закриває. retriesбез артефактів на ретраї — напівзахід. Повтори маскують флак, аtrace: 'on-first-retry'натомість його документує: видно, чому саме перша спроба впала.
Кейс 2. Тріаж червоного нічного прогону
Ранок, нічний ран показує «27 failed». Паніка тут — найгірша стратегія; потрібен ритуал сортування. Не заводимо 27 багів на розробників і не списуємо все на «та то флак» — розкладаємо падіння по трьох корзинах, у кожної свій власник.
| Симптом у прогоні | Що показує артефакт | Корзина | Дія |
|---|---|---|---|
12 фейлів з 502/таймаутом, усі стартували о 02:14 | лог: стенд у деплої | Інфраструктура | Перезапустити ран, полічити інфра-збій |
| Тест миготить: червоний, на ретраї зелений | трейс: клік раніше за активний стан кнопки | Баг тесту (флак) | Карантин + правильне очікування |
| Локатор не знайшов кнопку, руками вона є | трейс: кнопка на місці, змінився data-testid | Баг тесту | Полагодити локатор |
| Чекаут повертає порожній кошик, руками теж | відео: товар зникає після переходу | Баг продукту | Баг-репорт на команду чекауту |
Розбір колонки за колонкою:
- Спершу відсіюємо інфру за масовістю й часом. Дюжина фейлів з однаковою мережевою помилкою, що почалися в одну хвилину, — це майже завжди стенд, а не 12 регресій одночасно. Перезапуск часто зеленить половину табло, і на реальний тріаж лишається менше.
- Миготіння — маркер флаку, тобто бага тесту. Якщо без зміни коду тест то падає, то ні, шукати баг у продукті марно; трейс покаже гонку — дію раніше, ніж елемент став готовим.
- «Руками теж ламається» — єдиний квиток у баг-репорт. Поки ручний флоу відтворює проблему, це кандидат на продукт; поки працює — підозра на тест. Артефакт тут арбітр: він відрізняє «кнопки не було» від «тест не дочекався».
- Правило дешевше за помилку. Один фальшивий баг на розробника коштує довіри до всієї сюїти; одна прогавлена регресія під приводом «знову флак» їде в прод. Тому тріаж — рутина після кожного червоного рана, а не героїзм.
Кейс 3. Нотифікація: сигнал замість шуму
Той самий прогін можна доставити двома способами. Перший вчить команду ігнорувати канал, другий — приводить потрібну людину прямо до причини.
ШУМ — по повідомленню на кожен фейл, у загальний канал:
[FAIL] checkout smoke #1
[FAIL] checkout smoke #2
[FAIL] login flaky (retry)
[FAIL] nightly infra timeout
... ще 23 рядки ...
СИГНАЛ — одне зведення, лише про нове, з адресацією і лінком:
main зламався: 3 НОВІ падіння (24 відомих флак/інфра приховано)
→ checkout: cart empties after redirect @team-checkout
Звіт: https://ci.example.com/report/8421 Трейси всередині.
Що дивитися і чому:
- Алерт на зміну стану, а не на факт. Важливо не «є червоні тести», а «на
mainз'явилися три падіння, яких учора не було». Стабільно червоний карантинний тест і ретрай, що позеленів, у сигнал не потрапляють — інакше канал сам себе привчає до сліпоти. - Маршрутизація до власника.
@team-checkoutзамість «усім» різко підвищує шанс, що фейл полагодять, а не залишать «комусь». Персональна адресація — це і відповідальність, і швидкість. - Агрегація плюс лінк. Одне повідомлення замість 27 і посилання на HTML/Allure, щоб від сигналу можна було одразу провалитися в трейс. Мета сповіщення — привести до причини, а не просто налякати числом.
- Гучність за розкладом. PR-фейл достатньо показати автору в самому PR; нічний ран шле зведення в командний канал; блокуючий реліз-gate — найголосніший сигнал. Однакова гучність на все — це і є шум.
Звіт як продукт
- Можу назвати щонайменше три ролі, що читають один прогін, і сказати, що потрібне кожній: інженеру — артефакти, ліду — тренди, релізу — один вердикт.
- Розумію, чому один HTML на всіх не працює, і що звітність — це кілька зрізів одних і тих самих даних, а не один файл.
Артефакти фейлу
- Можу пояснити, навіщо взагалі артефакт: встановити причину без повторного запуску, бо стан на погашеному воркері не відтворити.
- Знаю чотири типи артефактів (скриншот, відео, трейс, логи) і чим кожен корисний.
- Розумію, чим трейс потужніший за скриншот: знімок DOM на кожній дії, мережа, консоль, можливість «перемотати» тест постфактум.
- Можу пояснити, чому важкі артефакти (трейс, відео) збирають вибірково, а не завжди — вони роздувають час прогону й розмір на масштабі.
- Розумію логіку
on-first-retry: перший прогін легкий, трейс пишеться лише коли тест уже пішов на повтор.
Репортери й звіти
- Знаю різницю між консольним репортером (
list,dot) і файловим (html,junit), для кого кожен і навіщо їх комбінують. - Розумію, чим Allure відрізняється від вбудованого HTML: історія прогонів, категорії дефектів, тренд у часі проти «що впало зараз».
TMS та трасування
- Можу пояснити, навіщо зв'язувати автотести з TMS: живий стан покриття, одна сутність замість двох списків, історія результатів кейса.
- Знаю механіку інтеграції: тест маркують ID кейса, репортер після прогону шле статуси через API.
Тріаж падінь
- Тримаю в голові головне правило: червоний тест не дорівнює багу продукту.
- Знаю три корзини тріажу (баг продукту / баг тесту / інфраструктура) і що в кожної свій власник та своя дія.
- Можу відрізнити баг тесту від бага продукту: стабільність відтворення, ручний флоу, артефакт як арбітр.
- Знаю ознаки інфра-фейлу (таймаути,
5xx, DNS, немає БД, масовість після релізу) і що чинити треба стенд, а не код.
Нотифікації без шуму
- Можу пояснити, що таке alert fatigue і чому канал, який пищить на все, вчить себе ігнорувати.
- Знаю принципи сигналу: алерт на зміну стану захищеної гілки, маршрутизація до власника, агрегація, лінк на звіт.
- Розумію, що відомий флак і ретрай, що позеленів, — не привід будити команду.
Тренди
- Можу назвати ключові метрики в часі: pass rate, flaky rate, duration, escape rate — що сигналить кожна і чому escape rate найчесніша.
- Розумію, чому зелений прогін не завжди «все добре»: тести могли позеленіти з ретраю, маскуючи флак — дивись на flaky rate.
Навіщо тест зберігає артефакт у момент падіння?
Питання
Що таке артефакт фейлу і навіщо він потрібен?