Оглавление
По сообщению Cloudflare, разработчик платформы представил новые API для тестирования Workflows — механизма устойчивого выполнения для многошаговых приложений. Ранее тестирование таких процессов было похоже на работу с черным ящиком: можно было проверить только финальный статус выполнения, но не промежуточные шаги.
Проблемы прежнего подхода
До выхода нового релиза тестирование Workflows создавало серьезные ограничения для разработчиков. Основные проблемы включали:
- Отсутствие видимости промежуточных шагов выполнения
- Необходимость отключать изолированное хранилище при добавлении Workflows в проект
- Возможность утечек состояния между тестами
- Сложность отладки сложных процессов оркестрации
Эта ситуация вынуждала разработчиков делать сложный выбор: либо отказаться от изолированного тестирования всего проекта, либо вовсе не тестировать Workflows.
Новые возможности тестирования
В версии 0.9.0 и выше @cloudflare/vitest-pool-workers появились две ключевые функции:
introspectWorkflowInstance— для модульных тестов с известными идентификаторами экземпляровintrospectWorkflow— для интеграционных тестов с динамически генерируемыми идентификаторами
Новые API позволяют выполнять тестирование локально и офлайн с помощью vitest-pool-workers, что обеспечивает быстрые и надежные запуски тестов без зависимости от сетевого подключения.
Наконец-то разработчики получают инструменты для полноценного тестирования сложных рабочих процессов. До этого отладка многошаговых приложений напоминала гадание на кофейной гуще — можно было только догадываться, на каком именно этапе что-то пошло не так. Теперь же появилась возможность точечно мокать каждый шаг и проверять промежуточные состояния, что кардинально меняет подход к разработке надежных распределенных систем.
Пример использования: модерация блога
Рассмотрим практический пример Workflow для модерации комментариев в блоге. Процесс включает:
- Сканирование контента с помощью Workers AI
- Ожидание решения модератора
- Публикацию комментария через внешний API
Теперь можно протестировать каждый этап:
it("should mock a an ambiguous score, approve comment and complete", async () => {
// CONFIG
await using instance = await introspectWorkflowInstance(
env.MODERATOR,
"my-workflow-instance-id-123"
);
await instance.modify(async (m) => {
await m.mockStepResult({ name: "AI content scan" }, { violationScore: 50 });
await m.mockEvent({
type: "moderation-approval",
payload: { action: "approved" },
});
await m.mockStepResult({ name: "publish comment" }, { status: "published" });
});
await env.MODERATOR.create({ id: "my-workflow-instance-id-123" });
// ASSERTIONS
expect(await instance.waitForStepResult({ name: "AI content scan" })).toEqual(
{ violationScore: 50 }
);
expect(
await instance.waitForStepResult({ name: "publish comment" })
).toEqual({ status: "published" });
await expect(instance.waitForStatus("complete")).resolves.not.toThrow();
});
Техническая реализация
Решение построено на интеграции Vitest с механизмом Workflows Engine. При локальном запуске через wrangler dev каждый экземпляр Workflow поддерживается собственным SQLite Durable Object (Engine DO), который отвечает за выполнение шагов, сохранение состояния и управление жизненным циклом экземпляра.
Ключевым элементом новой архитектуры стало использование синтаксиса явного управления ресурсами с конструкцией await using, которая гарантирует изоляцию хранилища между тестами и корректное освобождение ресурсов.
Новые инструменты тестирования доступны через модуль cloudflare:test и поддерживают мокирование результатов шагов, событий и отключение задержек, что делает тестирование предсказуемым и воспроизводимым.
Подробная документация доступна на Workers Cloudflare Docs.
Оставить комментарий