Чтобы ничего не забыть, команда сначала перечисляет, что в приложении должно продолжать работать: поверхности — экраны, кнопки, формы, поля — и их состояния. Одна и та же кнопка ведёт себя по-разному, когда всё хорошо, когда данных нет и когда случилась ошибка; защитить нужно каждый такой случай отдельно.
Покрытие — это ответ на вопрос «что у нас уже под защитой, а что нет». Не «сколько у нас тестов», а «какие места приложения эти тесты действительно оберегают». Разница большая: десятки тестов могут ходить по одному экрану и не заходить на соседний.
Инвентарь
Инвентарь покрытия — это список, где одна строка означает одну поверхность в одном состоянии. Например: «кнопка оформления заказа — обычное состояние», «список заказов — пусто», «форма входа — неверный пароль».
В строке видно три вещи: какие тесты её покрывают, кто за неё отвечает и откуда она взялась. Происхождение бывает трёх видов — добавлено вручную, найдено обходом или предложено агентом. Это не формальность: ручные записи команда считает своими, и автоматика их не трогает.
Три состояния строки
У каждой строки ровно одно из трёх состояний:
- Покрыто — есть хотя бы один тест, который её защищает.
- Не покрыто — строка есть, тестов нет.
- Сознательно не покрыто — команда решила это не проверять.
Сознательный отказ — это не пустая ячейка, а зафиксированное решение. Для него обязательны причина и дата пересмотра: например, причина «устаревший экран, запланированный к удалению» и дата, когда к решению вернутся. Продукт не примет половину решения — без причины или без даты строка не сохранится. Зачем это нужно: через полгода видно, что перед вами осознанный выбор команды, а не забытая запись.
Прогресс к цели
В настройках проекта задаётся цель — сколько сочетаний «поверхность × состояние» команда хочет закрыть. По ней на вкладке строится линия прогресса: «покрыто из цели 20». Считаются именно пары «поверхность и её состояние», а не число тестов: один тест может закрыть сразу несколько строк, а может не закрыть ни одной. Цель показывает реальную защищённость, а не количество файлов.
Рядом видно, что изменилось с прошлой сборки: сколько строк добавилось, сколько закрылось, сколько перешло в «сознательно не покрыто». Так заметно, движется ли работа или стоит на месте.
Свои некрасивые состояния
Есть состояния, до которых тяжело добраться: пользователь с именем в 120 символов, выключенный флаг функции, картинка, которая не загрузилась, отклонённый платёж. Их часто не тестируют не потому, что это неважно, а потому что неудобно. Такие случаи можно быстро сложить в отдельную очередь — ввести поверхность и состояние обычным текстом — и вернуться к решению позже.
Пока руки не дошли, эти строки честно лежат в инвентаре непокрытыми. Это лучше, чем делать вид, что их нет: проблема на виду и ждёт решения.
Предложение теста
Если строку нечем закрыть, агента можно попросить набросать покрывающий тест. Он появится на строке как предложение: видно, какой тест предлагается и почему. Ничего не записывается, пока человек предложение не примет; принятие создаёт тест и привязывает его к строке.
Отклонить предложение можно, но обязательно с причиной — чтобы потом было понятно, почему тест не взяли. И отдельно: тест становится покрывающим не в момент создания, а после прогона, который это докажет. До прогона строка остаётся незакрытой.
Что не перезаписывается
Инвентарь наполняется и руками, и обходом браузера. Правило простое: обход добавляет только новые строки. Если строку с такой же поверхностью и состоянием уже заполнили вручную, обход её не тронет — ни тестов, ни ответственного, ни решения не изменит. Иначе автоматика затирала бы решения команды, и инвентарю нельзя было бы доверять.
Дальше: как посмотреть, из каких адресов состоит приложение, — в разделе Карта приложения и обход.