Communityn8ngithub.com

ashtonfeliciano/n8n-evaluations-runner

n8nワークフロー向けのゼロAPIコストロジックテストスイートを構築・実行します。フィルターロジック、スコアリング関数、バリデーター、キーワードリスト、レジュームマップ、または純粋なJSコードノードロジックにテストカバレッジを追加する際に使用してください。合格/不合格/保留中のグループ化されたレポートをTelegram経由で出力します。APIクレジットを消費せずにリグレッションを検出するため、ロジック変更の前と後の両方で実行してください。

n8n-evaluations-runner とは?

このスキルは、n8nワークフロー内のCodeノードに含まれる純粋なJavaScriptロジック(フィルター関数、スコアリング、バリデーター、キーワードマッチングなど)に対する単体テストスイートを、APIコストゼロで構築・実行するためのものです。実際のAPIを呼び出さず、モック入力とメモリ内処理のみで動作するため、約3秒で完了し、APIクレジットを消費しません。テスト結果はTelegramにグループ化されたレポート(合格/不合格/保留中)として送信され、ステータスアイコン(🟢/🟡/🔴)で全体の状況を一目で把握できます。主なユースケースは、ロジック変更前後のリグレッション検証、過去のバグをテストとしてコード化する「過去バグをテストに変換するルール」の適用、デプロイ前の品質保証です。

対応~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 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

n8n Evaluations Runner(n8n評価ランナー)

トリガーするタイミング

  • フィルターロジック、キーワードリスト、バリデーター、レジュームマップを追加または変更する場合
  • Codeノードの純粋関数ロジックをリファクタリングする場合
  • ワークフローの変更をマージする前 — リグレッションガード
  • 本番インシデント後 — 障害をテストとしてコード化する場合
  • 「n8nコードを単体テストするには?」/ 「APIクレジットを使わずにテストするには?」

これの概要(そうでないものとの違い)

これが該当するものこれが該当しないもの
モック入力を使用したロジックのみのn8nワークフローライブAPIに対する統合テスト
最終レポート送信以外の外部呼び出しなし — 約3秒で実行パフォーマンステスト
Telegramにプッシュされる合格/不合格/保留中のカウントエンドツーエンドフローの手動スモークテストの代わり
Codeノード内の純粋JSに対するリグレッション網HTTP / Gmail / Telegramノードの動作のカバレッジ

コスト: APIクレジット不要。モック入力、メモリ内のみ。Telegramレポートが唯一の外部呼び出しです。

アーキテクチャ

[手動トリガー] → [全テストを実行(Codeノード)] → [レポートを整形(Codeノード)] → [レポートを送信(Telegram)]

ロジックサーフェスごとに1つのワークフロー。オンデマンドで再実行可能。

標準テストランナー Codeノード

const results = [];

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

// ============================================================
// Suite 1 — <名前>
// ============================================================

// 本番関数をそのままここにコピー(インポート不可 — Codeノードはスコープを共有しない)
function passesJs10Filter(job) {
  // ... 本番ノードと同じコード ...
}

// テスト
assert('js-10', 'クリアランスジョブは却下',
  !passesJs10Filter({
    title: 'テクニカルライター',
    description: 'クリアランスが必要です。',
    location: 'リモート'
  }),
  'クリアランス必須は却下をトリガーする必要があります');

assert('js-10', '有効なリモートテクニカルライターは通過',
  passesJs10Filter({
    title: 'テクニカルライター',
    description: 'クラウドプラットフォームのAPIドキュメントを作成します。',
    location: 'リモート'
  }),
  '有効なリモートテクニカルライターはすべてのフィルターを通過する必要があります');

// 未実装機能の場合:
results.push({
  suite: 'js-10',
  test: '30日経過日数カットオフ(保留中 — バックログ)',
  pass: null,
  detail: '機能はまだ実装されていません。postedAt日付チェックを追加し、再実行してください。'
});

// ============================================================
// サマリー
// ============================================================

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

レポートフォーマッター

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

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

