Communityn8ngithub.com

ashtonfeliciano/n8n-evaluations-runner

Construye y ejecuta suites de pruebas lógicas sin costo de API para flujos de trabajo de n8n. Úsalo al agregar cobertura de pruebas a lógica de filtros, funciones de puntuación, validadores, listas de palabras clave, mapas de currículum o cualquier lógica de código puro en nodos Code. Genera un informe agrupado de aprobados/fallidos/pendientes vía Telegram. Ejecútalo ANTES y DESPUÉS de cualquier cambio de lógica para detectar regresiones sin consumir créditos de API.

¿Qué es n8n-evaluations-runner?

Este skill define una metodología para crear y ejecutar suites de pruebas unitarias para la lógica pura de JavaScript dentro de los nodos Code de n8n, sin realizar llamadas a APIs externas (excepto el envío final del informe a Telegram). Está diseñado para desarrolladores que trabajan con n8n y necesitan una forma rápida, económica y repetible de verificar que sus filtros, validadores, funciones de puntuación y otras lógicas de código se comporten correctamente, especialmente antes y después de cambios para prevenir regresiones. El skill proporciona un patrón de prueba estandarizado basado en una función `assert` personalizada, un formateador de informes que agrupa los resultados por suite (con emojis de estado), y una configuración de nodo Telegram que utiliza variables de entorno para evitar credenciales hardcodeadas. También incluye mejores prácticas como priorizar la cobertura de caminos de rechazo, condiciones de frontera y la conversión de errores pasados en pruebas permanentes, así como una lista de verificación pre-despliegue. Está pensado para ser usado en flujos de trabajo de n8n donde la lógica se evalúa en memoria, sin costo de API y en segundos.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ashtonfeliciano/claude-skills-pack/tree/HEAD/skills/n8n-evaluations-runner

Installed? Explore more n8n skills: ashtonfeliciano/n8n-workflow-engineer, hubgunter4-ops/configurador-de-nodos-n8n, hubgunter4-ops/experto-en-n8n-mcp · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Ejecutor de Evaluaciones para n8n

Cuándo activarlo

  • Al agregar o modificar lógica de filtros, listas de palabras clave, validadores o mapas de currículum
  • Al refactorizar la lógica de funciones puras en un nodo Code
  • Antes de fusionar un cambio en un flujo de trabajo — guardia de regresión
  • Después de un incidente en producción — codificar la falla en una prueba
  • "¿Cómo hago pruebas unitarias para código de n8n?" / "¿Cómo pruebo sin gastar créditos de API?"

Qué es esto (y qué no es)

Esto esEsto NO es
Un flujo de trabajo de n8n solo de lógica con entradas simuladasUna prueba de integración contra APIs en vivo
Sin llamadas externas excepto el envío del informe final — se ejecuta en ~3 segundosUna prueba de rendimiento
Conteos de aprobados/fallidos/pendientes enviados a TelegramUn reemplazo para pruebas de humo manuales de flujo completo
Una red de regresión para JS puro en nodos CodeCobertura para el comportamiento de nodos HTTP / Gmail / Telegram

Costo: sin créditos de API. Solo entradas simuladas en memoria. El informe de Telegram es la única llamada externa.

Arquitectura

[Disparador Manual] → [Ejecutar Todas las Pruebas (nodo Code)] → [Formatear Informe (nodo Code)] → [Enviar Informe (Telegram)]

Un flujo de trabajo por superficie lógica. Se vuelve a ejecutar bajo demanda.

Nodo Code de ejecutor de pruebas estándar

const results = [];

function assert(suite, testName, condition, detail) {
  results.push({ suite, test: testName, pass: condition, detail: detail || '' });
}

// ============================================================
// Suite 1 — <nombre>
// ============================================================

// Copiar la función de producción TEXTUALMENTE aquí (no importar — los nodos Code no comparten ámbito)
function passesJs10Filter(job) {
  // ... mismo código que el nodo de producción ...
}

// Pruebas
assert('js-10', 'Trabajo de autorización rechazado',
  !passesJs10Filter({
    title: 'Redactor Técnico',
    description: 'Se requiere autorización.',
    location: 'remoto'
  }),
  'la autorización requerida debe provocar el rechazo');

assert('js-10', 'Redactor técnico remoto válido pasa',
  passesJs10Filter({
    title: 'Redactor Técnico',
    description: 'Escribir documentación de API para plataforma en la nube.',
    location: 'remoto'
  }),
  'Un redactor técnico remoto válido debe pasar todos los filtros');

