Сериализация результатов

Результат выполнения валидационных сценариев в Vest представляет собой структурированный объект, содержащий сведения о состоянии каждого тестового блока, наборе проверок и итоговых сообщениях об ошибках. Такая структура изначально проектируется как пригодная для преобразования в JSON без дополнительных преобразований, что делает её удобной для хранения, передачи по сети и последующего анализа.

После выполнения набора правил формируется объект результата, включающий несколько ключевых уровней:

  • общее состояние выполнения (успешно / с ошибками)
  • сводка по количеству проваленных проверок
  • иерархия тестовых групп
  • детализированные сообщения об ошибках

Каждый уровень сохраняет вложенность, отражающую исходную структуру валидационного сценария. Это важно, поскольку Vest строится вокруг концепции группировки проверок, и результат должен сохранять контекст каждой проверки.

Типичная структура может включать:

  • идентификатор набора правил
  • список кейсов (test cases)
  • результаты каждого кейса
  • ошибки, связанные с конкретными полями

Такой формат позволяет не терять связь между бизнес-логикой валидации и её итоговым состоянием.

Принципы сериализации

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

Основные принципы:

1. Полная JSON-совместимость

Результат должен без ошибок проходить через JSON.stringify. Это достигается за счёт использования только примитивов, массивов и простых объектов.

2. Стабильная структура

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

  • тестирования
  • логирования
  • сравнения результатов

3. Отсутствие побочных данных

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

Преобразование результата в JSON

Так как результат выполнения уже является plain object, базовая сериализация выполняется стандартными средствами Jav * aScript:

const result = suite.get();
const json = JSON.stringify(result);

Внутри result содержится вложенная структура, где:

  • верхний уровень описывает общий статус
  • второй уровень содержит группы правил
  • третий уровень — отдельные проверки

JSON-формат сохраняет всю эту иерархию без потерь.

Состав полей сериализованного результата

Внутренняя структура результата обычно включает следующие элементы:

1. Общий статус

Поле, отражающее итог выполнения:

  • успешное прохождение всех проверок
  • наличие ошибок хотя бы в одном кейсе

Это позволяет быстро определить итог без обхода всей структуры.

2. Ошибки

Ошибки представлены в виде массива объектов. Каждый объект ошибки содержит:

  • имя поля, в котором произошёл сбой
  • сообщение об ошибке
  • идентификатор правила
  • дополнительные метаданные (например, значение, которое не прошло проверку)

Такая структура обеспечивает возможность точечного анализа.

3. Группы тестов

Vest группирует проверки, и это отражается в результате. Каждая группа содержит:

  • название блока
  • список кейсов
  • локальный статус выполнения

Групповая структура важна при сложной валидации форм или доменных моделей.

4. Кейсы

Каждый кейс представляет собой отдельный сценарий проверки. В сериализованном виде он включает:

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

Особенности вложенной сериализации

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

  • визуализации отчётов
  • построения UI-интерфейсов ошибок
  • интеграции с логирующими системами

При этом важно, что вложенность не является произвольной — она строго повторяет структуру объявления правил.

Нормализация данных перед сериализацией

Перед преобразованием в JSON данные проходят этап нормализации. Он включает:

  • удаление undefined значений
  • приведение ошибок к унифицированному формату
  • исключение служебных полей

Это необходимо для того, чтобы результат оставался компактным и предсказуемым.

Особое внимание уделяется полям ошибок: они приводятся к единому виду, даже если были сгенерированы разными типами валидаторов.

Сериализация ошибок

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

Каждая ошибка после сериализации содержит:

  • идентификатор поля
  • текстовое описание проблемы
  • код правила
  • уровень критичности (если используется)

Дополнительно могут присутствовать вычисленные данные, например:

  • фактическое значение поля
  • ожидаемое значение
  • контекст выполнения проверки

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

Использование пользовательской сериализации

В более сложных сценариях может применяться пользовательская логика сериализации. Она позволяет:

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

Например, можно исключить технические детали и оставить только пользовательские сообщения об ошибках:

const result = suite.get();

const simplified = {
  status: result.status,
  errors: result.errors.map(e => ({
    field: e.field,
    message: e.message
  }))
};

const json = JSON.stringify(simplified);

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

Детеминизм сериализованного результата

Важным свойством является детерминированность: одинаковый набор входных данных и правил всегда приводит к одинаковому JSON-результату.

Это достигается за счёт:

  • отсутствия случайных значений в структуре результата
  • фиксированного порядка обхода проверок
  • строгой нормализации ошибок

Детерминизм позволяет использовать сериализованные результаты в тестовых сравнениях и снапшот-тестировании.

Оптимизация размера сериализованных данных

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

  • исключение успешных кейсов из сериализации (опционально)
  • агрегация повторяющихся ошибок
  • сокращение метаданных

В некоторых реализациях используется режим «compact», где сохраняются только:

  • ошибки
  • идентификаторы групп
  • общий статус

Это уменьшает объём JSON без потери диагностической информации.

Совместимость с внешними системами

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

  • системах логирования
  • CI/CD пайплайнах
  • мониторинговых платформах
  • фронтенд-отчётах

Благодаря стандартизированной структуре отсутствует необходимость в дополнительных адаптерах для базового использования.

Восстановление структуры из JSON

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

const parsed = JSON.parse(json);

Однако восстановленный объект не содержит методов или логики выполнения — только данные. Это подчёркивает разделение между исполнением правил и представлением результата.

Расширяемость формата результата

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

  • на уровне ошибок
  • на уровне кейсов
  • на уровне групп

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