Suite в Vest формируется как декларативная структура, в которой тесты и группы описываются до фактического выполнения. На этом этапе происходит регистрация всех правил валидации, но ни одно из них ещё не исполняется.
Ключевая особенность модели заключается в разделении:
test, group, skip,
onlyvest.runВо время построения suite создаётся внутреннее дерево правил, где каждый узел содержит:
Структура в этот момент полностью иммутабельна с точки зрения исполнения: функции не вызываются, а лишь регистрируются.
Вызов vest.run запускает жизненный цикл suite. На этом
этапе создаётся контекст выполнения, включающий:
Suite переводится в состояние running, при этом предыдущий результат (если он существует) может быть помечен как устаревший.
Если входные данные не изменились, Vest может использовать кешированные результаты тестов, избегая повторного выполнения.
Перед выполнением происходит этап фильтрации:
only — оставляя только выбранные тестыskip — полностью игнорируемые узлыgroup, если задано условие
выполненияФормируется финальный список задач, подлежащих исполнению.
На этом же этапе происходит анализ зависимостей: каждый тест может быть привязан к конкретным полям модели. Это позволяет выполнять точечную перезапись результатов при изменении данных.
Execution phase строится как детерминированный обход дерева suite.
Каждый тест проходит следующие стадии:
Формируется объект, содержащий:
Тестовая функция вызывается синхронно или асинхронно. Поддерживаются промисы, что позволяет интегрировать API-валидации и отложенные проверки.
Во время выполнения возможны три исхода:
Результаты приводятся к унифицированному формату:
Каждый результат сохраняется в структуре suite с привязкой к конкретному полю и группе.
При этом сохраняется история состояния, что позволяет реализовать инкрементальные обновления UI в связке с React или другими фреймворками.
Асинхронные тесты встраиваются в общий поток выполнения без блокировки всей suite.
Особенности:
Vest поддерживает стратегию, при которой повторный запуск может отменять устаревшие асинхронные операции через механизм инвалидирования контекста.
Любое изменение входных данных модели запускает процесс инвалидирования:
Инвалидация может быть:
Это позволяет избегать полного пересчёта при каждом изменении формы или состояния приложения.
Каждый тест может быть привязан к одному или нескольким полям модели. Это формирует граф зависимостей:
При изменении поля пересчитываются только связанные тесты. Это ключевой механизм оптимизации жизненного цикла suite.
После завершения всех тестов suite переходит в состояние completed.
На этом этапе:
Если во время выполнения произошла новая инвалидация, результат может быть немедленно помечен как устаревший, и lifecycle запускается заново.
Кеширование в Vest встроено в сам цикл выполнения:
Кеш инвалидируется при:
Группы (group) формируют поддеревья внутри основной
suite. Их жизненный цикл подчиняется общим правилам, но с локальной
изоляцией состояния.
Особенности:
Это позволяет строить сложные сценарии валидации с многоуровневой логикой.
На протяжении выполнения suite проходит через набор дискретных состояний:
Переходы между состояниями управляются изменениями данных и результатами выполнения тестов.
Одной из ключевых характеристик жизненного цикла является способность к инкрементальному пересчёту.
При изменении одного поля:
Это позволяет использовать suite в интерактивных интерфейсах без полной перезагрузки логики валидации.