Российские технологии и цифровая экономика
ПоискRSS

Покрытие параметров и каскадов: как создать собственный инструмент для автотестов

5 минут чтения

Велосипед для покрытия: когда стандартные инструменты не справляются

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

Именно в такой ситуации стандартные решения вроде `coverage.py` или `pytest-cov` оказываются недостаточными. Они умеют оценивать покрытие кода, но не отвечают на вопрос: для каких параметров существуют тесты и какие из них проверяются косвенно - через каскады. Поэтому приходится создавать собственный инструмент. Подробный разбор подобного подхода и идеи, на которых он построен, можно найти в материале о [проверке покрытия параметров и каскадов](https://habr.com/ru/articles/1080188/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1080188).

Какую задачу нужно решить

Предположим, в проекте есть набор параметров. Часть из них входит в один или несколько каскадов - связанных последовательностей или групп условий. Для каждого параметра требуется определить, существует ли тест, который проверяет его напрямую либо участвует в тестировании каскада, содержащего этот параметр.

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

На вход инструмент получает два набора данных:

- CSV-файл аналитиков с актуальным перечнем параметров и каскадов;
- каталоги `parametres` и `cascades` в проекте автотестов.

Из файлов с тестами извлекаются названия параметров и каскадов. В результате формируется словарь следующего вида:

```python
{
"": ["", "..."]
}
```

Из CSV создается второй словарь:

```python
{
"": ["", "..."]
}
```

Затем данные объединяются. Для каждого параметра определяется наличие теста, список связанных каскадов и итоговый статус покрытия.

Почему нужны разные форматы отчетов

Один формат редко бывает удобен для всех участников процесса. Поэтому отчет разумно формировать сразу в трех представлениях.

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

CSV остается практичным корпоративным форматом: его легко открыть в табличном редакторе, отсортировать, отфильтровать или передать коллегам.

JSON удобен разработчикам. Его проще использовать при отладке, подключать к другим скриптам и применять как основу для дальнейшей автоматизации.

Скрипт может поддерживать три флага:

- `--html` - HTML-отчет, используемый по умолчанию;
- `--csv` - таблица с матрицей покрытия;
- `--json` - структурированные данные для программной обработки.

Такой [инструмент анализа покрытия параметров](https://habr.com/ru/articles/1080188/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1080188) фактически становится промежуточным слоем между аналитическими данными и тестовой инфраструктурой.

Извлечение данных из тестов

Первый этап - рекурсивный обход каталогов. Скрипт получает путь к директории, открывает все файлы, включая расположенные во вложенных папках, и ищет строку, соответствующую принятому в проекте шаблону имени.

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

Если этого не сделать, в результате останется только последнее найденное значение, и итоговая картина будет неполной.

Обработка CSV аналитиков

На втором этапе читается CSV-файл. Для этого удобно использовать `DictReader`: каждая строка автоматически преобразуется в словарь, где ключами выступают названия колонок.

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

Далее программа сравнивает сведения из CSV с данными, извлеченными из тестов. Если параметр присутствует в тестовом словаре или имеет протестированный каскад, ему присваивается отметка "+". При отсутствии связанного теста устанавливается "-", а список тестов остается пустым.

Дополнительно проверяются и сами каскады. Это позволяет выявить ситуацию, когда параметр формально включен в каскад, но тестов для соответствующей последовательности действий нет.

Формирование списка проблемных параметров

При объеме около тысячи параметров искать пропуски вручную неудобно. Поэтому итоговая структура данных дополнительно фильтруется: из нее выбираются все записи со статусом "-".

В отдельный список попадают:

- непокрытые параметры;
- связанные с ними каскады;
- отсутствующие тесты;
- дополнительная информация, необходимая для анализа.

Такой перечень помогает быстро определить приоритеты: какие тесты нужно написать в первую очередь, какие каскады требуют пересмотра, а где проблема связана с неактуальными сведениями в CSV.

Структура отчетов

JSON можно сформировать как объект с двумя основными разделами. Первый содержит матрицу покрытия, второй - список непокрытых параметров. Такой формат сохраняет всю необходимую детализацию и остается удобным для чтения как человеком, так и программой.

CSV строится построчно. В первой строке размещаются заголовки колонок, а следующие строки заполняются данными матрицы: статусом покрытия, названием параметра, каскадами и тестами.

HTML-страница требует больше всего работы, поскольку в ней нужно не только вывести сведения, но и сделать их удобными для просмотра. В нее можно включить количественные показатели, таблицу покрытия и отдельный блок с непокрытыми параметрами.

В таблице достаточно оставить два основных столбца: признак покрытия и название параметра. При клике по строке пользователь получает дополнительную информацию о каскадах и тестах. Для больших массивов данных полезны сортировка, фильтрация и сворачиваемые блоки.

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

Как развивать решение дальше

Инструмент можно интегрировать в CI/CD, чтобы отчет автоматически создавался после запуска автотестов. Тогда изменения покрытия будут видны не только перед релизом, но и на каждом этапе разработки.

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

Еще одно направление - проверка качества входных данных. Скрипт может предупреждать о дубликатах, неизвестных каскадах, параметрах без описания и тестах, которые ссылаются на удаленные сущности.

В результате получается не просто отчет, а самостоятельная система контроля полноты тестирования. Она не заменяет классические инструменты измерения покрытия кода, а дополняет их на уровне бизнес-логики. При необходимости такой [велосипед для покрытия купить](https://habr.com/ru/articles/1080188/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1080188) готовым решением невозможно, поскольку его структура зависит от внутренних соглашений проекта. Поэтому важнее не велосипед для покрытия цена или велосипед для покрытия заказать у стороннего поставщика, а корректно определить требования. Если рассматривать велосипед для покрытия производитель должен учитывать форматы исходных данных, велосипед для покрытия технические характеристики отчета и особенности тестовой инфраструктуры.

Прокрутить вверх