Представьте: вы заходите в рабочий чат, а там коллега пишет — "Смотри, что я нашёл и прикрутил к нашим тестам! Кажется, у нас с покрытием беда." И кидает скриншот.

Естественно, у вас начинается внутренняя буря. Как? В смысле? Я пять лет клепал эти пять тысяч тест-кейсов, автоматизировал их с любовью и болью, а тут — «не всё покрыто»? Это что вообще за инструмент? Зачем ты мне это показал? Убери это немедленно. А потом вы просыпаетесь в холодном поту — вроде бы это был сон... но нет. Это реальность. И, возможно, даже к лучшему.

В этой статье я расскажу про ui-coverage-scenario-tool — новую версию инструмента, построенного на базе оригинального ui-coverage-tool. Первая версия уже была чем-то вроде прозрения: инструмент, который позволял впервые по-настоящему осознанно писать UI-тесты и видеть, что они действительно покрывают. Подробно про первую версию можно почитать вот тут.

Но сегодня не про прошлое, а про настоящее. Инструмент ui-coverage-scenario-tool — это всё та же основа, концепция и ядро, что и в оригинальном инструменте: измерение покрытия UI-тестами и наглядная визуализация. Но теперь — с совершенно новой суперспособностью: привязка покрытия к сценариям, тест-кейсам в TMS и даже к документации. Больше никаких абстрактных “эти элементы покрыты”, теперь всё по-взрослому: вот сценарий, вот шаги, вот что реально проверяется, а что — мимо.

Честно говоря, даже первая версия была эволюцией, и, скажем прямо, аналогов у неё не было и нет. А новая — ещё на голову выше. В ней появилось столько киллер-фич, что иногда самому страшно.

Короче, поехали. Будет интересно.

Зачем второй инструмент?

Хороший вопрос. Зачем вообще нужен ещё один инструмент измерения покрытия, если уже есть ui-coverage-tool, и он, черт возьми, классный? Он показывает покрытие тестами прямо на живом приложении — уже круто.

ui-coverage-tool прост в своей сути: он показывает, какие именно элементы на странице были задеты тестами. А дальше вы уже сами делаете выводы — где пробелы, какие проверки стоит добавить, где у нас "ну вот прям никто и не смотрел". Инструмент лёгкий, как перышко: обвязка на Python / TypeScript/JavaScript, быстрая интеграция, и отчёт — всё просто и прозрачно. Подключается куда угодно и как угодно. За пять минут — и вы уже видите, как ваши тесты реально работают.

А вот теперь на сцену выходит ui-coverage-scenario-tool. Он уже посложнее — как по отчёту, так и по интеграции. Но и возможности у него другие. Здесь в центре — сценарии. Каждый сценарий — это не просто "тест пошёл и кликнул", а последовательность действий, в которых участвуют элементы. То есть ui-coverage-scenario-tool — это следующий уровень. Он не просто показывает, что кнопка была нажата. Он показывает, в каком именно сценарии, в каком контексте, какие сценарии через неё прошли, и даже позволяет подсветить этот элемент прямо из сценария.

И да, есть связка с тест-кейсами, документацией, бизнес-требованиями — всё, чтобы видеть реальную картину: не просто "где кликали", а "зачем кликали и насколько это вообще важно".

Короче говоря:

  • ui-coverage-tool — лёгкий, удобный, быстрый, для базового покрытия и быстрой обратной связи.

  • ui-coverage-scenario-tool — продвинутый, более "умный", ориентирован на сценарии и бизнес-логику. Но и требует чуть больше усилий при внедрении.

Оба инструмента — нужны. Именно поэтому я не стал лепить из них Франкенштейна, а сделал два отдельных проекта. Потому что и задачи у них разные, и использовать их можно по-разному.

В чем суть

Главная фишка ui-coverage-scenario-tool — это не просто "покрытие UI", а покрытие в разрезе сценариев. Инструмент строит внятную хронологию действий, которую реально можно анализировать и использовать. Всё просто, как автоматизация логина:

  • Запустился тест — начало сценария

  • Пошли клики, заполнения, проверки — каждое действие сохраняется в JSON и привязывается к сценарию

  • Тест закончился — сценарий закрыт, данные зафиксированы

