Using the tools together
Each tool installs and runs on its own. None of them lists another as a dependency, and none of them needs another to be installed or running. Where two of them meet, one writes a file or serves a port that the other reads, and each side works without it. This page lists every place they meet and what each tool does when the other one is not there.
| Together | What you get | Without the other tool |
|---|---|---|
| workflow-tester + integration-mock | run --mock answers HTTP Request nodes from a local mock, offline; run --live runs the whole workflow on your n8n instance against it | run reports the cases that describe a mock as needing it and does not fail them. Every other case runs |
| workflow-lint → workflow-render | Lint findings drawn as badges on the workflow picture | workflow-lint writes its other formats; workflow-render draws the workflow without badges |
| integration-mock → workflow-render, workflow-tester | The redacted execution a snapshot saves is drawn, or captured, with no second call to the instance | Both read an execution you export from n8n's API |
workflow-tester and integration-mock
A test case uses the mock when it has given.packs, given.faults, given.seed, then.calls or then.noUnmatched. Only those cases do. A case whose only mock key is given.snapshot needs no running mock: offline, the execution saved beside the snapshot stands in for the nodes workflow-tester cannot run.
With both, offline (no n8n instance; HTTP Request nodes are answered by the mock):
integration-mock start
workflow-tester run --mock
With both, on your instance:
integration-mock start && integration-mock packs enable acme
export N8N_API_URL=https://n8n.example.com N8N_API_KEY=…
workflow-tester run --live
Without integration-mock:
| You run | The cases that need the mock | Every other case | Exit code |
|---|---|---|---|
workflow-tester run | Reported as needing the mock, naming the keys and --mock or --live (· in the terminal, skipped in JUnit). Not failed | Run as usual | From the other cases only, --fail-on warn included |
workflow-tester run --mock, mock not started | Fail with cannot reach integration-mock at <url> — is it started? | Run as usual | 1 |
workflow-tester run --live, mock not started | Fail with cannot reach integration-mock at <url> — is it started? | Run as usual | 1 |
To leave the mock out, run without --mock or --live. A test file without those keys never contacts it. Without workflow-tester, integration-mock is unchanged: you run your workflows against it in n8n yourself.
See Running offline against the mock and Running live against the mock.
workflow-lint and workflow-render
With both:
workflow-lint lint workflow.json --format canvas-overlay > findings.json
workflow-render export workflow.json -o workflow.png --overlay findings.json
Each node with a finding gets a ring and a count badge.
Without workflow-render, canvas-overlay is a plain JSON file, and every other format (stylish, json, sarif, junit, github-actions) needs nothing else. Without workflow-lint, leave out --overlay: the workflow is drawn exactly as it is with an empty overlay. Any tool, or you, can write an overlay.
The snapshot export
integration-mock snapshot saves the execution it used, redacted, as .integration-mock/snapshots/<workflow id>/<execution id>.export.json, whether or not you have the other tools.
With them:
workflow-render export .integration-mock/snapshots/<workflow id>/<execution id>.export.json -o run.svg
workflow-tester capture workflows/x.json --execution .integration-mock/snapshots/<workflow id>/<execution id>.export.json
Without integration-mock, save the execution from n8n's API (GET /api/v1/executions/<id>?includeData=true) and pass that file instead. See Capturing real runs.