const lines = [
  `<b>${topEmoji} <名前> — ロジック評価</b>`,
  `${passIcon} ${summary.passed} 合格  ${failIcon} ${summary.failed} 不合格  ${pendIcon} ${summary.pending} 保留中`,
  ''
];

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>実行: ${now} UTC</i>`);

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

Telegram送信ノード(環境変数パターン、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" }
    ]
  }
}

テスト対象(優先順位順)

  1. 却下パスカバレッジ — レコードがフィルターアウトされるすべての理由
  2. 境界条件 — 閾値、その直下、その直上
  3. 無効入力フォールバック — undefined、null、0、'None'、型違い → 期待されるデフォルト
  4. 既知の正常実データ — 過去の動作確認済み実行から少なくとも1つの例
  5. 既知の異常実データ — 過去のインシデントを引き起こした少なくとも1つの例
  6. 部分一致vs完全一致マッチャー — 例:'HR Dept' vs 'Human Resources Department'
  7. 保留中の機能 — pass: nullとして記述し、レポートにバックログとして表示させる

テスト命名規則

<スイート>: <人間が読めるアサーション> 詳細フィールドには、基になるルールや過去のバグ参照を記載:

assert('js-22', '人事部は却下',
  !isValidContact('人事部'),
  'BAD_CONTAINS_CONTACT部分一致マッチャーはこれをキャッチする必要があります(Session 5のバグ修正)');

「過去のバグをテストに変換する」ルール

学びのライブラリ(Lessons Learned Library)にある、特定の入力 → 誤った動作を名前付けするエントリはすべて、記述されるべきテストです。

実際の教訓からの例:

「集計セクタークォートは、1日変化ではなく1ヶ月変化を計算していました。これはmeta.previousCloseがrange=1moでチャート開始価格を返していたためです。」

→ テスト:

assert('aggregate', '1日変化はcloses[]から計算され、meta.previousCloseからではない',
  computeChange({
    chart: { result: [{ meta: { previousClose: 100 }, indicators: { quote: [{ close: [100, 98, 99, 105] }] } }] }
  }) === ((105 - 99) / 99) * 100,
  'meta.previousCloseは信頼できない場合があります。closes[-2]を使用してください');

実行タイミング

  • フィルターロジック、キーワードリスト、バリデーター、レジュームマップへの変更前
  • 変更後 → リグレッションがないことを確認
  • 学びのライブラリエントリが追加された後 → それをキャッチするテストを作成
  • 新しいワークフローバージョンのデプロイ前

ステータスアイコンの意味

アイコン意味
🟢(緑)0件の不合格 — このスイートはパス。他のチェックもパスしていればデプロイ可能
🟡(黄)1~3件の不合格 — 修正されるまでデプロイ不可
🔴(赤)4件以上の不合格 — デプロイ不可。広範な破損の可能性

保留中(⏳)は赤/黄のカウントに含まれません — バックログとして別途追跡されます。保留中のテストはカバレッジギャップです。デプロイノートにリストアップしてください。

アンチパターン

アンチパターン代わりに行うべきこと
ライブAPIに対してテストするモック入力のみ — 評価スイートはロジック限定
保留中の機能をスキップする(可視性を失う)pass: nullと不足している内容を説明する詳細を追加する
本番コードをインポートするそのままコピー — Codeノードはスコープを共有しない
1つの巨大なテスト関数アサーションごとに1つのassert() — 読みやすいレポート
バグ修正後にテストを削除する永久に保持 — それがリグレッションガード
正常系パスのみテストする却下パスカバレッジが最も価値の高いテスト
変更後にのみ実行する変更前と後の両方で実行 — リグレッションを導入していないことを確認
chat ID / トークンをワークフローJSONにハードコードする$env.TELEGRAM_BOT_TOKEN / $env.TELEGRAM_CHAT_ID を使用する

デプロイ前チェックリスト

  • 評価ワークフローが10秒未満で実行される
  • すべてのスイートがレポートにグループ化されている
  • 本番コードがそのままコピーされている(言い換えではない)
  • 却下パスごとに少なくとも1つのテストがある
  • スイートごとに少なくとも1つの「既知の正常実データ」テストがある
  • 保留中の機能はpass: nullと詳細で表現されている
  • レポートが1つのTelegramメッセージに収まる(4000文字未満)

参考

Individual skills in this repo

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

関連スキル

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