В результате мы получаем структурированную, удобную, и (не побоюсь этого слова) интеллигентную модель: сценарии → действия → элементы.

И, внимание, никакой черной магии. Никаких хаков, monkey patch-ей, инжектов в браузер, рефлексии и прочей боли. Просто логирование действий в JSON. Настолько тупо и просто, что работает идеально.

Минимальная обвязка, максимальная польза

Сборщик покрытий — это не какая-то сложносочинённая библиотека с миллионом зависимостей. Это тонкий слой, который можно интегрировать за 5 минут и не страдать. Он не ломает тесты. Он не влезает в ваш фреймворк. Он просто фиксирует, что вы сделали и когда.

И именно за счёт этого:

  • интеграция быстрая,

  • портирование на другие языки — плёвое: вот пример для Python, а вот для TypeScript,

  • производительность высокая — JSON-ки сохраняются почти AS IS, без постобработки.

Независимость отчёта

А теперь самое мощное: отчёт вообще не знает, на чём написаны ваши тесты. Он — самодостаточный. Загрузили в него данные + минимальные настройки — и всё, вы уже можете видеть, как работает покрытие.

Это даёт безумную гибкость:

  • Хотите писать тесты на Java + Selenium — пожалуйста

  • Используете Playwright на TypeScript — не проблема

  • У вас три команды с разными стеками? Все смогут работать с одним отчётом

А теперь главное: сценарный подход = новый уровень анализа

Мы не просто видим, какие элементы кто-то случайно затронул. Мы видим, какой сценарий зашёл на страницу, что он с ней делал, и можем:

  • найти пересечения между тестами,

  • понять, какие куски интерфейса никто не трогает,

  • и переосмыслить, как вообще у нас устроены тесты.

Это больше не просто "UI покрытие". Это сценарный интеллект нашей тестовой системы. Новый уровень. Новый стандарт.

Как выглядит отчёт?

Давайте без лирики — сразу к сути. Вся мощь и магия инструмента, конечно же, в его отчёте. И начнём мы именно с него.

Overview

В самом верху отчёта — несколько виджетов, дающих базовую информацию: настройки, графики, общее количество уникальных элементов, количество взаимодействий со страницей, и большой чарт с историей действий. Этот чарт — прям центр наблюдений: можно наглядно видеть, какие проверки выполняются, какие не трогались совсем, и как это меняется со временем. Удобно, чтобы отслеживать прогресс (или регресс).

Сценарии

Чуть ниже — сердце отчёта: интерактивный фрейм, в котором отображается сайт, и сайд-панель со списком сценариев. По умолчанию выбраны все сценарии — это значит, что на странице будут подсвечены все элементы, с которыми взаимодействовали тесты. Но если нужно — можно выбрать только конкретные сценарии и наглядно увидеть пересечения между ними.

Фреймом можно управлять:

  • фильтровать действия,

  • переключать настройки,

  • обновлять или очищать фрейм,

  • и даже скрыть сайд-панель, чтобы просто включить режим “показать все” и не отвлекаться на сценарии.

Погружение в сценарий

Дальше — ещё интереснее. Каждый сценарий можно открыть в деталях, и вот тут начинается настоящий кайф для тестировщика. Название сценария, ссылка на TMS, документацию или любую внешнюю систему — всё это можно указать. Это значит, что вы можете связать реальные шаги покрытия с бизнес-логикой.

Дальше — список шагов: Можно видеть, что делал тест. Но не просто “в логах” — при нажатии на иконку глазика рядом с шагом, в фрейме подсветится конкретный элемент, с тултипом: тип действия, локатор и всё, что нужно. Это не просто “шаги”, это — живое взаимодействие на реальном сайте, шаг за шагом. Прямо как дебаг, только в визуальной форме.

Каждый элемент в шаге — это:

  • тип действия (click, visible и т.д.),

  • номер шага,

  • локатор,

  • тип локатора.

И всё это можно фильтровать и искать: например, показать только шаги с кликами, или найти элемент по локатору.

