n8n: pinned data и mock-сценарии — как тестировать ветки с ошибками до запуска в работу - Блог Папы Карло

Опубликовано: 4 месяца назад
Просмотров: 77

Привет. Я тут снова из своей мастерской, где у меня на столе рядом лежат паяльник, ноут и десяток недокрученных автоматизаций. Если по делу: в n8n ветки с ошибками удобнее всего гонять через pinned data, редактирование JSON, Debug Helper, Stop and Error и partial execution. Такой набор даёт проверить IF, Switch, retries, error output и уведомления ещё до того, как сценарий уйдёт в боевую жизнь и начнёт стучаться в реальные сервисы.

Ниже покажу, как я это делаю сам: где именно пинить данные, как собирать mock data n8n под нештатные кейсы, чем имитировать падение узла, почему ручной запуск иногда врёт по ощущениям и какой чек-лист я прогоняю перед публикацией workflow.

Что реально дают pinned data и mock-сценарии

Когда народ ищет n8n pinned data, обычно запрос один: как перестать дёргать живой API на каждом клике и нормально отладить логику. И вот тут pinned data реально выручает. Ты один раз получил нужный входной пакет, закрепил его на узле и дальше спокойно перебираешь сценарии: пустой email, кривой статус, дубль заявки, таймаут, невалидный JSON, что угодно.

Удобство не только в экономии запросов. Главное — повторяемость. Когда входные данные одинаковые, сразу видно, ты поправил логику или просто поймал другой ответ от внешнего сервиса. Для тестирования веток ошибок n8n это вообще золото: один и тот же набор можно прокинуть в IF, Switch, Merge, уведомления и финальный обработчик, не надеясь на удачу.

Есть важный момент: pinned data работает только в разработке. В рабочем запуске эти данные не подставляются, поэтому путать тестовый режим и боевой не надо. Ещё один нюанс — закреплять можно данные узлов с одним основным выходом; error output при этом не ломает правило, но бинарные данные закреплять нельзя. Так что если ты ловишь файл, картинку или PDF, сначала лучше вытащить нужные поля в JSON и уже потом работать дальше.

Инструмент Когда я его беру Что проверяю
Edit Fields / Code Когда нужно быстро накидать свой JSON Пограничные значения, пустые поля, неверные типы
Pinned data Когда нужен повторяемый вход Логику ветвления, преобразования, нотификации
Debug Helper Когда хочу искусственно уронить узел Error branch, retries, обработку исключений
Stop and Error Когда ошибка должна быть бизнес-правилом Своё сообщение об ошибке и реакцию error workflow
Partial execution Когда не хочу гонять весь маршрут Отдельный узел или хвост цепочки

По-хорошему, pinned data в n8n — это не просто “сохранить ответ”. Это способ сделать из хаотичной отладки нормальный повторяемый прогон. Особенно если у тебя сценарий на несколько веток и ошибка всплывает только на редких входных данных.

Разработчик проверяет ветку ошибки и тестовые данные в сценарии автоматизации на ноутбуке

Как я собираю mock-сценарии под ошибочные ветки

Вот мой рабочий подход. Не академический, зато практичный и не жрёт полдня.

1. Ловлю реальный вход один раз

Если сценарий стартует от webhook, формы, Telegram или другого триггера, я сначала получаю один живой пакет и закрепляю его на первом удобном узле после триггера. Это сильно экономит нервы: не надо снова отправлять тестовые события и ловить вечное “waiting for trigger event”, пока ты просто хочешь поправить одно условие.

2. Делаю копии под разные кейсы

Дальше я открываю JSON, жму редактирование pinned data и делаю несколько версий входа. Например:

  • валидная заявка;
  • заявка без телефона;
  • дубль по email;
  • сервис вернул статус 429 или 500;
  • товар не найден;
  • в ответе пришёл пустой массив;
  • поле есть, но тип не тот: строка вместо числа.

Вот это и есть мои mock-сценарии. По сути ты не сочиняешь теорию, а берёшь живую структуру и чуть крутишь её под нужный фейл. Так меньше шансов, что ты протестировал красивый, но несуществующий JSON.

3. Проверяю не только падение, но и поведение после него

Новички часто тестируют сам факт ошибки: узел покраснел — значит, всё. А я смотрю дальше: ушло ли уведомление, записался ли лог, не полез ли workflow в успеховую ветку с пустыми данными, не сработал ли Merge криво, не начался ли повторный цикл. Вот тут и вылезают приколы из серии no input data in this branch или неожиданно пустой input после ветвления.

4. Под каждый риск делаю отдельное имя кейса

Я прямо подписываю в заметке узла: timeout supplier, empty items, bad status code, duplicate lead. Потом открываешь workflow через неделю и сразу понимаешь, что именно тут проверял. Мелочь, а экономит кучу времени.

Если сценарий длинный, удобно вставить в начало небольшую развилку с Edit Fields или Code и генерировать тестовые ветки вручную. Для маленьких проверок мне хватает пары полей в Edit Fields. Для замороченного объекта, где куча вложенности, уже проще сделать Code node и вернуть массив объектов прямо как надо.

Чем именно симулировать ошибку в n8n

Теперь к мясу. Ветка с ошибкой в n8n может проверяться по-разному, и я обычно комбинирую сразу несколько штук.

