
N8n Workflow Testing Fundamentals
- 151 installs
- 433 repo stars
- Updated August 4, 2026
- proffesor-for-testing/agentic-qe
Learn baseline n8n test design—fixtures, mocked triggers, node assertions, and failure isolation—for reliable agentic-qe automation graphs.
About
n8n-workflow-testing-fundamentals from proffesor-for-testing/agentic-qe teaches essential patterns to test n8n automations with fixtures, mocked triggers, node-level assertions, and clear failure diagnostics.
- Core n8n test patterns and fixtures
- Trigger mocking and node assertions
- Failure isolation in workflow graphs
- Foundational agentic-qe coverage
- Prepares advanced security testing
N8n Workflow Testing Fundamentals by the numbers
- 151 all-time installs (skills.sh)
- +3 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #887 of 2,153 Testing & QA skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/proffesor-for-testing/agentic-qe --skill n8n-workflow-testing-fundamentalsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 151 |
|---|---|
| repo stars | ★ 433 |
| Last updated | August 4, 2026 |
| Repository | proffesor-for-testing/agentic-qe ↗ |
What it does
Learn baseline n8n test design—fixtures, mocked triggers, node assertions, and failure isolation—for reliable agentic-qe automation graphs.
Files
n8n Workflow Testing Fundamentals
<default_to_action> When testing n8n workflows: 1. VALIDATE workflow structure before execution 2. TEST with realistic test data 3. VERIFY node-to-node data flow 4. CHECK error handling paths 5. MEASURE execution performance
Quick n8n Testing Checklist:
- All nodes properly connected (no orphans)
- Trigger node correctly configured
- Data mappings between nodes valid
- Error workflows defined
- Credentials properly referenced
Critical Success Factors:
- Test each execution path separately
- Validate data transformations at each node
- Check retry and error handling behavior
- Verify integrations with external services
</default_to_action>
Quick Reference Card
When to Use
- Testing new n8n workflows
- Validating workflow changes
- Debugging failed executions
- Performance optimization
- Pre-deployment validation
n8n Workflow Components
| Component | Purpose | Testing Focus |
|---|---|---|
| Trigger | Starts workflow | Reliable activation, payload handling |
| Action Nodes | Process data | Configuration, data mapping |
| Logic Nodes | Control flow | Conditional routing, branches |
| Integration Nodes | External APIs | Auth, rate limits, errors |
| Error Workflow | Handle failures | Recovery, notifications |
Workflow Execution States
| State | Meaning | Test Action |
|---|---|---|
running | Currently executing | Monitor progress |
success | Completed successfully | Validate outputs |
failed | Execution failed | Analyze error |
waiting | Waiting for trigger | Test trigger mechanism |
---
Workflow Structure Validation
// Validate workflow structure before execution
async function validateWorkflowStructure(workflowId: string) {
const workflow = await getWorkflow(workflowId);
// Check for trigger node
const triggerNode = workflow.nodes.find(n =>
n.type.includes('trigger') || n.type.includes('webhook')
);
if (!triggerNode) {
throw new Error('Workflow must have a trigger node');
}
// Check for orphan nodes (no connections)
const connectedNodes = new Set();
for (const [source, targets] of Object.entries(workflow.connections)) {
connectedNodes.add(source);
for (const outputs of Object.values(targets)) {
for (const connections of outputs) {
for (const conn of connections) {
connectedNodes.add(conn.node);
}
}
}
}
const orphans = workflow.nodes.filter(n => !connectedNodes.has(n.name));
if (orphans.length > 0) {
console.warn('Orphan nodes detected:', orphans.map(n => n.name));
}
// Validate credentials
for (const node of workflow.nodes) {
if (node.credentials) {
for (const [type, ref] of Object.entries(node.credentials)) {
if (!await credentialExists(ref.id)) {
throw new Error(`Missing credential: ${type} for node ${node.name}`);
}
}
}
}
return { valid: true, orphans, triggerNode };
}---
Execution Testing
// Test workflow execution with various inputs
async function testWorkflowExecution(workflowId: string, testCases: TestCase[]) {
const results: TestResult[] = [];
for (const testCase of testCases) {
const startTime = Date.now();
// Execute workflow
const execution = await executeWorkflow(workflowId, testCase.input);
// Wait for completion
const result = await waitForCompletion(execution.id, testCase.timeout || 30000);
// Validate output
const outputValid = validateOutput(result.data, testCase.expected);
results.push({
testCase: testCase.name,
success: result.status === 'success' && outputValid,
duration: Date.now() - startTime,
actualOutput: result.data,
expectedOutput: testCase.expected
});
}
return results;
}
// Example test cases
const testCases = [
{
name: 'Valid customer data',
input: { name: 'John Doe', email: 'john@example.com' },
expected: { processed: true, customerId: /^cust_/ },
timeout: 10000
},
{
name: 'Missing email',
input: { name: 'Jane Doe' },
expected: { error: 'Email required' },
timeout: 5000
},
{
name: 'Invalid email format',
input: { name: 'Bob', email: 'not-an-email' },
expected: { error: 'Invalid email' },
timeout: 5000
}
];---
Data Flow Validation
// Trace data through workflow nodes
async function validateDataFlow(executionId: string) {
const execution = await getExecution(executionId);
const nodeResults = execution.data.resultData.runData;
const dataFlow: DataFlowStep[] = [];
for (const [nodeName, runs] of Object.entries(nodeResults)) {
for (const run of runs) {
dataFlow.push({
node: nodeName,
input: run.data?.main?.[0]?.[0]?.json || {},
output: run.data?.main?.[0]?.[0]?.json || {},
executionTime: run.executionTime,
status: run.executionStatus
});
}
}
// Validate data transformations
for (let i = 1; i < dataFlow.length; i++) {
const prev = dataFlow[i - 1];
const curr = dataFlow[i];
// Check if expected data passed through
validateDataMapping(prev.output, curr.input);
}
return dataFlow;
}
// Validate data mapping between nodes
function validateDataMapping(sourceOutput: any, targetInput: any) {
// Check all required fields are present
const missingFields: string[] = [];
for (const [key, value] of Object.entries(targetInput)) {
if (value === undefined && sourceOutput[key] === undefined) {
missingFields.push(key);
}
}
if (missingFields.length > 0) {
console.warn('Missing fields in data mapping:', missingFields);
}
return missingFields.length === 0;
}---
Error Handling Testing
// Test error handling paths
async function testErrorHandling(workflowId: string) {
const errorScenarios = [
{
name: 'API timeout',
inject: { delay: 35000 }, // Trigger timeout
expectedError: 'timeout'
},
{
name: 'Invalid data',
inject: { invalidField: true },
expectedError: 'validation'
},
{
name: 'Missing credentials',
inject: { removeCredentials: true },
expectedError: 'authentication'
}
];
const results: ErrorTestResult[] = [];
for (const scenario of errorScenarios) {
// Execute with error injection
const execution = await executeWithErrorInjection(workflowId, scenario.inject);
// Check error was caught
const result = await waitForCompletion(execution.id);
// Validate error handling
results.push({
scenario: scenario.name,
errorCaught: result.status === 'failed',
errorType: result.data?.resultData?.error?.type,
expectedError: scenario.expectedError,
errorWorkflowTriggered: await checkErrorWorkflowTriggered(execution.id),
alertSent: await checkAlertSent(execution.id)
});
}
return results;
}
// Verify error workflow was triggered
async function checkErrorWorkflowTriggered(executionId: string): Promise<boolean> {
const errorExecutions = await getExecutions({
filter: {
metadata: { errorTriggeredBy: executionId }
}
});
return errorExecutions.length > 0;
}---
Node Connection Patterns
Linear Flow
Trigger → Process → Transform → OutputTesting: Execute once, validate each node output
Branching Flow
Trigger → IF → [Branch A] → Merge → Output
→ [Branch B] →Testing: Test both branches separately, verify merge behavior
Parallel Flow
Trigger → Split → [Process A] → Merge → Output
→ [Process B] →Testing: Validate parallel execution, check merge timing
Loop Flow
Trigger → SplitInBatches → Process → [Loop back until done] → OutputTesting: Test with varying batch sizes, verify all items processed
---
Common Testing Patterns
Test Data Generation
// Generate test data for common n8n patterns
const testDataGenerators = {
webhook: () => ({
body: { event: 'test', timestamp: new Date().toISOString() },
headers: { 'Content-Type': 'application/json' },
query: { source: 'test' }
}),
slack: () => ({
type: 'message',
channel: 'C123456',
user: 'U789012',
text: 'Test message'
}),
github: () => ({
action: 'opened',
issue: {
number: 1,
title: 'Test Issue',
body: 'Test body'
},
repository: {
full_name: 'test/repo'
}
}),
stripe: () => ({
type: 'payment_intent.succeeded',
data: {
object: {
id: 'pi_test123',
amount: 1000,
currency: 'usd'
}
}
})
};Execution Assertions
// Common assertions for workflow execution
const workflowAssertions = {
// Assert workflow completed
assertCompleted: (execution) => {
expect(execution.finished).toBe(true);
expect(execution.status).toBe('success');
},
// Assert specific node executed
assertNodeExecuted: (execution, nodeName) => {
const nodeData = execution.data.resultData.runData[nodeName];
expect(nodeData).toBeDefined();
expect(nodeData[0].executionStatus).toBe('success');
},
// Assert data transformation
assertDataTransformed: (execution, nodeName, expectedData) => {
const nodeOutput = execution.data.resultData.runData[nodeName][0].data.main[0][0].json;
expect(nodeOutput).toMatchObject(expectedData);
},
// Assert execution time
assertExecutionTime: (execution, maxMs) => {
const duration = new Date(execution.stoppedAt) - new Date(execution.startedAt);
expect(duration).toBeLessThan(maxMs);
}
};---
Agent Coordination Hints
Memory Namespace
aqe/n8n/
├── workflows/* - Cached workflow definitions
├── test-results/* - Test execution results
├── validations/* - Validation reports
├── patterns/* - Discovered testing patterns
└── executions/* - Execution trackingFleet Coordination
// Comprehensive n8n testing with fleet
const n8nFleet = await FleetManager.coordinate({
strategy: 'n8n-testing',
agents: [
'n8n-workflow-executor', // Execute and validate
'n8n-node-validator', // Validate configurations
'n8n-trigger-test', // Test triggers
'n8n-expression-validator', // Validate expressions
'n8n-integration-test' // Test integrations
],
topology: 'parallel'
});---
Related Skills
- n8n-expression-testing - Expression validation
- n8n-trigger-testing-strategies - Trigger testing
- n8n-integration-testing-patterns - Integration testing
- n8n-security-testing - Security validation
---
Remember
n8n workflows are JSON-based execution flows that connect 400+ services. Testing requires validating:
- Workflow structure (nodes, connections)
- Trigger reliability (webhooks, schedules)
- Data flow (transformations between nodes)
- Error handling (retry, fallback, notifications)
- Performance (execution time, resource usage)
With Agents: Use n8n-workflow-executor for execution testing, n8n-node-validator for configuration validation, and coordinate multiple agents for comprehensive workflow testing.
# =============================================================================
# AQE Skill Evaluation Test Suite: n8n Workflow Testing Fundamentals v1.0.0
# =============================================================================
#
# Comprehensive evaluation suite for n8n workflow testing fundamentals.
# Tests workflow structure validation, node connection validation, data flow,
# error handling, trigger configuration, and execution performance.
#
# Schema: .claude/skills/.validation/schemas/skill-eval.schema.json
# Validator: .claude/skills/n8n-workflow-testing-fundamentals/scripts/validate-config.json
#
# Coverage:
# - Workflow structure validation
# - Node connectivity and orphan detection
# - Data flow between nodes
# - Trigger configuration validation
# - Error handling paths
# - Execution performance metrics
#
# =============================================================================
skill: n8n-workflow-testing-fundamentals
version: 1.0.0
description: >
Comprehensive evaluation suite for n8n workflow testing fundamentals.
Tests workflow structure validation, node-to-node connectivity, data flow
validation, trigger configuration, error handling paths, and execution
performance measurement for n8n automation workflows.
# =============================================================================
# Multi-Model Configuration
# =============================================================================
models_to_test:
- claude-sonnet-4-6 # Primary (high accuracy expected)
- claude-haiku-4-5 # Fast model (minimum quality floor)
# =============================================================================
# MCP Integration Configuration
# =============================================================================
mcp_integration:
enabled: true
namespace: skill-validation
query_patterns: true
track_outcomes: true
store_patterns: true
share_learning: true
update_quality_gate: true
target_agents:
- qe-learning-coordinator
- qe-queen-coordinator
- n8n-workflow-executor
# =============================================================================
# ReasoningBank Learning Configuration
# =============================================================================
learning:
store_success_patterns: true
store_failure_patterns: true
pattern_ttl_days: 90
min_confidence_to_store: 0.7
cross_model_comparison: true
# =============================================================================
# Result Format Configuration
# =============================================================================
result_format:
json_output: true
markdown_report: true
include_raw_output: false
include_timing: true
include_token_usage: true
# =============================================================================
# Environment Setup
# =============================================================================
setup:
required_tools:
- jq
environment_variables:
WORKFLOW_VALIDATION: "true"
DATA_FLOW_CHECKING: "strict"
# =============================================================================
# TEST CASES
# =============================================================================
test_cases:
# ---------------------------------------------------------------------------
# CATEGORY: Workflow Structure Validation
# ---------------------------------------------------------------------------
- id: tc001_workflow_structure_validation
description: "Validate complete workflow structure"
category: structure
priority: critical
input:
workflow:
name: "User Data Processing"
version: 1
nodes:
- id: 1
name: "Webhook"
type: webhook
parameters:
method: POST
connections:
- from: 1
to: 2
required_fields:
- name
- trigger_node
validation_checks:
- has_trigger: true
- has_nodes: true
- properly_connected: true
context:
workflow_type: "automation"
expected_output:
must_contain:
- "valid"
- "structure"
- "complete"
must_not_contain:
- "invalid"
severity_classification: info
finding_count:
max: 1
validation:
schema_check: true
keyword_match_threshold: 0.8
reasoning_quality_min: 0.75
timeout_ms: 30000
- id: tc002_orphan_node_detection
description: "Detect orphan nodes not connected to flow"
category: structure
priority: critical
input:
workflow_nodes:
- id: 1
name: "Webhook"
connections_out: [2]
- id: 2
name: "Transform"
connections_in: [1]
connections_out: [3]
- id: 3
name: "Send Email"
connections_in: [2]
- id: 4
name: "Log"
connections_in: []
connections_out: []
context:
issue: "node 4 is orphaned"
expected_output:
must_contain:
- "orphan"
- "node 4"
- "disconnected"
must_not_contain:
- "all connected"
severity_classification: high
validation:
schema_check: true
keyword_match_threshold: 0.8
# ---------------------------------------------------------------------------
# CATEGORY: Trigger Configuration
# ---------------------------------------------------------------------------
- id: tc003_webhook_trigger_configuration
description: "Validate webhook trigger is properly configured"
category: triggers
priority: critical
input:
trigger_config:
type: "webhook"
method: POST
path: "/api/users"
authentication: "none"
body_validation: true
required_config:
- method_defined: true
- path_defined: true
- test_data_available: true
context:
workflow_start: true
expected_output:
must_contain:
- "webhook"
- "trigger"
- "configured"
must_not_contain:
- "missing"
severity_classification: critical
validation:
schema_check: true
keyword_match_threshold: 0.85
- id: tc004_schedule_trigger_validation
description: "Validate scheduled trigger (cron) configuration"
category: triggers
priority: high
input:
trigger_config:
type: "schedule"
cron_expression: "0 9 * * MON-FRI"
timezone: "UTC"
description: "Runs at 9 AM weekdays"
validation:
- cron_syntax_valid: true
- timezone_valid: true
- next_run_calculable: true
context:
workflow_start: true
expected_output:
must_contain:
- "schedule"
- "trigger"
- "valid"
- "cron"
must_not_contain:
- "invalid"
severity_classification: info
validation:
schema_check: true
keyword_match_threshold: 0.8
# ---------------------------------------------------------------------------
# CATEGORY: Node-to-Node Data Flow
# ---------------------------------------------------------------------------
- id: tc005_data_flow_validation
description: "Validate data flows correctly between nodes"
category: data_flow
priority: critical
input:
nodes:
- name: "API Call"
output_schema:
type: object
properties:
user_id: integer
email: string
name: string
- name: "Transform"
input_mapping:
user_id: "{{ $node['API Call'].json.user_id }}"
email: "{{ $node['API Call'].json.email }}"
full_name: "{{ $node['API Call'].json.name }}"
input_valid: true
- name: "Database Insert"
input_valid: true
context:
data_flow: "validated"
expected_output:
must_contain:
- "data flow"
- "valid"
- "mapped"
must_not_contain:
- "mismatch"
severity_classification: info
validation:
schema_check: true
keyword_match_threshold: 0.8
- id: tc006_missing_data_mapping_detection
description: "Detect missing or incorrect data mappings"
category: data_flow
priority: critical
input:
nodes:
- name: "API Call"
output:
user_id: 123
email: "user@example.com"
- name: "Transform"
input_mapping:
user_id: "{{ $node['API Call'].json.user_id }}"
email: "{{ $node['API Call'].json.user_email }}" # Wrong key!
- name: "Database"
requires_email: true
issue: "email will be null"
context:
data_validation: strict
expected_output:
must_contain:
- "mapping"
- "incorrect"
- "user_email"
- "email"
must_not_contain:
- "all correct"
severity_classification: high
validation:
schema_check: true
keyword_match_threshold: 0.85
# ---------------------------------------------------------------------------
# CATEGORY: Error Handling
# ---------------------------------------------------------------------------
- id: tc007_error_handling_paths
description: "Validate error handling paths are defined"
category: error_handling
priority: critical
input:
nodes:
- name: "HTTP Request"
error_handler_defined: true
error_output_connected: true
- name: "Database Operation"
error_handler_defined: false
error_output_connected: false
issue: "no error handling"
- name: "Send Notification"
error_handler_defined: true
error_output_connected: true
context:
requirement: "all critical nodes have error handlers"
expected_output:
must_contain:
- "error"
- "handling"
- "missing"
- "Database"
must_not_contain:
- "complete"
severity_classification: high
validation:
schema_check: true
keyword_match_threshold: 0.85
- id: tc008_error_recovery_validation
description: "Verify error recovery mechanisms work"
category: error_handling
priority: high
input:
error_scenarios:
- scenario: "API timeout"
recovery: "retry with exponential backoff"
max_retries: 3
working: true
- scenario: "Database connection failure"
recovery: "wait and retry"
wait_seconds: 30
max_retries: 2
working: true
- scenario: "Invalid data"
recovery: "send to error queue"
error_queue_configured: true
working: true
context:
testing: "error scenarios"
expected_output:
must_contain:
- "error"
- "recovery"
- "working"
must_not_contain:
- "failed"
severity_classification: info
validation:
schema_check: true
keyword_match_threshold: 0.75
# ---------------------------------------------------------------------------
# CATEGORY: Execution Performance
# ---------------------------------------------------------------------------
- id: tc009_workflow_execution_time
description: "Measure and validate workflow execution time"
category: performance
priority: high
input:
execution_metrics:
- run_number: 1
duration_ms: 2450
- run_number: 2
duration_ms: 2380
- run_number: 3
duration_ms: 2520
performance_target:
max_ms: 5000
average_ms: 2500
context:
node_count: 5
api_calls: 2
expected_output:
must_contain:
- "execution"
- "time"
- "performance"
- "ms"
must_not_contain:
- "timeout"
severity_classification: info
validation:
schema_check: true
keyword_match_threshold: 0.75
- id: tc010_memory_usage_validation
description: "Monitor memory usage during workflow execution"
category: performance
priority: medium
input:
memory_metrics:
- operation: "Large array processing"
items_count: 50000
peak_memory_mb: 320
warning_threshold_mb: 500
status: "ok"
- operation: "JSON transformation"
items_count: 100000
peak_memory_mb: 680
warning_threshold_mb: 500
status: "warning"
context:
execution_environment: "cloud"
expected_output:
must_contain:
- "memory"
- "usage"
- "warning"
must_not_contain:
- "no issues"
severity_classification: medium
validation:
schema_check: true
keyword_match_threshold: 0.75
# =============================================================================
# SUCCESS CRITERIA
# =============================================================================
success_criteria:
pass_rate: 0.85
critical_pass_rate: 1.0
avg_reasoning_quality: 0.75
max_execution_time_ms: 300000
cross_model_variance: 0.15
# =============================================================================
# METADATA
# =============================================================================
metadata:
author: "n8n-workflow-executor"
created: "2026-02-02"
last_updated: "2026-02-02"
coverage_target: >
n8n workflow testing fundamentals including workflow structure validation,
orphan node detection, trigger configuration (webhook, schedule), node-to-node
data flow validation, error handling paths, error recovery mechanisms, and
execution performance monitoring (time, memory). 10 test cases with 85% pass
rate and 100% critical pass rate.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://agentic-qe.dev/schemas/skills/n8n-workflow-testing-fundamentals/output.json",
"title": "N8N Workflow Testing Fundamentals Skill Output Schema",
"description": "Schema for n8n-workflow-testing-fundamentals skill output. Validates workflow structure, node connections, and test coverage.",
"type": "object",
"required": ["skillName", "version", "timestamp", "status", "trustTier", "output"],
"properties": {
"skillName": {
"type": "string",
"const": "n8n-workflow-testing-fundamentals"
},
"version": {
"type": "string",
"pattern": "^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9]+)?$"
},
"timestamp": {
"type": "string",
"format": "date-time"
},
"status": {
"type": "string",
"enum": ["success", "partial", "failed", "skipped"]
},
"trustTier": {
"type": "integer",
"const": 3
},
"output": {
"type": "object",
"required": ["summary", "workflowValidation", "nodeTests"],
"properties": {
"summary": {
"type": "string",
"minLength": 20,
"maxLength": 2000
},
"workflowValidation": {
"$ref": "#/$defs/workflowValidation"
},
"nodeTests": {
"type": "array",
"items": {
"$ref": "#/$defs/nodeTest"
},
"maxItems": 500
},
"connectionTests": {
"type": "array",
"items": {
"$ref": "#/$defs/connectionTest"
}
},
"dataFlowTests": {
"type": "array",
"items": {
"$ref": "#/$defs/dataFlowTest"
}
},
"errorHandlingTests": {
"type": "array",
"items": {
"$ref": "#/$defs/errorHandlingTest"
}
},
"structuralIssues": {
"type": "array",
"items": {
"$ref": "#/$defs/structuralIssue"
}
},
"testCoverage": {
"$ref": "#/$defs/testCoverage"
},
"recommendations": {
"type": "array",
"items": {
"$ref": "#/$defs/recommendation"
},
"maxItems": 50
},
"metrics": {
"$ref": "#/$defs/metrics"
}
}
},
"metadata": {
"$ref": "#/$defs/metadata"
},
"validation": {
"$ref": "#/$defs/validationResult"
},
"learning": {
"$ref": "#/$defs/learningData"
}
},
"$defs": {
"workflowValidation": {
"type": "object",
"required": ["workflowId", "valid"],
"properties": {
"workflowId": { "type": "string" },
"workflowName": { "type": "string" },
"valid": { "type": "boolean" },
"totalNodes": { "type": "integer", "minimum": 0 },
"totalConnections": { "type": "integer", "minimum": 0 },
"hasTrigger": { "type": "boolean" },
"hasEndNode": { "type": "boolean" },
"isLinear": { "type": "boolean" },
"hasBranching": { "type": "boolean" },
"hasLoops": { "type": "boolean" },
"hasErrorHandling": { "type": "boolean" },
"complexityScore": { "type": "number", "minimum": 0, "maximum": 100 },
"testabilityScore": { "type": "number", "minimum": 0, "maximum": 100 },
"overallScore": { "type": "number", "minimum": 0, "maximum": 100 },
"grade": { "type": "string", "pattern": "^[A-F][+-]?$" }
}
},
"nodeTest": {
"type": "object",
"required": ["nodeId", "nodeName", "nodeType", "status"],
"properties": {
"nodeId": { "type": "string" },
"nodeName": { "type": "string" },
"nodeType": { "type": "string" },
"status": { "type": "string", "enum": ["passed", "failed", "skipped", "untested"] },
"testCases": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": { "type": "string" },
"input": { "type": "object" },
"expectedOutput": {},
"actualOutput": {},
"passed": { "type": "boolean" }
}
}
},
"coverage": { "type": "number", "minimum": 0, "maximum": 100 },
"issues": { "type": "array", "items": { "type": "string" } }
}
},
"connectionTest": {
"type": "object",
"required": ["sourceNode", "targetNode", "valid"],
"properties": {
"sourceNode": { "type": "string" },
"targetNode": { "type": "string" },
"connectionType": { "type": "string", "enum": ["main", "error", "conditional"] },
"valid": { "type": "boolean" },
"dataFlowVerified": { "type": "boolean" },
"issues": { "type": "array", "items": { "type": "string" } }
}
},
"dataFlowTest": {
"type": "object",
"required": ["id", "path", "status"],
"properties": {
"id": { "type": "string", "pattern": "^FLOW-\\d{3,6}$" },
"path": { "type": "array", "items": { "type": "string" } },
"status": { "type": "string", "enum": ["passed", "failed", "partial"] },
"inputData": { "type": "object" },
"outputData": { "type": "object" },
"transformations": { "type": "array", "items": { "type": "string" } }
}
},
"errorHandlingTest": {
"type": "object",
"required": ["scenario", "handled"],
"properties": {
"scenario": { "type": "string" },
"errorType": { "type": "string", "enum": ["timeout", "connection", "validation", "authentication", "rate-limit", "unknown"] },
"handled": { "type": "boolean" },
"recoveryPath": { "type": "string" },
"notificationConfigured": { "type": "boolean" }
}
},
"structuralIssue": {
"type": "object",
"required": ["issueType", "severity"],
"properties": {
"issueType": {
"type": "string",
"enum": ["orphan-node", "missing-trigger", "dead-end", "circular-reference", "missing-error-handler", "duplicate-node"]
},
"severity": { "type": "string", "enum": ["critical", "high", "medium", "low"] },
"affectedNodes": { "type": "array", "items": { "type": "string" } },
"description": { "type": "string" },
"fix": { "type": "string" }
}
},
"testCoverage": {
"type": "object",
"properties": {
"nodeCoverage": { "type": "number", "minimum": 0, "maximum": 100 },
"connectionCoverage": { "type": "number", "minimum": 0, "maximum": 100 },
"pathCoverage": { "type": "number", "minimum": 0, "maximum": 100 },
"errorPathCoverage": { "type": "number", "minimum": 0, "maximum": 100 },
"overallCoverage": { "type": "number", "minimum": 0, "maximum": 100 },
"untestedNodes": { "type": "array", "items": { "type": "string" } },
"untestedPaths": { "type": "array", "items": { "type": "string" } }
}
},
"recommendation": {
"type": "object",
"required": ["id", "title", "priority"],
"properties": {
"id": { "type": "string", "pattern": "^REC-\\d{3,6}$" },
"title": { "type": "string", "maxLength": 200 },
"description": { "type": "string", "maxLength": 2000 },
"priority": { "type": "string", "enum": ["critical", "high", "medium", "low"] },
"category": { "type": "string", "enum": ["coverage", "structure", "reliability", "performance", "maintainability"] }
}
},
"metrics": {
"type": "object",
"properties": {
"totalNodes": { "type": "integer", "minimum": 0 },
"testedNodes": { "type": "integer", "minimum": 0 },
"passedTests": { "type": "integer", "minimum": 0 },
"failedTests": { "type": "integer", "minimum": 0 },
"coverage": { "type": "number", "minimum": 0, "maximum": 100 },
"structuralIssues": { "type": "integer", "minimum": 0 },
"executionTimeMs": { "type": "integer", "minimum": 0 }
}
},
"metadata": {
"type": "object",
"properties": {
"executionTimeMs": { "type": "integer", "minimum": 0 },
"toolsUsed": { "type": "array", "items": { "type": "string" } },
"agentId": { "type": "string", "pattern": "^qe-[a-z][a-z0-9-]*$" },
"n8nVersion": { "type": "string" },
"workflowPath": { "type": "string" }
}
},
"validationResult": {
"type": "object",
"properties": {
"schemaValid": { "type": "boolean" },
"contentValid": { "type": "boolean" },
"confidence": { "type": "number", "minimum": 0, "maximum": 1 }
}
},
"learningData": {
"type": "object",
"properties": {
"patternsDetected": { "type": "array", "items": { "type": "string" } },
"reward": { "type": "number", "minimum": 0, "maximum": 1 }
}
}
}
}
{
"skillName": "n8n-workflow-testing-fundamentals",
"skillVersion": "1.0.0",
"requiredTools": [
"jq"
],
"optionalTools": [],
"schemaPath": "schemas/output.json",
"requiredFields": [
"skillName",
"status",
"output",
"output.summary",
"output.workflowValidation",
"output.nodeTests"
],
"requiredNonEmptyFields": [],
"mustContainTerms": [
"workflow",
"n8n",
"test"
],
"mustNotContainTerms": [
"TODO",
"FIXME"
],
"enumValidations": {
".status": [
"success",
"partial",
"failed",
"skipped"
]
}
}