TestLens

See what your API tests miss

Instantly measure your API test coverage and identify missing endpoints in seconds.

🚀 Analyze Coverage

No login required • 100% free • Runs in your browser

Why TestLens?

  • Find untested endpoints instantly
  • Improve API test confidence
  • No setup, no login
1

Swagger

File or URL

2

Postman

Collection JSON

3

Compare

Run report

Upload your files to analyze API coverage

All processing runs in your browser — nothing is uploaded to a server.

GitHub Pages & OpenAPI URLs

Pasting an OpenAPI URL may fail until you upload the JSON file (most reliable) or hard-refresh after updates. Ad blockers can block CORS relays.

CORS & fetch

Many APIs block direct fetch from GitHub Pages. This app can use your own CORS proxy (npm run openapi-proxy) or public relays. Relays often reject internal or beta URLs. If loading fails, set the optional proxy under the spec URL, save the OpenAPI JSON and upload it, or add Access-Control-Allow-Origin on the spec URL.

Run analysis

Upload your OpenAPI spec (JSON or YAML) and your collection (Postman · Insomnia · Bruno · HAR), then click Compare.

How to get your coverage report (step by step)
  1. Prepare your OpenAPI / Swagger spec. Supports .json, .yaml, and .yml files. Prefer uploading the file (most reliable). You can also paste a URL — if that fails (CORS block), open the URL in a new tab, Save As (Cmd+S / Ctrl+S), and upload the saved file.
  2. Export your collection from your API tool. The format is auto-detected — no manual conversion needed:
    • Postman v2.1 (recommended) — collection ··· menu → Export → Collection v2.1
    • Postman v1 — collection ··· menu → Export → Collection v1
    • Insomnia — Application menu → Export Data → Current Workspace → export as JSON
    • Bruno — right-click the collection → Export → save as JSON
    • HAR file — browser DevTools → Network tab → right-click any request → "Save all as HAR"; or export from Proxyman / Charles / Fiddler
  3. Upload your OpenAPI spec in the left panel — drag & drop or click to browse. Paste a URL there too if you prefer.
  4. Upload your collection file in the right panel. Drop any supported format — TestLens detects it automatically and shows a confirmation toast.
  5. Click "Compare coverage." You will see summary metrics, a coverage progress bar, and three lists — Covered, Missing, and Extra. Download results as Markdown, CSV, or PDF, or open the visual dashboard.

Different path parameter names between spec and collection?

You do not need to configure anything. TestLens compares paths by method, segment shape, and literal text — a {name} in the spec matches the same slot in any collection even if the brace name differs or a concrete value like 123 is used. Open How path matching works below for the full rules.

Supported file formats (click to expand)

OpenAPI / Swagger spec (left panel)

OpenAPI JSON .json

OpenAPI 2 (Swagger), 3.0, 3.1 in JSON format. Most tools export this by default.

OpenAPI YAML .yaml / .yml

Same spec in YAML format — common when authoring specs by hand or with code-first generators.

Collection / capture file (right panel — auto-detected)

Postman v2 / v2.1 .json

Export: collection ··· menu → Export → Collection v2.1 (recommended)

Postman v1 .json

Export: collection ··· menu → Export → Collection v1

Insomnia v4 .json

Export: Application → Export Data → Current Workspace → select Insomnia v4 JSON

Bruno .json

Export: right-click the collection in the sidebar → Export → save as JSON

HAR (HTTP Archive) .har

Chrome / Edge: DevTools → Network → right-click → "Save all as HAR with content".
Firefox: DevTools → Network → gear icon → Save All as HAR.
Also works with exports from Proxyman, Charles Proxy, and Fiddler.

All formats are detected automatically by their internal structure — you do not need to rename files or select a format manually.

How path matching works (no setup required)

Each Swagger operation (HTTP method + path) is compared to each Postman request. There is no manual parameter-mapping form — matching is automatic.

  • Method must match (GET, POST, etc.).
  • The path is split on /. You need the same number of segments in the same order.
  • Literal segments (fixed text like v1 or hosting) must match exactly.
  • A template segment in the spec — anything in braces, e.g. {account_id} — matches any single segment in Postman at that position: another name in braces ({acc_id}), a Postman variable written with double curly braces (e.g. {{var}}), or a concrete value (e.g. a numeric id).
  • If your OpenAPI file defines a base path (Swagger basePath or OpenAPI servers URL path), that prefix is combined with each path when matching, so Postman can use the full path while the spec splits base + route.
  • One built-in alias: {hosting_account_id} is treated like {hosting_id} before comparison.

Examples

  • Swagger POST /hosting/{account_id}/v1/add_pat
    Postman POST /hosting/{acc_id}/v1/add_pat → match
  • Swagger GET /api/{id}/items
    Postman GET /api/42/items → match
  • Not a match — different segment count:
    /v1/sites/{id}/domains vs /v1/sites/{id}/domains/{id}

Note: a template segment in the spec also matches any literal word in that slot (e.g. a path like /items/delete under /items/{id}). That is uncommon; if your API uses fixed words where the spec has a parameter, treat coverage as approximate for those routes.

OpenAPI / Swagger

JSON YAML YML

Accepts JSON or YAML (.json, .yaml, .yml). If pasting a URL fails due to CORS, open the link in a new tab, Save As (Cmd+S / Ctrl+S) and upload. A selected file always wins over a pasted URL.

Drag & drop or click — OpenAPI JSON or YAML

Only used when no file is selected. URL must end with .json or use ?format=json. If loading fails, download the JSON from the URL (new tab → Save As) and upload above.

CORS proxy (optional — works for any public JSON URL)

Easiest on localhost: from the repo root run npm run dev and open http://localhost:8080 — the dev server includes a same-origin OpenAPI proxy (no CORS, no extra port). Do not use python -m http.server if you need URL paste for locked-down APIs.

Alternative: run npm run openapi-proxy (port 8787). On localhost this page also tries localhost:8787 and 127.0.0.1:8787 automatically. You can set a custom proxy base below (saved in this browser).

Use the same host name as this page (e.g. if the app is http://localhost:8080, set http://localhost:8787 — not 127.0.0.1 unless the app uses that too).

The proxy must accept GET ?url= with your OpenAPI URL encoded. See tools/openapi-cors-proxy.mjs or workers/openapi-proxy-cloudflare.js in the repo.

Collection · required

Postman v1/v2 Insomnia Bruno HAR

Upload a Postman v1 / v2 / v2.1, Insomnia v4 (JSON export), Bruno (JSON export), or a HAR file captured from DevTools / Proxyman / Charles. Format is auto-detected.

Drag & drop or click Postman · Insomnia · Bruno · HAR
Notify on completion Slack / Teams webhook (optional)

Ctrl + to compare