Оглавление

По сообщению Cloudflare, разработчик платформы представил новые API для тестирования Workflows — механизма устойчивого выполнения для многошаговых приложений. Ранее тестирование таких процессов было похоже на работу с черным ящиком: можно было проверить только финальный статус выполнения, но не промежуточные шаги.

Проблемы прежнего подхода

До выхода нового релиза тестирование Workflows создавало серьезные ограничения для разработчиков. Основные проблемы включали:

  • Отсутствие видимости промежуточных шагов выполнения
  • Необходимость отключать изолированное хранилище при добавлении Workflows в проект
  • Возможность утечек состояния между тестами
  • Сложность отладки сложных процессов оркестрации

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

Новые возможности тестирования

В версии 0.9.0 и выше @cloudflare/vitest-pool-workers появились две ключевые функции:

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

Новые API позволяют выполнять тестирование локально и офлайн с помощью vitest-pool-workers, что обеспечивает быстрые и надежные запуски тестов без зависимости от сетевого подключения.

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

Пример использования: модерация блога

Рассмотрим практический пример Workflow для модерации комментариев в блоге. Процесс включает:

  1. Сканирование контента с помощью Workers AI
  2. Ожидание решения модератора
  3. Публикацию комментария через внешний 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.