А ниже — блок с статистикой по действиям в рамках сценария: сколько было кликов, сколько проверок видимости, и всё это ещё и наглядно в виде таблицы. А также чарт с историей действий в рамках сценария.

Детали по элементу: сразу всё и на месте

При нажатии на баджик рядом с элементом — открывается модалка с деталями покрытия. Что внутри?

  • Общая информация по взаимодействию с этим элементом,

  • И самое главное — список всех сценариев, которые хоть как-то с ним контактировали.

И вот это уже килер-фича. Потому что прямо тут видно: сколько сценариев “прошло” через элемент, кто с ним что делал, и можно быстро понять, где какие пересечения. Причём не надо лазить по спискам, искать сценарии вручную. Всё уже перед нами: кликнули по элементу → получили список сценариев → ткнули в любой → смотрим детали → если надо — прыгнули в TMS. Быстро. Удобно. И эффективно.

Фрейм — штука гибкая

В нём можно крутить и вертеть как хочешь:

  • Zoom — увеличивай/уменьшай масштаб фрейма. Особенно полезно, если смотрим мобильную версию или хочется отдалиться/приблизиться.

  • Цвета — меняются на лету. Если у нас сайт светлый, и подсветка не видна — просто берем и меняем цвета подсветки и баджиков. Настройки под себя — наше всё.

А теперь ещё одна киллер-фича — настройка контента внутри баджика. Инструмент позволяет наглядно видеть разные типы аналитики по элементу. Всё это доступно прямо в интерфейсе и включается в один клик:

  • Total number of actions — сколько раз вообще элемент трогали (клики, чеки, вся активность).

  • Total number of scenarios — сколько разных сценариев взаимодействовали с элементом. Например, если выбрали 3 сценария и 2 из них трогают одну кнопку — бум, у нас уже пересечение.

  • Total number of action types — сколько типов действий было по элементу (нажали, проверили видимость, и так далее).

Всё это настраивается без магии и костылей, прямо во фрейме. Включили нужное, получили аналитику, сделали выводы. Прямо как и должно быть.

Все остальное

Важно: все настройки — зум, фильтры, отображение, цвета и прочее — сохраняются автоматически. То есть один раз всё под себя настроили, и больше не надо каждый раз прокликивать заново. Настроили и забыли. Как и должно быть.

Ну и конечно, не обошлось без других вкусностей:

  • Быстрые и гибкие фильтры,

  • Поддержка тёмной темы — если мы не из этих любителей белых экранов,

  • Поддержка нескольких приложений одновременно — идеальное решение для распределённых команд, работающих с разными UI. Все тесты можно объединить в единый, наглядный отчёт,

  • И, что немаловажно — адаптивный и просто реально быстрый UI, который не тормозит даже на жирных отчётах.

Всё это вместе — делает отчёт не просто полезным, а по-настоящему удобным инструментом анализа, который хочется использовать.

Какие проблемы закрывает?

Кейсов может быть куча. Всё зависит от хотелок, бизнес-контекста и уровня фантазии. Но давайте по порядку. Вот где этот инструмент реально заходит на ура:

Анализ текущего состояния тестов

В голове у нас, конечно, всё красиво: "Да у нас всё покрыто, вообще всё, от и до!". А потом включаем отчёт и... бах — половина элементов даже не нюхала никакого теста. Ни разу. Никем. Никогда. Этот инструмент — прямой способ слезть с розовых очков. Каждый не покрытый элемент — это потенциальный "привет, баг, как дела?". И мы его либо увидим сейчас, либо потом словим в проде. Выбор за вами.

Обнаружение пересечений

Вот классика: два теста, вроде бы разные, называются по-разному, даже шаги чуть разные... А по факту делают одно и то же. Почему? Ну, кто-то "так сделал", кто-то "не знал", кто-то "копипастнул". Короче, если у вас тестов больше, чем пальцев на руках — шанс найти дубли просто запредельный. Именно здесь инструмент начинает светиться: показывает, кто где пересекается, и даёт шанс навести порядок. Ну или хотя бы перестать городить копии.

Понимание рисков при изменениях

