---
title: "Покрытие"
id: "2064"
type: "page"
slug: "coverage"
published_at: "2026-09-28T14:26:44+00:00"
modified_at: "2026-09-28T14:59:37+00:00"
url: "https://pastukhov.com/agents/test/docs/coverage"
markdown_url: "https://pastukhov.com/agents/test/docs/coverage.md"
excerpt: "Чтобы ничего не забыть, команда сначала перечисляет, что в приложении должно продолжать работать: поверхности —…"
---

# Покрытие

[https://pastukhov.com/agents/test/docs/coverage.md](https://pastukhov.com/agents/test/docs/coverage.md)

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

**Покрытие** — это ответ на вопрос «что у нас уже под защитой, а что нет». Не «сколько у нас тестов», а «какие места приложения эти тесты действительно оберегают». Разница большая: десятки тестов могут ходить по одному экрану и не заходить на соседний.

## Инвентарь

Инвентарь покрытия — это список, где **одна строка означает одну поверхность в одном состоянии**. Например: «кнопка оформления заказа — обычное состояние», «список заказов — пусто», «форма входа — неверный пароль».

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

## Три состояния строки

У каждой строки ровно одно из трёх состояний:

- **Покрыто** — есть хотя бы один тест, который её защищает.
- **Не покрыто** — строка есть, тестов нет.
- **Сознательно не покрыто** — команда решила это не проверять.

Сознательный отказ — это не пустая ячейка, а зафиксированное решение. Для него обязательны причина и дата пересмотра: например, причина «устаревший экран, запланированный к удалению» и дата, когда к решению вернутся. Продукт не примет половину решения — без причины или без даты строка не сохранится. Зачем это нужно: через полгода видно, что перед вами осознанный выбор команды, а не забытая запись.

## Прогресс к цели

В настройках проекта задаётся цель — сколько сочетаний «поверхность × состояние» команда хочет закрыть. По ней на вкладке строится линия прогресса: «покрыто из цели 20». Считаются именно пары «поверхность и её состояние», а не число тестов: один тест может закрыть сразу несколько строк, а может не закрыть ни одной. Цель показывает реальную защищённость, а не количество файлов.

Рядом видно, что изменилось с прошлой сборки: сколько строк добавилось, сколько закрылось, сколько перешло в «сознательно не покрыто». Так заметно, движется ли работа или стоит на месте.

## Свои некрасивые состояния

Есть состояния, до которых тяжело добраться: пользователь с именем в 120 символов, выключенный флаг функции, картинка, которая не загрузилась, отклонённый платёж. Их часто не тестируют не потому, что это неважно, а потому что неудобно. **Такие случаи можно быстро сложить в отдельную очередь** — ввести поверхность и состояние обычным текстом — и вернуться к решению позже.

Пока руки не дошли, эти строки честно лежат в инвентаре непокрытыми. Это лучше, чем делать вид, что их нет: проблема на виду и ждёт решения.

## Предложение теста

Если строку нечем закрыть, агента можно попросить набросать покрывающий тест. Он появится на строке как **предложение**: видно, какой тест предлагается и почему. Ничего не записывается, пока человек предложение не примет; принятие создаёт тест и привязывает его к строке.

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

## Что не перезаписывается

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

Дальше: как посмотреть, из каких адресов состоит приложение, — в разделе [Карта приложения и обход](/agents/test/docs/map)
.

[← Оглавление документации](/agents/test/docs)
