Жизненный цикл suite

Фаза построения (definition phase)

Suite в Vest формируется как декларативная структура, в которой тесты и группы описываются до фактического выполнения. На этом этапе происходит регистрация всех правил валидации, но ни одно из них ещё не исполняется.

Ключевая особенность модели заключается в разделении:

  • определения (definition) — описание тестов через вызовы test, group, skip, only
  • выполнения (execution) — запуск через vest.run

Во время построения suite создаётся внутреннее дерево правил, где каждый узел содержит:

  • идентификатор теста
  • функцию проверки
  • метаданные (сообщение, группа, условия выполнения)
  • стратегию выполнения (sync/async)
  • зависимости от значений полей

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


Инициализация выполнения

Вызов vest.run запускает жизненный цикл suite. На этом этапе создаётся контекст выполнения, включающий:

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

Suite переводится в состояние running, при этом предыдущий результат (если он существует) может быть помечен как устаревший.

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


Разрешение набора тестов

Перед выполнением происходит этап фильтрации:

  • применяются only — оставляя только выбранные тесты
  • исключаются skip — полностью игнорируемые узлы
  • активируются группы через group, если задано условие выполнения

Формируется финальный список задач, подлежащих исполнению.

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


Последовательность выполнения тестов

Execution phase строится как детерминированный обход дерева suite.

Каждый тест проходит следующие стадии:

  1. Подготовка контекста
  2. Выполнение функции проверки
  3. Обработка результата
  4. Запись состояния

Подготовка контекста

Формируется объект, содержащий:

  • текущее значение модели
  • доступ к helper-функциям suite
  • информация о группе и метаданных теста

Выполнение проверки

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

Во время выполнения возможны три исхода:

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

Обработка результата теста

Результаты приводятся к унифицированному формату:

  • valid — тест пройден
  • invalid — тест не пройден
  • skipped — тест пропущен
  • error — внутренняя ошибка выполнения

Каждый результат сохраняется в структуре suite с привязкой к конкретному полю и группе.

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


Асинхронный жизненный цикл

Асинхронные тесты встраиваются в общий поток выполнения без блокировки всей suite.

Особенности:

  • выполнение происходит параллельно, если нет зависимостей
  • результаты фиксируются по мере завершения промисов
  • промежуточное состояние suite остаётся частично валидным

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


Инвалидация и повторный запуск

Любое изменение входных данных модели запускает процесс инвалидирования:

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

Инвалидация может быть:

  • полной — при смене структуры suite
  • частичной — при изменении отдельных полей модели

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


Управление зависимостями

Каждый тест может быть привязан к одному или нескольким полям модели. Это формирует граф зависимостей:

  • узлы графа — тесты
  • рёбра — зависимости от значений

При изменении поля пересчитываются только связанные тесты. Это ключевой механизм оптимизации жизненного цикла suite.


Завершение выполнения

После завершения всех тестов suite переходит в состояние completed.

На этом этапе:

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

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


Поведение кеша в жизненном цикле

Кеширование в Vest встроено в сам цикл выполнения:

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

Кеш инвалидируется при:

  • изменении значений модели
  • изменении структуры suite
  • изменении логики тестов

Взаимодействие групп и вложенных suite

Группы (group) формируют поддеревья внутри основной suite. Их жизненный цикл подчиняется общим правилам, но с локальной изоляцией состояния.

Особенности:

  • группа может иметь собственное состояние выполнения
  • вложенные suite выполняются независимо
  • результаты агрегируются на уровне родительской suite

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


Состояния suite в процессе жизненного цикла

На протяжении выполнения suite проходит через набор дискретных состояний:

  • idle — не запущена
  • building — формирование структуры
  • running — выполнение тестов
  • stale — результат устарел
  • completed — выполнение завершено
  • invalidated — требуется пересчёт

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


Инкрементальное обновление состояния

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

При изменении одного поля:

  • пересчитываются только зависимые тесты
  • остальные результаты остаются неизменными
  • итоговое состояние обновляется частично

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