Планируется рефакторинг страницы? Отлично. Открываем отчёт — а там на кнопку, которую хотят переделать, завязано 130 тестов. Сто тридцать, Карл! И мы уже не просто в панике, а конструктивно подходим к разработчику: "Слушай, если вы тут всё поломаете, у нас отъедет целый автопарк тестов. Давайте хотя бы data-test-id поставим, чтобы не откапывать потом это поле где-нибудь в error-логе CI." Согласитесь, гораздо эффективнее, чем ловить падения вслепую.

Ответы на “вечные” вопросы

Классическая сцена: врывается проджект с глазами по пять рублей и спрашивает —
"Слушай, а у нас поиск на главной точно тестируется? А фильтры? А сортировка? А вообще главная?" И мы вместо привычного "эээ… ну вроде да… где-то… наверное…" просто открываем отчёт, показываем элементы, сценарии, взаимодействия — и готово. Ответ не просто есть — он объективный, проверяемый и наглядный. И самое главное — никакой лжи себе и другим. Всё честно.

Осознанное тестирование (внезапно)

Будем откровенны. В 90% компаний автотесты — это про “лишь бы были”. В CI воткнули, галочка горит, все довольны. Вот только они ни на что особо не влияют. Инструмент ui-coverage-scenario-tool не спасёт ваши процессы, давайте честно. Но он покажет всю подноготную: какие тесты у вас есть, какие бесполезны, а какие вроде бы есть, но ничего не проверяют.

И мы внезапно узнаем, что у нас после создания сущности никто даже не проверяет, а действительно ли она появилась. Или что половина элементов на странице как стояли без внимания, так и стоят.

Прозрение? Да.
Поздновато? Тоже да.
Но лучше поздно, чем в проде с багом.

Ревью тестов без боли (и с пониманием)

Открываем MR: 1500 строк новых тестов. Прекрасно. Вдох. Выдох. Паника. Но вместо того чтобы вручную пытаться выудить смысл из каждой строчки, мы просто открываем отчёт покрытия и видим: что реально покрыто, какие элементы задействованы, какие сценарии отработали.

И вдруг всплывает "мелочь" — целый кусок новой страницы вообще никто не трогал. А ведь фича — жирная. Значит, забыли. Шанс упустить что-то важное? Без инструмента — 99%. С ним — уже можно работать головой, а не гадать по чайным листьям коммитов.

Доступность для бизнеса (да, серьёзно)

Часто ли ваш проджект или аналитик заглядывает в ваши отчёты по автотестам? Конечно же нет. И правильно делает — потому что отчёты скучные, непонятные и выглядят как распечатка из терминала 1995 года.

Но теперь — другое дело. Вместо унылого текста "кликаем туда, вводим это" — интерактив, визуализация, живая карта покрытия. Можно не просто прочитать, а потрогать, посмотреть, понять. И, внезапно, у бизнеса появляется идея: "А почему вы не тестируете вот этот фильтр? Мы же на нём теряем половину конверсии!" То есть, внимание: бизнес сам хочет тестов. Не мы их уговариваем — они приходят к нам.

Обоснование перед бизнесом

Типичная история:
— Мы хотим редизайн.
— Окей, но там 130 тестов завязано.
— Это сколько?
— 130.
— А это много?
— Ну, это типа дофига.
— Ага.

С отчётом всё иначе. Показываешь красиво: "Вот страница, вот 130 тестов, вот интерактивная карта, вот куда они жмут". И сразу видно: если редизайнить, то всё отвалится. Не навсегда, но временно. И мы не побираемся с аргументами — мы показываем. Хотите редизайн? Делайте. Просто заложите время, потому что вот наглядно видно — будет боль. И да, иногда отчёт говорит сам за себя настолько убедительно, что тебе даже рот открывать не надо. Всё понятно и так.

Развитие тестовой культуры (ну а куда деваться)

Как объяснить команде, что ваши автотесты — это не просто «магия в CI», а реальная защита продукта? Показать отчёт. Пусть фронтендеры увидят: вот, их компонент покрыт, вот сюда жмут, а вот сюда — никогда. И сразу пойдёт в ход:
 — «Давайте добавим тест!»
 — «А может я тебе data-test-id расставлю?»
 — «О, у нас сценарий на этот попап забыт!»

