Звітність: артефакти, тріаж, тренди
Зміст
Автотести запустилися, ран завершився, на дашборді — «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): якщо канал пищить на кожен ран, у тому числі на відомий флак і на нічні інфра-збої, команда перестає читати сповіщення взагалі. Тоді справжня регресія тоне серед шуму.
Механізм найкраще описаний не в літературі про тести, а в книзі Google SRE — про чергування, і від першої особи: «Every time the pager goes off, I should be able to react with a sense of urgency. I can only react with a sense of urgency a few times a day before I become fatigued». Одна термінологічна чесність: сам вислів alert fatigue у тій книзі стоїть лише у виносці, як посилання на працю «в іншому контексті», а в тілі розділу вжита інша назва — alert spam, «as they are rarely read or acted on». Тобто термін засвідчений, але не введений цим джерелом.
Замість гасла «сигнал, а не шум» звідти ж можна взяти три перевірні критерії: «Every page should be actionable»; «Every page response should require intelligence. If a page merely merits a robotic response, it shouldn't be a page»; «Pages should be about a novel problem or an event that hasn't been seen before». Це про продакшн-чергування, і перенос на CI-нотифікації наш — але критерії переносяться майже без правок.
Що відрізняє сигнал від шуму:
- Алертити на зміну стану, а не на факт. Важливо не «є червоні тести», а «на
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, аніdefect leakageне трапляються в жодному з наших джерел, включно з повними силабусами ISTQB (там є сусідня, але інша метрика —Defect Detection Percentage). Саме явище джерелами описане: Google пише про «legitimate bug escapes that were ignored because of the noise». На співбесіді краще описати метрику, ніж покластися на те, що термін упізнають.
Саме тренди перетворюють звіт з разового артефакту на інструмент керування якістю. Загальні метрики здоров'я автоматизації й коли зупинитися — у главі «Стратегія автоматизації з нуля»; класичні метрики тестування взагалі (щільність дефектів, час життя) — у розділі «Основи тестування».
Типові помилки
- Виглядає як «звіт є — там написано 27 failed», а насправді без артефактів це не звіт, а лічильник. Звіт має вести до першопричини, а не лише повідомляти факт падіння.
- Виглядає як баг продукту, а насправді баг тесту: крихкий локатор чи гонка. Симптом — руками флоу працює, тест падає. Лікується тестом, не баг-репортом.
- Виглядає як «треба збирати трейс і відео скрізь, для надійності», а насправді це роздуває час прогону в рази. Важкі артефакти — тільки на падінні або ретраї.
- Виглядає як дбайливість — «алертимо на кожен червоний тест», а насправді це шум, від якого команда глухне. Сигнал — лише нове падіння на захищеній гілці.
- Виглядає як зелений прогін = все добре, а насправді тести могли позеленіти з третього ретраю, маскуючи флак. Дивіться на flaky rate, а не лише на фінальний колір.
- Виглядає як «інфра впала — перезапустимо, і забули», а насправді повторювані інфра-фейли — теж дефект, тільки процесу/стенду; їх треба рахувати, а не ховати ретраями.
Підсумок
- Звіт — це продукт із різними читачами: інженеру потрібні артефакти, ліду — тренди, релізу — один вердикт. Один формат на всіх не працює.
- Артефакт фейлу (скріншот/відео/трейс/логи) дає змогу встановити причину без повторного запуску; важкі артефакти збирають вибірково — на падінні або ретраї.
- Червоний тест не дорівнює багу продукту. Тріаж сортує падіння на три категорії — баг продукту / баг тесту / інфраструктура — і в кожної свій власник.
- Перед баг-репортом на продукт відтвори сценарій руками: часто падає тест, а не застосунок.
- Нотифікація має нести сигнал, а не шум: алерт на нове падіння захищеної гілки, маршрутизований до власника, зі зведенням і лінком на звіт.
Можливі питання
- «Тест впав у CI. Твої дії?» — Інтервʼюер перевіряє, чи є у вас алгоритм тріажу, а не паніка. Сильна відповідь: відкрити артефакти (трейс/скріншот/логи), відтворити руками, класифікувати — баг продукту / баг тесту / інфра — і діяти за категорією, а не одразу заводити баг.
- «Які артефакти збираєте при падінні й чому не завжди?» — Дивляться на розуміння ціни: трейс і відео важкі, тому
on-failure/on-first-retry; скріншот дешевий. Плюс — що саме дає trace viewer. - «Як відрізнити баг продукту від бага тесту?» — Ключове: стабільність відтворення, ручний флоу, артефакт як арбітр. Згадка «фейл тесту ≠ баг застосунку» — сильний сигнал зрілості.
- «Як звітуєте про результати команді?» — Тут перевіряють, чи розумієте ви різних читачів і проблему шуму: різні зрізи, алерт на зміну стану, інтеграція з TMS/дашбордом.
- «Що таке flaky rate / escape rate і навіщо тренд?» — Чи мислите ви звітом у часі, а не знімком; чи знаєте метрику реальної цінності сюїти (escape rate).
Джерела
Звіт як продукт: хто його читає
- ISTQB® CTAL-TAE Syllabus v2.0 — §6.1: логи звітом не є; звіт про прогрес
mustмістити результати, інформацію про SUT і опис оточення у форматі, придатному для кожної групи стейкхолдерів, і його зміст явно дозволено робити різним для різних отримувачів. - ISTQB® CTFL Syllabus v4.0.1 — §5.3: два різні звіти — регулярний
test progress reportі одноразовийtest completion reportза шаблоном, з підсумком, відхиленнями від плану, метриками й засвоєними уроками; шаблони обох стандарт виносить в ISO/IEC/IEEE 29119-3.
Артефакти фейлу: скріншот, відео, трейс, логи
- Playwright — Trace viewer — що саме лежить у трейсі: використаний локатор і тривалість кожної дії, DOM-знімки до й після, мережеві запити з кодами, консоль, метадані оточення; це інструмент
post-mortem-розбору, і завантажується він повністю в браузері. - Playwright — Best Practices — політика збору: для падінь у CI дока радить трейс замість відео й скріншотів, записувати його
shouldна першому ретраї, а вмикати на кожен тест не рекомендує через вартість. - ISTQB® CTAL-TAE Syllabus v2.0 — §6.1: перелік джерел даних (логи SUT, логи фреймворку як аудиторський слід, логи збірки й , скріншоти й записи екрана) і шість рівнів логування, де
errorвалить тест-кейс, аwarn— ні.
HTML-звіти й Allure (оглядово)
- Playwright — Reporters — репортери не взаємовиключні: людський вивід у термінал і машинний файл вмикають одночасно;
JUnit-XML це формат обміну для CI, а HTML — самодостатня тека, яку можна віддати вебсторінкою. - Allure Report — History and retries — що саме додає надбудова: історія (між звітами) і ретраї (усередині одного) — різні речі, звʼязування прогонів іде через унікальний ідентифікатор тесту, тож перейменування рве історію.
- Playwright — Reporters — технічний канал інтеграції:
JUnit-XML як формат обміну, який і читають зовнішні системи. - ISTQB® CTAL-TAE Syllabus v2.0 — §6.1: звіт публікується всім релевантним стейкхолдерам, а зміст і рівень деталізації різняться залежно від отримувача — TMS тут один із таких отримувачів.
Тріаж: баг продукту / баг тесту / інфраструктура
- ISTQB® CTAL-TAE Syllabus v2.0 — §6.1: статусів три, а не два —
passed/failed/TAS failure(дефект не в SUT, а в самому рішенні автоматизації), плюсinconclusive; процедура тріажу теж названа — чи траплялося раніше, на якому кроці впало, чи збігається стан SUT з очікуваним. - Allure Report — Categories — той самий поділ, вбудований в інструмент: Product errors (
failed) проти Test errors (broken), причому результат належить рівно одній категорії. - Jest — Setup and Teardown — перше питання діагностики у формулюванні доки ранера: чи падає тест, коли він єдиний у прогоні.
- xUnit Test Patterns — Erratic Test — той самий маркер під власною назвою:
Interacting Tests.
Нотифікації: сигнал замість шуму
- Google SRE Book — Monitoring Distributed Systems — механізм втоми від сповіщень від першої особи й три перевірні критерії: «Every page should be actionable», відповідь має вимагати осмислення, а не роботизованої реакції, і проблема має бути новою; друга назва явища —
alert spam, бо такі сповіщення «are rarely read or acted on». - ISTQB® CTAL-TAE Syllabus v2.0 — §6.1: кому саме адресується вердикт — звіт публікується релевантним стейкхолдерам, зміст різниться за отримувачем.
Тренди: звіт у часі, а не знімок
- ISTQB® CTAL-TAE Syllabus v2.0 — §6.1: звітність потребує аналітики попередніх прогонів, щоб показувати тренди (наприклад зміну частки успішних тестів), а історія дає статистику про тести з частими регресіями.
- Allure Report — History and retries — технічна деталь, яку часто пропускають: історія не зʼявляється сама — теку
historyтреба перенести з попереднього звіту. - Google Testing Blog — Flaky Tests at Google — чому тренд важливіший за колір останнього прогону: 84 % переходів «зелений → червоний» виявлялися флаком, а темп появи флаку дорівнює темпу лагодження (
trust: secondary, dec-0710).
Відео до теми
Що таке артефакт фейлу і навіщо він потрібен?
Артефакт — це доказ стану, який тест зберігає в мить падіння, щоб причину можна було знайти без повторного запуску. Це головне: у 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) — це стан, коли канал сповіщень пищить так часто й на такі дрібниці, що команда просто перестає його читати. Найкраще формулювання механізму — з книги Google SRE, від першої особи: «I can only react with a sense of urgency a few times a day before I become fatigued». Термінологічна деталь: сам вислів у тій книзі стоїть лише у виносці, а в тілі розділу вжито alert spam — сповіщення, які «are rarely read or acted on». Виникає вона, коли алертять на кожен ран підряд: на відомий флак, на нічні інфра-збої, на стабільно червоний тест. Проблема в тому, що серед цього шуму тоне справжня регресія — те єдине падіння, заради якого сповіщення й існують. Тобто надмірні алерти не підвищують пильність, а вимикають її: канал сам вчить себе ігнорувати. Лікується це не гучністю, а відбором: сповіщення має нести сигнал, а не факт, і будити людей лише тоді, коли справді щось нове й важливе зламалося на захищеній гілці.
На що варто алертити, а на що ні?
Правило перше — алертити на зміну стану, а не на факт: важливо не «є червоні тести», а «на захищеній гілці з'явилися нові падіння, яких учора не було». Стабільно червоний карантинний тест не має будити нікого, і тест, що позеленів з другого ретраю, — теж не привід для сповіщення, інакше канал вчиться ігнорувати себе. Друге — маршрутизувати сповіщення до власника: падіння в чекауті йде команді чекауту, а не всім підряд; персональна адресація підвищує шанс, що фейл полагодять, а не залишать «комусь». Третє — агрегувати: одне повідомлення «12 fail, 3 нові, ось звіт» замість дванадцяти окремих, і обов'язково з лінком на HTML/Allure, щоб від сигналу можна було одразу провалитися в деталі. Різні розклади мають різну гучність: PR-фейл бачить лише автор PR, нічний ран шле зведення в канал, реліз-gate — найголосніший.
Чому «звіт як продукт» означає, що один формат на всіх не працює?
Бо той самий прогін дивляться кілька ролей, і кожній потрібне своє. Авторові тесту потрібна точна причина падіння — трейс, скріншот, стек; агреговані відсотки йому марні. Тімліду навпаки — тренд pass rate, флак і час прогону, а деталі кожного фейлу зайві. Реліз-менеджеру взагалі треба одна відповідь: gate зелений чи ні. Продакту важливий стан покриття критичних сценаріїв, а не технічні артефакти. Тому звітність — це кілька зрізів одних і тих самих даних: детальний HTML з артефактами для інженерів, коротка нотифікація для команди, тренд у дашборді для ліда, статус у TMS для менеджменту. Свідомо спроєктований під читача звіт дає рішення за хвилину; «звіт як вийде» змушує кожного шукати своє вручну.
Що таке flaky rate та escape rate і навіщо дивитися на них у часі?
Це метрики, які перетворюють звіт зі знімка на інструмент керування якістю. Flaky rate — частка тестів, що зеленіють лише з ретраю; коли вона росте, сюїта гниє, і зелений фінальний колір це маскує, бо тест міг пройти з третьої спроби. — баги, що проскочили тести й знайшлися вже в проді; це найчесніша метрика реальної цінності сюїти, бо показує, скільки дефектів вона насправді ловить. Назва — наша робоча, не галузевий стандарт: у наших джерелах, включно з повними силабусами ISTQB, її немає (там є інша метрика — Defect Detection Percentage), тож на співбесіді описуйте суть, а не сподівайтеся на впізнавання терміна. Дивитися на них у часі важливо, бо один прогін відповідає лише на «зелено чи ні», а тренд — на «нам стає краще чи гірше». Разом із 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 і чому канал, який пищить на все, вчить себе ігнорувати; знаю три критерії пейджа з книги Google SRE — дієвий, вимагає осмисленої реакції, про нову проблему.
- Знаю принципи сигналу: алерт на зміну стану захищеної гілки, маршрутизація до власника, агрегація, лінк на звіт.
- Розумію, що відомий і , що позеленів, — не привід будити команду.
Тренди
- Можу назвати ключові метрики в часі: pass rate, flaky rate, duration, — що сигналить кожна і чому escape rate найчесніша.
- Розумію, чому зелений прогін не завжди «все добре»: тести могли позеленіти з ретраю, маскуючи — дивись на flaky rate.
Квіз
Перед стартом
- Питань: 12
- Поріг «зараховано»: ≥70% правильних відповідей.
- Результат впливає на прогрес; завалені питання підуть у чергу повторення.
- Квіз впливає на компліт теми: тема стає «пройдено», лише коли прочитано теорію І квіз складено на ≥70%.
Питання
Що таке артефакт фейлу і навіщо він потрібен?



