VisualQ

Running tests

Trigger FRT runs from the UI, see step-by-step progress, and dig into failures.

Once a feature compiles cleanly, click Run in the editor or hit the Run button on the feature card in the FRT list.

What happens during a run

  1. /api/frt/run re-compiles the feature (cheap thanks to the cache), creates a frt_runs/{runId} Firestore doc with status: 'running', and dispatches the payload to the worker.
  2. The worker launches Playwright for each requested browser, replays each step, and pushes progress every step via /api/worker/frt-progress.
  3. Screenshots, Playwright traces, video, and HAR are uploaded to S3 under frt/{runId}/.
  4. The final callback hits /api/worker/frt-callback which writes the full timeline back to the run doc and emits an SSE event so the UI updates live without polling.

The FRT list keeps the latest available recording preview on each feature card. The poster is captured from the first useful page screenshot in the run and the inline video is refreshed after the first run, first save-and-run, or any later re-run.

Run detail page

The /projects/{slug}/frt/runs/{runId} page shows:

  • A summary header: status, durations, browsers, scenarios pass/fail.
  • A timeline per scenario × browser:
    • Each step with its status, duration, and error if any.
    • Click-to-zoom before/after screenshots.
    • A Trace link that opens the Playwright trace viewer (trace.playwright.dev).
    • A Video link for the full scenario replay.
    • A HAR link with all network activity.
  • Pillar metrics if the scenario used pillar steps (axe score, LCP, CLS…).

Re-running scenarios

Three buttons make iteration fast:

  • Re-run all — runs the whole feature again with the same config.
  • Re-run failed only — narrows the dispatch to scenarios that failed.
  • Re-run with AI debug — sends the failing trace to the AI which proposes a step-definition patch.

Triggering runs from CI

You can call POST /api/frt/run from your CI with a service account API key. Useful payload shape:

{
  "projectId": "abc123",
  "featureId": "def456",
  "browsers": ["chromium"],
  "ci": {
    "provider": "github-actions",
    "runUrl": "https://github.com/owner/repo/actions/runs/12345",
    "commit": "abc1234",
    "branch": "main",
    "pullRequest": "42"
  }
}

The CI metadata is preserved on the run doc and surfaces in the timeline, the cucumber.json export, and the Xray push.

On this page