Короче, видимость рождает понимание. А понимание — уважение. И мы из "того чела, который тесты пишет" становимся партнёром, который помогает всей команде не падать в баги лицом.

Использование на ретро (да, отчёт тоже может туда ходить)

Вот собрались вы на ретроспективу, и опять звучит классика:
 — «У нас баг выехал в прод, как так вышло?»
 — «Ну, мы же вроде тестировали…»
 — «А где тестировали?»
 — «Ну… где‑то… наверно…»

А тут мы достаём отчёт — как карту поля боя: «Смотрите. Вот фича. Вот 24 элемента. Вот что покрыто, вот что нет. А вот баг — ровно в том месте, где тестов 0.» Моментальная ясность. Никаких «вроде», только факты. И сразу разговор переходит из «кто виноват» в «что улучшим». Так что да, отчёт может делать ретро честнее и полезнее, и на всякий случай — нагляднее, чем стикеры на доске.

Планирование (а вот это прям must-have)

Когда вы планируете спринт и решаете, что тестировать, что покрывать, а где можно и на проде посмотреть, теперь у вас есть не просто “чуйка” или “на глаз”, а реальные данные.

Открываете отчёт — и вот:

  • Тут 80% сценариев уже есть — можно не трогать.

  • Тут дыра — вообще никто не кликает по фильтру.

  • Тут 20 сценариев делают одно и то же — может, пора почистить?

Больше не нужно спорить «где тонко» — теперь это видно. А если кто‑то скажет «зачем писать ещё тесты?», можно просто повернуть экран и сказать: «Вот. Тут. Пусто. Всё ещё не надо?». Короче, отчёт превращает планирование в нормальный инженерный процесс, а не в «угадай, где больно».

Онбординг новых людей

Представьте: пришёл новый автоматизатор. Вы ему говорите: «У нас тут 1500 тестов, 60 фич, куча компонентов, давай, вливайся.». Его реакция:...

А теперь представьте другую сцену: вы открываете UI coverage-отчёт, показываете одну страницу — и за 2 минуты человек понимает:

  • что уже покрыто,

  • что часто используется,

  • где дыры,

  • и где можно сразу влиться и сделать вклад, а не ковыряться неделями в чужом коде.

Вывод? Инструмент —это ещё и навигатор для новичков. Не просто «читай документацию», а «вот визуальная карта тестовой вселенной».

Переосмысление автотестов

А теперь на философском уровне. Инструмент заставляет по-новому взглянуть на автотесты. Не как на строчки кода, которые “ну вроде бы что-то проверяют”, а как на живые сценарии, которые реально ходят по интерфейсу, трогают кнопки, читают текст, влияют на продукт.

И когда ты видишь это визуально, когда ты можешь ткнуть в каждый элемент и понять — кто, когда и зачем его трогал — у тебя появляется желание писать тесты не для отчётности, а для пользы.

Это не просто инструмент для тестов — это зеркало того, как работают ваши тесты. И, возможно, лучший способ понять, где вы как команда теряете контроль.

Как использовать?

Всё максимально просто. Инструмент можно использовать в любом фреймворке и на любом языке. В примерах ниже будет Python, но под TypeScript/JavaScript тоже всё готово — вот пример для JS/TS. Если пишете на чём-то своём — не проблема, обвязка тривиальна и пишется за вечер.

Шаг 1. Установка

pip install ui-coverage-scenario-tool

Шаг 2. Настройка

Подробная инструкция по конфигурации — в документации, но по сути всё сводится к одному параметру.

Например, настройка через .env может выглядеть вот так:

UI_COVERAGE_SCENARIO_APPS='[
    {
        "key": "ui-course",
        "url": "https://nikita-filonov.github.io/qa-automation-engineer-ui-course/#/auth/login",
        "name": "UI Course",
        "tags": ["UI", "COURSES"],
        "repository": "https://github.com/Nikita-Filonov/qa-automation-engineer-ui-course"
    }
]'

