Communityn8ngithub.com

ashtonfeliciano/n8n-evaluations-runner

Erstelle und führe Logik-Testsuiten für n8n-Workflows ohne API-Kosten aus. Verwende dies, um Testabdeckung für Filterlogik, Bewertungsfunktionen, Validatoren, Keyword-Listen, Resume-Maps oder jede reine JS-Code-Node-Logik hinzuzufügen. Gibt gruppierte Bestanden/Fehlgeschlagen/Ausstehend-Berichte via Telegram aus. Führe die Tests VOR und NACH jeder Logikänderung aus, um Regressionen zu erkennen, ohne API-Credits zu verbrauchen.

Was ist n8n-evaluations-runner?

Dieses Skill definiert eine schlanke, logikorientierte Evaluierungsumgebung für n8n-Workflows. Es ermöglicht das Ausführen von Unit-Tests für reine JavaScript-Code-Nodes, ohne dass externe API-Aufrufe oder API-Credits nötig sind – der einzige ausgehende Aufruf ist das Senden eines Telegram-Berichts. Der Kern besteht aus einem manuell ausgelösten n8n-Workflow mit drei Code-Nodes: einem Test-Runner, der Behauptungen (`assert`) ausführt, einem Formatierungs-Node, der die Ergebnisse in eine Telegram-Nachricht umwandelt, und einem Telegram-Send-Node, der die Umgebungsvariablen `TELEGRAM_BOT_TOKEN` und `TELEGRAM_CHAT_ID` verwendet. Der Test-Runner ist als wiederverwendbare Code-Vorlage dokumentiert, mit der Entwickler Testfälle für Filterlogik, Bewertungsfunktionen, Validatoren und mehr schreiben können. Er unterstützt die drei Status 'bestanden', 'fehlgeschlagen' und 'ausstehend' (für noch nicht implementierte Funktionen). Die Dokumentation enthält detaillierte Anleitungen, Prioritätslisten, Benennungsregeln, Anti-Patterns und eine Pre-Deploy-Checkliste. Der Schwerpunkt liegt auf der Erfassung von Regressionen, dem Konvertieren vergangener Bugs in Tests und der Wahrung der Sichtbarkeit von Implementierungslücken. Das Skill ist plattformunabhängig für jede Code-Node-Logik in n8n konzipiert und eignet sich besonders für Workflows, die auf reine JavaScript-Funktionen angewiesen sind.

Funktioniert mit~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 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

n8n Evaluations Runner

Wann auslösen

  • Hinzufügen oder Ändern von Filterlogik, Keyword-Listen, Validatoren oder Resume-Maps
  • Refactoring einer reinen Funktionslogik in einem Code-Node
  • Vor dem Mergen einer Workflow-Änderung – als Regressionsschutz
  • Nach einem Produktionsvorfall – den Fehler in einen Test codieren
  • „Wie kann ich n8n-Code unit-testen?“ / „Wie teste ich ohne API-Credits auszugeben?“

Was das ist (und was nicht)

Das istDas ist NICHT
Ein logikorientierter n8n-Workflow mit Mock-EingabenEin Integrationstest gegen Live-APIs
Keine externen Aufrufe außer dem finalen Berichtsversand – läuft in ~3 SekundenEin Leistungstest
Bestanden/Fehlgeschlagen/Ausstehend-Zählungen, die an Telegram gesendet werdenEin Ersatz für manuelle Smoke-Tests des End-to-End-Flows
Ein Regressionsnetz für reines JS in Code-NodesAbdeckung für HTTP-/Gmail-/Telegram-Node-Verhalten

Kosten: keine API-Credits. Nur Mock-Eingaben, nur im Arbeitsspeicher. Der Telegram-Bericht ist der einzige externe Aufruf.

Architektur

[Manueller Auslöser] → [Alle Tests ausführen (Code-Node)] → [Bericht formatieren (Code-Node)] → [Bericht senden (Telegram)]

Ein Workflow pro Logikbereich. Auf Abruf erneut ausführen.

Standard-Testrunner-Code-Node

const results = [];

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

// ============================================================
// Suite 1 — <name>
// ============================================================

// Die Produktionsfunktion WÖRTLICH hier kopieren (nicht importieren – Code-Nodes teilen keinen Gültigkeitsbereich)
function passesJs10Filter(job) {
  // ... gleicher Code wie im Produktions-Node ...
}

// Tests
assert('js-10', 'Sicherheitsfreigabe-Job abgelehnt',
  !passesJs10Filter({
    title: 'Technischer Redakteur',
    description: 'Sicherheitsfreigabe erforderlich.',
    location: 'remote'
  }),
  'erforderliche Sicherheitsfreigabe muss Ablehnung auslösen');

assert('js-10', 'Gültiger Remote-Techniker besteht',
  passesJs10Filter({
    title: 'Technischer Redakteur',
    description: 'API-Dokumentation für Cloud-Plattform schreiben.',
    location: 'remote'
  }),
  'Gültiger Remote-Technischer Redakteur sollte alle Filter bestehen');

// Für noch nicht implementierte Funktionen:
results.push({
  suite: 'js-10',
  test: '30-Tage-Altersgrenze (AUSSTEHEND – Rückstand)',
  pass: null,
  detail: 'Funktion noch nicht implementiert. postedAt-Datumsprüfung hinzufügen, dann erneut ausführen.'
});

// ============================================================
// Zusammenfassen
// ============================================================

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
}}];

Berichtsformatierer

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

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