Debug Helper

Если мне надо быстро проверить error branch testing n8n, я ставлю Debug Helper. У него есть режим Throw Error, и он умеет выбрасывать разные типы ошибок. Это удобный способ понять, как поведёт себя цепочка, если внешний сервис внезапно лег или вернул мусор.

Плюс Debug Helper хорош тем, что не надо ломать реальный узел. Подкинул его в нужное место, проверил Continue using error output, retries, уведомления — и убрал.

Stop and Error

Эта штука мне особенно нравится для бизнес-ошибок. Не технических, а смысловых. Допустим, заказ пришёл, но у него нет обязательного поля, или сумма не проходит по правилу. Узел Stop and Error позволяет явно остановить сценарий со своим сообщением. Это удобно, когда ты хочешь отделить “сервис умер” от “данные сами по себе плохие”.

On Error → Continue (using error output)

Вот это уже инструмент для тех случаев, когда нужно не просто рухнуть, а перевести выполнение в отдельную ошибочную ветку. Я обычно вешаю туда логирование, запись в таблицу проблемных кейсов, нотификацию себе или повторный маршрут. Но тут есть один практический совет: всегда проверяй, какие данные реально ушли дальше. На сложных схемах с циклами и объединениями лучше один раз руками открыть input следующего узла, чем потом ловить странности в проде.

IF и Switch на фальшивых статусах

Не всякая проблема обязана выбивать исключение. Иногда сервис честно отвечает 200, а внутри пишет, что запись не найдена или поле пустое. В таком кейсе я просто редактирую pinned JSON и прогоняю ветку через IF или Switch. Это особенно полезно, когда тестируешь fallback-логику: сначала основной маршрут, потом запасной, потом уведомление человеку.

Partial execution

Когда не хочется каждый раз запускать весь workflow от триггера до финиша, partial execution спасает прям по-мужски. Выбираешь нужный узел, даёшь Execute step и гоняешь только интересующий участок вместе с необходимыми предыдущими данными. Для доработки хвоста сценария это прям кайф. Только не забудь, что для таких запусков у workflow всё равно должен быть подключён триггер, иначе n8n попросит его добавить.

Почему ручной тест и реальный запуск — не всегда одно и то же

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

Во-первых, Error Trigger не тестируется обычным ручным запуском так, как многие ожидают. Нормально он раскрывается, когда ошибка случается в автоматическом запуске. То есть если ты строишь отдельный error workflow, просто щёлкнуть Execute Workflow и ждать полного совпадения поведения — слабая идея.

Во-вторых, pinned data — штука чисто разработческая. В боевом исполнении сценарий пойдёт уже с живым входом. Поэтому я всегда прогоняю хотя бы один реальный автоматический запуск на контролируемом кейсе, прежде чем считать задачу закрытой.

В-третьих, ручной тест часто маскирует проблемы триггера. На webhook-цепочках можно красиво отладить середину маршрута и забыть, что на самом входе есть подпись, дубль запроса, пустой body или странный заголовок. Если у тебя сценарий стартует из вебхука, глянь ещё и мой материал про защиту вебхуков и проверку подписи — там как раз тот кусок, который часто ломает красивую тестовую картинку.

И ещё момент из практики: если у тебя большой маршрут с агентами или длинной логикой, полезно отдельно держать в голове разницу между “мне нужен прогон всей цепочки” и “мне надо проверить один кусок”. Для второго случая я обычно использую тот же подход, что описывал в заметке про частичный прогон узлов.

Мой чек-лист перед запуском в работу

Перед тем как включить активный workflow, я прогоняю вот такой список.

  • Есть минимум один pinned dataset с валидным входом.
  • Есть 2–4 mock-сценария под реальные фейлы: пустые поля, плохой статус, дубль, пустой массив.
  • Проверена отдельная ветка уведомления об ошибке.
  • Проверено, что retries не создают дубль действий.
  • Проверено, что Continue using error output не уводит пустые данные в следующий критичный узел.
  • Проверен хотя бы один автоматический запуск на контролируемом кейсе.
  • Сняты тестовые pinned data там, где они уже не нужны.
  • На узлах оставлены короткие заметки, где какой кейс проверялся.

Если ошибок много и ты хочешь не только тестировать их локально, но и построить нормальную дисциплину обработки, загляни ещё в мой разбор про схему контроля ошибок, retries и error workflow. А если нужен более широкий взгляд на заготовки и типовые маршруты, рядом лежит подборка про готовые шаблоны n8n.

Я бы сформулировал так: pinned data в n8n — это твой фиксированный стенд, а mock-сценарии — набор проверок, на которых видно, как workflow держит удар. Не надо ждать, пока сервис сам однажды вернёт дрянной ответ и поломает рабочий процесс в самый неудобный момент. Лови один живой вход, редактируй JSON, искусственно кидай ошибки через Debug Helper и Stop and Error, потом добивай картину partial execution и одним реальным автоматическим запуском.

Так сценарий уходит в работу уже не “ну вроде кликалось”, а с понятным набором проверок. А это, если честно, и есть взрослый подход к автоматизации: меньше гадания, больше повторяемого теста и меньше сюрпризов утром в логах.

Метки: , , , , , , , ,