И всё. Это обязательный минимум. Остальные переменные — опциональны, и чаще всего трогать их не нужно. По умолчанию всё работает из коробки.

Шаг 3. Использование

После настройки инструмента можно использовать его прямо внутри тестов. Ниже — базовый пример с использованием Playwright и отслеживанием действий пользователя:

from playwright.sync_api import sync_playwright

# Импортируем основные компоненты инструмента:
# - UICoverageTracker — главный класс для отслеживания покрытия
# - SelectorType — тип селектора (CSS, XPATH)
# - ActionType — тип действия (CLICK, FILL, CHECK_VISIBLE и т.д.)
from ui_coverage_scenario_tool import UICoverageTracker, SelectorType, ActionType

# Создаём экземпляр трекера.
# Значение `app` должно совпадать с ключом из переменной UI_COVERAGE_SCENARIO_APPS
tracker = UICoverageTracker(app="my-ui-app")

with sync_playwright() as playwright:
    browser = playwright.chromium.launch()
    page = browser.new_page()
    page.goto("https://my-ui-app.com/login")

    # Начинаем сценарий:
    # - url: ссылка на тест-кейс в TMS или документации
    # - name: человеко-понятное название сценария
    tracker.start_scenario(
        url="http://tms.com/test-cases/1",
        name="Successful login"
    )

    # Взаимодействие с input логина
    username_input = page.locator("#username-input")
    username_input.fill('user@example.com')

    # Отмечаем это действие в покрытии
    tracker.track_coverage(
        selector='#username-input',  # Селектор элемента
        action_type=ActionType.FILL,  # Тип действия: ввод текста
        selector_type=SelectorType.CSS  # Тип селектора: CSS
    )

    # Взаимодействие с кнопкой логина
    login_button = page.locator('//button[@id="login-button"]')
    login_button.click()

    # Отмечаем клик в покрытии
    tracker.track_coverage(
        selector='//button[@id="login-button"]',
        action_type=ActionType.CLICK,
        selector_type=SelectorType.XPATH
    )

    # Завершаем сценарий — сохраняем все собранные данные
    tracker.end_scenario()

Использование через фикстуру (лучше для реальных проектов)

На практике начало и конец сценария удобно выносить в pytest-фикстуру:

from typing import Generator, Any

import pytest
from playwright.sync_api import Page
from ui_coverage_scenario_tool import UICoverageTracker

from pages.authentication.login_page import LoginPage


# Фикстура для трекера покрытия UI
@pytest.fixture
def ui_coverage_tracker(request) -> Generator[UICoverageTracker, Any, None]:
    tracker = UICoverageTracker(app="ui-course")

    # Начинаем сценарий: название берём из имени теста
    tracker.start_scenario(url=None, name=request.node.name)
    
    yield tracker

    # Завершаем сценарий после выполнения теста
    tracker.end_scenario()

# Фикстура, возвращающая страницу логина с трекером внутри
@pytest.fixture
def login_page(page: Page, ui_coverage_tracker: UICoverageTracker) -> Generator[LoginPage, Any, None]:
    return LoginPage(page, ui_coverage_tracker)

Далее можно использовать внутри PageObject:

from playwright.sync_api import Page
from ui_coverage_scenario_tool import UICoverageTracker, SelectorType, ActionType


class LoginPage:
    def __init__(self, page: Page, tracker: UICoverageTracker):
        self.page = page
        self.tracker = tracker

        self.username_input = page.locator("#username-input")
        self.password_input = page.locator("#password-input")
        self.login_button = page.locator("//button[@id='login-button']")

    def fill_username(self, value: str) -> None:
        self.username_input.fill(value)
        self.tracker.track_coverage(
            selector="#username-input",
            action_type=ActionType.FILL,
            selector_type=SelectorType.CSS
        )

    def fill_password(self, value: str) -> None:
        self.password_input.fill(value)
        self.tracker.track_coverage(
            selector="#password-input",
            action_type=ActionType.FILL,
            selector_type=SelectorType.CSS
        )

    def click_login(self) -> None:
        self.login_button.click()
        self.tracker.track_coverage(
            selector="//button[@id='login-button']",
            action_type=ActionType.CLICK,
            selector_type=SelectorType.XPATH
        )

