reproduce-bug について
n8n の開発者向けテストスキルで、Linear のチケットをもとにバグを調査し、失敗する回帰テストを作成します。影響範囲に応じてテスト層を選び、確度付きのレポートをまとめます。バグの修正は行いません。
主な機能
- 01チケット情報と影響範囲の解析
- 02テスト層とパターンの選択
- 03コード追跡と仮説の立案
- 04失敗する回帰テストの作成と実行
- 05再現確度と結果の報告
活用シーン
- 01ノードやサービスのバグ再現
- 02エディターや API の問題に対するテスト選択
- 03現在のコードで回帰が残るかの確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ n8n-io/ n8n --skill reproduce-bugインストール後、Claude Code で/reproduce-bugを入力して読み込まれたか確認します。
詳細
バグ再現フレームワーク
Linear チケットのコンテキスト($ARGUMENTS)をもとに、失敗する回帰テストを使ってバグを体系的に再現します。
ステップ 1:シグナルを解析する
提供されたチケットのコンテキストから、以下の情報を抽出します。
- エラーメッセージ/スタックトレース(提供されている場合)
- 再現手順(提供されている場合)
- ワークフロー JSON(添付されている場合)
- 影響を受ける領域(ノード、実行エンジン、エディター、API、設定など)
- 不具合が発生したバージョン/最後に正常に動作していたバージョン
ステップ 2:テスト戦略を選ぶ
影響を受ける領域に応じて、テスト層とパターンを選択します。
| 領域 | テスト層 | パターン | 主な配置場所 |
|---|---|---|---|
| ノードの操作 | Jest 単体テスト | NodeTestHarness + nock | packages/nodes-base/nodes/*/test/ |
| ノードの認証情報 | Jest 単体テスト | jest-mock-extended | packages/nodes-base/nodes/*/test/ |
| トリガーの Webhook | Jest 単体テスト | mock IHookFunctions + jest.mock GenericFunctions | packages/nodes-base/nodes/*/test/ |
| バイナリデータ | Jest 単体テスト | NodeTestHarness assertBinaryData | packages/core/nodes-testing/ |
| 実行エンジン | Jest 統合テスト | WorkflowRunner + DI コンテナー | packages/cli/src/__tests__/ |
| CLI/API | Jest 統合テスト | setupTestServer + supertest | packages/cli/test/integration/ |
| 設定 | Jest 単体テスト | GlobalConfig + Container | packages/@n8n/config/src/__tests__/ |
| エディター UI | Vitest | Vue Test Utils + Pinia | packages/frontend/editor-ui/src/**/__tests__/ |
| E2E/キャンバス | Playwright | テストコンテナー + composables | packages/testing/playwright/ |
ステップ 3:ソースファイルを特定する
影響を受ける領域のソースコードを探します。
- チケットに記載されたノード/サービス/コンポーネントを検索します
- GenericFunctions ファイルを探します(ノードでよくバグが発生する場所です)
- 同じ領域に既存のテストファイルがあるか確認します
- 影響を受けるファイルの最近の Git 履歴を確認します(
git log --oneline -10 -- <path>)
ステップ 4:コードパスを追跡する
ソースコードを読み、バグを引き起こす実行パスを追跡します。
- エントリーポイントから障害発生箇所までの呼び出しチェーンをたどります
- バグが発生する具体的な行を特定します
- バグの周辺にあるエラー処理(またはその欠如)を記録します
ステップ 5:仮説を立てる
明確で検証可能な仮説を述べます。
- 「[入力/条件] のとき、[根本原因] により、コードが [誤った処理] を行う」
- 変更が必要な具体的な行を特定します
- テストの出力に何が表示されるか予測します
ステップ 6:テストパターンを探す
同じ領域の既存テストを調べます。
- 影響を受けるコードの近くにある
test/ディレクトリを確認します - 使用されているモック/セットアップのパターンを特定します
- 一貫性を保つため、同じパターンを使います
- テストがない場合は、最も近い類似ノード/サービスのテストをテンプレートとして探します
ステップ 7:失敗するテストを書く
以下の条件を満たす回帰テストを書きます。
- ステップ 6 で見つけたパターンを使います
- ステップ 5 の具体的な仮説を検証します
- チケット ID を参照するコメントを含めます
- 正しい動作をアサートします(現行コードではテストが失敗します)
- セットアップが機能していることを証明する「正常系」のテストも含めます
ステップ 8:実行して評価する
パッケージのディレクトリからテストを実行します(例:cd packages/nodes-base && pnpm test <file>)。
結果を分類します。
| 確度 | 基準 | 出力 |
|---|---|---|
| 確認済み | テストが一貫して失敗し、その失敗が仮説と一致する | 再現レポート |
| 可能性が高い | テストは失敗するが、失敗の仕方が少し異なる | レポート + 注意事項 |
| 未確認 | 障害を発生させられない | 試した内容を記載したレポート |
| スキップ | 重大な中止条件に該当した | スキップした理由を記載したレポート |
| 修正済み | 現行コードではバグを再現できなくなっている | 修正時期を記載したレポート |
ステップ 9:再試行するか、断念する
最初の試行後も UNCONFIRMED の場合:
- 仮説を見直します — コードパスを読み直します
- 別のテスト方法またはレイヤーを試します
- UNCONFIRMED と判定する前に、試行は最大 3 回までです
即時中止の条件(直ちに中止してください):
- 実際のサードパーティ API 認証情報が必要
- 競合状態、またはタイミングに依存する
- 特定のクラウド/エンタープライズインフラが必要
- スクリプト化できない手動の UI 操作が必要
出力:再現レポート
以下の形式で調査結果を提示します:
チケット: [ID] — [タイトル] 確信度: [CONFIRMED | LIKELY | UNCONFIRMED | SKIPPED | ALREADY_FIXED]
根本原因
[バグの仕組みを説明する 1~2 文]
場所
| ファイル | 行 | 問題 |
|---|---|---|
path/to/file.ts | XX-YY | 問題の説明 |
失敗するテスト
path/to/test/file.test.ts — X/Y 件のテストが失敗:
test name— [失敗の説明]
修正のヒント
[修正方法の擬似コードまたは説明]
重要
- バグを修正しないでください — 失敗するテストで再現するだけにしてください
- 証拠としてテストファイルを残してください(依頼がない限りコミットしないでください)
- パッケージのディレクトリからテストを実行してください(例:
pushd packages/nodes-base && pnpm test <file> && popd) - ビルド出力は必ずリダイレクトしてください:
pnpm build > build.log 2>&1 - 既存の修正 PR を確認しないでください — 手がかりだけをもとに再現することが目的です
コメント
Markdown 対応