// Para funciones aún no implementadas:
results.push({
  suite: 'js-10',
  test: 'Límite de antigüedad de 30 días (PENDIENTE — backlog)',
  pass: null,
  detail: 'Función aún no implementada. Agregar verificación de fecha postedAt, luego volver a ejecutar.'
});

// ============================================================
// Resumir
// ============================================================

const passed  = results.filter(r => r.pass === true);
const failed  = results.filter(r => r.pass === false);
const pending = results.filter(r => r.pass === null);

return [{ json: {
  summary: { total: results.length, passed: passed.length, failed: failed.length, pending: pending.length },
  results, failed, pending
}}];

Formateador de informe

const { summary, results } = $input.first().json;

const passIcon = '✅';
const failIcon = '❌';
const pendIcon = '⏳';
const topEmoji = summary.failed === 0 ? '🟢' : (summary.failed <= 3 ? '🟡' : '🔴');

const lines = [
  `<b>${topEmoji} <NOMBRE> — Evaluación Lógica</b>`,
  `${passIcon} ${summary.passed} aprobados  ${failIcon} ${summary.failed} fallidos  ${pendIcon} ${summary.pending} pendientes`,
  ''
];

const suites = {};
for (const r of results) (suites[r.suite] = suites[r.suite] || []).push(r);

for (const [suite, tests] of Object.entries(suites)) {
  const suitePass = tests.every(t => t.pass !== false);
  lines.push(`<b>${suitePass ? passIcon : failIcon} ${suite}</b>`);
  for (const t of tests) {
    const icon = t.pass === true ? passIcon : (t.pass === false ? failIcon : pendIcon);
    lines.push(`  ${icon} ${t.test}`);
    if (t.pass !== true) lines.push(`    <i>→ ${(t.detail || '').substring(0, 140)}</i>`);
  }
  lines.push('');
}

const now = new Date().toLocaleString('en-US', {
  timeZone: 'UTC', dateStyle: 'short', timeStyle: 'short'
});
lines.push(`<i>Ejecutado: ${now} UTC</i>`);

return [{ json: { message: lines.join('\n') } }];

Nodo de envío Telegram (patrón de variable de entorno, sin credencial n8n)

{
  "method": "POST",
  "url": "=https://api.telegram.org/bot{{ $env.TELEGRAM_BOT_TOKEN }}/sendMessage",
  "sendBody": true,
  "specifyBody": "keypair",
  "bodyParameters": {
    "parameters": [
      { "name": "chat_id", "value": "={{ $env.TELEGRAM_CHAT_ID }}" },
      { "name": "text", "value": "={{ $json.message }}" },
      { "name": "parse_mode", "value": "HTML" }
    ]
  }
}

Qué probar (orden de prioridad)

  1. Cobertura de caminos de rechazo — cada razón por la que un registro puede ser filtrado
  2. Condiciones de frontera — en el umbral, justo por debajo, justo por encima
  3. Fallbacks para entrada inválida — undefined, null, 0, 'None', tipo incorrecto → valor por defecto esperado
  4. Datos reales conocidos como buenos — al menos un ejemplo de una ejecución pasada confirmada como funcional
  5. Datos reales conocidos como malos — al menos un ejemplo que causó un incidente pasado
  6. Coincidencias de subcadena vs exactas — ej., 'Departamento de RRHH' vs 'Departamento de Recursos Humanos'
  7. Funciones pendientes — escritas como pass: null para que aparezcan en los informes como backlog

Convención de nombres de pruebas

<suite>: <afirmación legible para humanos> con el campo detail nombrando la regla subyacente o referencia de error pasado:

assert('js-22', 'Departamento de Recursos Humanos rechazado',
  !isValidContact('Departamento de Recursos Humanos'),
  'La coincidencia de subcadena BAD_CONTAINS_CONTACT debe detectar esto (corrección de la Sesión 5)');

La regla "convertir errores pasados en pruebas"

Cada entrada en tu Biblioteca de Lecciones Aprendidas que nombre una entrada específica → comportamiento incorrecto es una prueba esperando ser escrita.

Ejemplo de una lección real:

"Aggregate Sector Quotes estaba calculando el cambio de 1 MES en lugar de 1 DÍA porque meta.previousClose devolvía el precio de inicio del gráfico en rango=1mo."

→ Prueba:

assert('aggregate', 'Cambio de 1 día calculado desde closes[], no meta.previousClose',
  computeChange({
    chart: { result: [{ meta: { previousClose: 100 }, indicators: { quote: [{ close: [100, 98, 99, 105] }] } }] }
  }) === ((105 - 99) / 99) * 100,
  'meta.previousClose puede ser poco confiable; debe usar closes[-2]');

Cuándo ejecutar

  • Antes de cualquier cambio en lógica de filtros, listas de palabras clave, validadores, mapas de currículum
  • Después del cambio → confirmar que no hay regresiones
  • Después de agregar cualquier entrada a la Biblioteca de Lecciones → escribir la prueba que lo habría detectado
  • Pre-despliegue de cualquier nueva versión del flujo de trabajo

Significado de los iconos de estado

IconoSignificado
🟢 (verde)0 fallos — esta suite pasa; despliega solo si tus otras comprobaciones también pasan
🟡 (amarillo)1-3 fallos — despliegue bloqueado hasta que se solucione
🔴 (rojo)4+ fallos — despliegue bloqueado; probablemente una ruptura más amplia

Los pendientes (⏳) no cuentan para rojo/amarillo — se rastrean por separado como backlog. Las pruebas pendientes son brechas de cobertura: enuméralas en la nota de despliegue.

Anti-patrones

Anti-patrónQué hacer en su lugar
Probar contra APIs en vivoSolo entradas simuladas — la suite de evaluación es solo lógica
Saltar funciones pendientes (perder visibilidad)Agregar como pass: null con detalle explicando qué falta
Importar código de producciónCopiar textualmente — los nodos Code no comparten ámbito
Una función de prueba giganteUn assert() por afirmación — informe legible
Descartar la prueba después de corregir un errorMantenerla para siempre — esa es la guardia de regresión
Probar solo el camino felizLa cobertura de caminos de rechazo son las pruebas de mayor valor
Ejecutar solo después de un cambioEjecutar ANTES Y DESPUÉS — confirma que no introdujiste regresiones
Hardcodear ID de chat / token en el JSON del flujo de trabajoUsar $env.TELEGRAM_BOT_TOKEN / $env.TELEGRAM_CHAT_ID

Lista de verificación pre-despliegue

  • El flujo de trabajo de evaluación se ejecuta en < 10 segundos
  • Todas las suites agrupadas en el informe
  • Código de producción copiado textualmente (no parafraseado)
  • Al menos 1 prueba por camino de rechazo
  • Al menos 1 prueba de "datos reales conocidos como buenos" por suite
  • Funciones pendientes representadas como pass: null con detalle
  • El informe cabe en un mensaje de Telegram (< 4000 caracteres)

Referencia

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

Skills relacionados

ashtonfeliciano/n8n-workflow-engineer

Build, debug, and harden n8n workflows. Use when the user is editing n8n workflow JSON, debugging silent failures, working with Code nodes, Telegram / Gmail / HTTP Request nodes, scheduled triggers, paired-item tracking, dedup with static data, or doing bulk operations via the n8n REST API. Covers v2.x UI specifics. Not for non-n8n automation.

community

hubgunter4-ops/configurador-de-nodos-n8n

Ayuda a configurar nodos de n8n con reglas de dependencia complejas y conexiones de IA. Agiliza la creación de flujos de trabajo automatizados gestionando dependencias de nodos intrincadas e integraciones de IA.

community

hubgunter4-ops/experto-en-n8n-mcp

Guía a los desarrolladores a seleccionar y configurar herramientas y formatos de nodo del Protocolo de Contexto de Modelo MCP dentro de los flujos de trabajo de n8n. Proporciona orientación estructurada para integrar herramientas MCP.

community

caiqueDeOliveira-dev/homelab

HomeLab Agent — Gerencia Home Assistant, ESP32 satellites, dispositivos Zigbee/Matter/Thread, automações físicas, cameras, sensores. Camada de decisão e execução no hardware (não orquestração de software = Automação/n8n).

community

hubgunter4-ops/experto-en-n8n-mcp

Guía a los desarrolladores a seleccionar y configurar herramientas y formatos de nodo del Protocolo de Contexto de Modelo MCP dentro de los flujos de trabajo de n8n. Proporciona orientación estructurada para integrar herramientas MCP.

community

hubgunter4-ops/experto-en-validacion-de-n8n

Corrige errores de validación de n8n consultando un catálogo de errores integrado. Optimiza el proceso de depuración, permitiendo identificar rápidamente problemas y resolver problemas de configuración del flujo de trabajo.

community