А если вы вдруг проснулись сегодня с особенно изощрённым желанием всё автоматизировать — можете сделать кастомный маппинг, который будет сам вытаскивать ID тест-кейса из воздуха (или из TMS, если повезёт). В общем, ограничений здесь никаких: хотите — делайте как удобно, хотите — как неудобно, лишь бы работало. Фантазия — единственный лимит.

Если хочется прям пример с претензией на элегантность — добро пожаловать в статью, где мы аккуратно интегрировали всё это безумие с PageFactory. Главное, не забудьте:

  • До теста — запустить сценарий,

  • После теста — завершить сценарий,

  • Внутри теста — трекаем действия.

А дальше — как вашей душе угодно и как вписывается в ваши процессы. Хотите руками, хотите в хуках, хотите через проклятия и шаманские пляски — инструмент справится.

Шаг 4. Отчет

После прогона тестов в папке coverage-results появятся файлы с результатами покрытия. Лезть туда руками, что-то править или дописывать — не надо. Всё уже готово. Чтобы сгенерировать отчёт — выполняем одну единственную команду:

ui-coverage-scenario-tool save-report

После этого у вас появляются три артефакта:

  • index.html — сам отчёт, красивый, интерактивный, прямо в браузере открывается;

  • coverage-history.json — история покрытия;

  • coverage-report.json — машинно-читаемый отчет, можно закинуть в лог или в дашборд CI/CD.

На этом всё. С точки зрения автотестов вы свободны как ветер. Установили, подключили, настроили — и отдыхаете. Особенно круто работает в связке с PageFactory — покрытие ложится туда как родное. Очень советую заглянуть вот в эту статью — там про это подробно.

Шаг 5. Агент

Но есть один нюанс. Если вы думаете, что после генерации отчёта он прям сразу начнет показывать покрытие поверх страницы — расслабьтесь, такого чуда не будет. Чтобы покрытие отображалось на сайте, нужно встроить один маленький агент в HTML. Делается просто:

<script src="https://nikita-filonov.github.io/ui-coverage-scenario-report/agent.global.js"></script>

Вот и всё. Добавили — работает. Безопасно ли это? Ну, во-первых, да. Во-вторых, весь код открыт. Не доверяете? Форкните, скачайте себе агент, проверьте, перезапеките — делайте что угодно, лишь бы вам спалось спокойно. Хотя если вы подозреваете вредоносное ПО в скрипте, который трекает click, может, вам стоит удалить ещё и Google Analytics, Яндекс Метрику, Bootstrap, React DevTools, Hotjar и прочих «шпионов».

А если серьёзно — скрипт минимальный, ничего никуда не отправляет, работает локально и делает одну задачу: показывает вам, что тест реально делал на странице. Всё.

Почему это уникально?

Ну, хотя бы потому что такого раньше просто не было. Серьёзно. Это первая (и пока что единственная) попытка в сторону настоящей эволюции измерения покрытия UI-тестами. Если угодно — первая ветвь на дереве, которое только начинает расти.

Да, кто-то что-то когда-то пробовал. Но обычно всё упиралось в странные реализации, тяжёлые снапшоты, боль при настройке или полную невозможность адаптировать под реальный проект или разные фреймворки. А потом всё это благополучно отправлялось в архив на GitHub под меткой no longer maintained.

А тут — просто HTML-файл. Открывается на чём угодно: GitHub Pages, GitLab Pages, Allure, прямо из IDE или с десктопа. Хотите — запускайте хоть на микроволновке с поддержкой браузера. Весит от 800 КБ до 1.1 МБ. То есть для визуального отчёта — почти пушинка.

Вместо тяжёлых снапшотов по 10 MB, как это модно в старших кругах, инструмент работает напрямую со страницей. Под капотом — протокол postMessage, поэтому элементы на странице подсвечиваются почти мгновенно. И никаких танцев с бубном: открыл сайт, открыл отчёт — и вуаля, всё живое, всё интерактивное.