const lines = [
  `<b>${topEmoji} <NAME> — Logik-Evaluierung</b>`,
  `${passIcon} ${summary.passed} bestanden  ${failIcon} ${summary.failed} fehlgeschlagen  ${pendIcon} ${summary.pending} ausstehend`,
  ''
];

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>Ausführung: ${now} UTC</i>`);

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

Telegram-Sende-Node (Umgebungsvariablen-Muster, kein n8n-Credential)

{
  "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" }
    ]
  }
}

Was testen (Prioritätsreihenfolge)

  1. Ablehnungspfad-Abdeckung — jeder Grund, warum ein Datensatz herausgefiltert werden kann
  2. Grenzfälle — genau am Schwellwert, knapp darunter, knapp darüber
  3. Ungültige-Eingabe-Fallbacks — undefined, null, 0, 'None', falscher Typ → erwarteter Standardwert
  4. Bekannte gültige Echtzeitdaten — mindestens ein Beispiel aus einer früheren bestätigt funktionierenden Ausführung
  5. Bekannte fehlerhafte Echtzeitdaten — mindestens ein Beispiel, das einen früheren Vorfall verursacht hat
  6. Teilstring- vs. exakte Matcher — z. B. 'HR-Abteilung' vs. 'Personalabteilung'
  7. Ausstehende Funktionen — als pass: null geschrieben, damit sie in Berichten als Rückstand erscheinen

Testbenennungskonvention

<suite>: <menschenlesbare Behauptung> mit dem Detailfeld, das die zugrunde liegende Regel oder den vergangenen Bug-Referenz benennt:

assert('js-22', 'Personalabteilung abgelehnt',
  !isValidContact('Personalabteilung'),
  'BAD_CONTAINS_CONTACT-Teilstring-Matching muss dies abfangen (Session-5-Bugfix)');

Die Regel „Vergangene Bugs in Tests umwandeln“

Jeder Eintrag in Ihrer Lessons Learned Library, der eine bestimmte Eingabe → falsches Verhalten nennt, ist ein Test, der darauf wartet, geschrieben zu werden.

Beispiel aus einer echten Lektion:

„Aggregate Sector Quotes hat die 1-MONATS-Änderung statt der 1-TAGES-Änderung berechnet, weil meta.previousClose den Chart-Startpreis bei Bereich=1mo zurückgab.“

→ Test:

assert('aggregate', '1-Tages-Änderung aus closes[] berechnet, nicht aus meta.previousClose',
  computeChange({
    chart: { result: [{ meta: { previousClose: 100 }, indicators: { quote: [{ close: [100, 98, 99, 105] }] } }] }
  }) === ((105 - 99) / 99) * 100,
  'meta.previousClose kann unzuverlässig sein; muss closes[-2] verwenden');

Wann ausführen

  • Vor jeder Änderung an Filterlogik, Keyword-Listen, Validatoren, Resume-Maps
  • Nach der Änderung → bestätigen, dass keine Regressionen aufgetreten sind
  • Nachdem ein LL-Library-Eintrag hinzugefügt wurde → den Test schreiben, der ihn abgefangen hätte
  • Vor dem Deployment einer neuen Workflow-Version

Bedeutung der Status-Icons

IconBedeutung
🟢 (grün)0 Fehlschläge – diese Suite besteht; deployen Sie nur, wenn Ihre anderen Prüfungen ebenfalls bestanden werden
🟡 (gelb)1-3 Fehlschläge – Deployment blockiert, bis behoben
🔴 (rot)4+ Fehlschläge – Deployment blockiert; wahrscheinlich ein breiterer Bruch

Ausstehend (⏳) zählt nicht zu Rot/Gelb – es wird separat als Rückstand verfolgt. Ausstehende Tests sind Abdeckungslücken: Listen Sie sie im Deployment-Hinweis auf.

Anti-Patterns

Anti-PatternStattdessen tun
Gegen Live-APIs testenNur Mock-Eingaben – Evaluierungssuite ist nur Logik
Ausstehende Funktionen überspringen (Sichtbarkeit verlieren)Als pass: null mit Erklärung hinzufügen, was fehlt
Produktionscode importierenWörtlich kopieren – Code-Nodes teilen keinen Gültigkeitsbereich
Eine riesige TestfunktionEin assert() pro Behauptung – lesbarer Bericht
Test nach Bugfix verwerfenFür immer behalten – das ist der Regressionsschutz
Nur Happy Path testenAblehnungspfad-Abdeckung sind die Tests mit dem höchsten Wert
Nur nach einer Änderung ausführenVor UND nach der Änderung ausführen – bestätigt, dass Sie keine Regressionen eingeführt haben
Chat-ID/Token in Workflow-JSON hartcodieren$env.TELEGRAM_BOT_TOKEN / $env.TELEGRAM_CHAT_ID verwenden

Pre-Deploy-Checkliste

  • Evaluierungs-Workflow läuft in < 10 Sekunden
  • Alle Suiten sind im Bericht gruppiert
  • Produktionscode wörtlich kopiert (nicht paraphrasiert)
  • Mindestens 1 Test pro Ablehnungspfad
  • Mindestens 1 „bekannte gültige Echtzeitdaten“-Test pro Suite
  • Ausstehende Funktionen als pass: null mit Detail dargestellt
  • Bericht passt in eine Telegram-Nachricht (< 4000 Zeichen)

Referenz

Individual skills in this repo

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

Verwandte Skills

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