Плюс — он не привязан ни к чему вообще. Ни к фреймворку, ни к языку, ни к структуре проекта. Хотите обвязку на Python — пожалуйста. Предпочитаете TypeScript — тоже есть. Используете Rust, Bash, Excel с макросами? Неважно. Главное — чтобы вы могли сохранить JSON и добавить скрипт на страницу.

Вот тут будут ссылки на готовые обвязки:

Этот инструмент — не импровизация на коленке, а результат нескольких сотен экспериментов, фейлов, проб, боли, отчаяния и наконец — здравого смысла. Смотрел на снапшоты, на скриншоты, на плагины, на внутренности других тулов... и в итоге сделал то, что просто работает.

Если где-то и есть что-то похожее — дайте знать, я искренне хочу посмотреть. Но, спойлер: пока не встречал ни одного решения, которое одновременно:

  • работает сразу,

  • не заставляет менять архитектуру проекта,

  • и вообще не зависит от языка, фреймворка или «модного стека года».

Почему это лучше, чем то, что есть сейчас?

Начнём с простого: а что вообще есть сейчас? Обычно — ничего. Ну вот прям совсем. UI покрытие? Где? Кто? Когда? Тишина. Тесты вроде есть, UI вроде есть, но как это всё между собой связано — уже загадка.

Иногда, конечно, кто-то из лучших побуждений прикручивает TMS. Красиво, формально, по-взрослому. Только вот проблема: TMS показывает то, что мы сами себе придумали. Условный пример: у нас 100 тест-кейсов, из них 70 автоматизировано. Ура, 70% покрытия! Осталось автоматизировать 30, и будет целых 100%. Победа?

Ну, не совсем. Потому что эти 100 кейсов мы придумали сами. А если бы действительно описали всё поведение интерфейса, то их могло бы быть 500. Или 1000. То есть фактическое покрытие — не 70%, а 7%. Просто считать это не очень удобно, особенно когда хочется красивые графики в отчёте.

А теперь зайдём с другой стороны. Допустим, у вас продвинутый процесс: никаких ручных кейсов, только автотесты. Что тогда? Тогда у вас всегда 100% покрытия. Потому что считать больше нечего. Вот он — полный контроль... над своим воображением.

Проблема в том, что всё это — про кейсы, а не про реальное поведение системы. TMS никак не связана с интерфейсом. Она не знает, с какими кнопками работали тесты, какие поля реально трогались, какие сценарии запускались. В худшем случае — вы вручную прописали шаги. В лучшем — шаги добавились автоматически, и теперь их страшно читать.

А теперь внимание: ui-coverage-scenario-tool (как и его предшественник ui-coverage-tool) показывает реальное покрытие. Не гипотетическое, не «по документам», а на настоящем интерфейсе, на живом проекте. Прямо в браузере, визуально, красиво и прозрачно.

И ещё один момент, который хочется обводкой, жирным и капслоком — актуальность. Изменился UI? Ок, запустили тесты заново — и у нас новое покрытие. Не надо руками ничего обновлять, не надо в TMS заходить и добавлять новый шаг. Потому что как только вы забыли это сделать — всё, покрытие устарело, доверие потеряно, метрика умерла. А мёртвые метрики, как известно, только места в отчётах занимают.

В итоге

Покрытие UI-тестами — вещь, о которой все говорят, но почти никто не измеряет. А если и измеряет, то по старинке, через Excel, TMS или на глаз. Это как считать шаги, не надевая шагомер.

ui-coverage-scenario-tool — это как шагомер, но для UI-тестов. Он показывает, с чем именно взаимодействуют ваши тесты, что осталось в тени, и главное — делает это автоматически. Без ручного труда, без вымышленных цифр, без «по ощущениям».

Это не очередной инструмент ради красивого дашборда. Это инструмент, который ставит зеркало перед вашим UI-покрытием — и показывает, есть ли там что-то, кроме отражения.

Вопрос не в том, нужно ли вам измерять покрытие. Вопрос в том, хотите ли вы знать правду.

Весь исходный код инструмента вы можете найти на моем GitHub: