← All posts
Walkthrough

Load testing your web app with TestVibe

Your functional tests prove a journey works once. They say nothing about what happens when a few dozen people run that journey at the same time. TestVibe closes that gap with built-in load testing: the same journeys you already generated as Playwright tests can be replayed by concurrent browser users, or you can point protocol-level k6 traffic at your endpoints — no scripts to write, no separate tooling to operate.

This is a practical walkthrough: what TestVibe load tests are, how to configure one, how to run it, and how to read the results.

What a TestVibe load test is

Load Testing lives in its own section of the navigation rail, separate from functional Runs. Under the hood, load tests share the same run infrastructure as your functional tests — the same dispatch, the same cloud fleet, the same live-updating results — but the workload is different. A load test runs in one of two modes:

The relationship to functional runs is simple: a journey needs a generated test before it can be used in a Simple load test. If you haven't generated tests yet, Advanced mode still lets you drive URL-based load at your endpoints.

Configuring a load test

The Configure tab of a Simple-mode load test: a mode toggle at the top, a features picker, a Target section listing the project's environments plus a Custom URL option, and Concurrent users / Repeats per user fields.
The Configure tab of a Simple-mode load test: mode toggle, features picker, Target section, and Concurrent users / Repeats per user fields.

Everything happens on the load test's Configure tab. You can switch a saved test between modes at any time.

  1. Select Load Testing in the navigation rail.
  2. Select + (New load test) in the list rail.
  3. Pick Simple or Advanced with the toggle at the top of the form.
  4. Configure the mode's settings (below).
  5. Select Save, then Run when you're ready.

Simple mode settings

SettingWhat it controls
FeaturesThe generated feature tests the browser users replay. Pick whole groups or individual features.
UsersHow many browser users run concurrently, up to 100. Above 20 users, TestVibe automatically spreads the load across multiple cloud machines — you still see one test and one merged result.
Repeats per userHow many times each user replays the features. Users × repeats = total feature runs, and the form shows that math as you type.
TargetWhich environment the users run against — pick one of the project's configured environments (the default is pre-selected) or type a Custom URL.

Each user replays the selected features, then stops — the run ends when everyone finishes. Simple runs report per-step latency under load, so you can see which step of the journey degrades first.

Advanced mode settings

SettingWhat it controls
Target & pathsThe URL the virtual users hit and the paths requested each iteration.
Load profileVirtual users, total duration, ramp-up window, and think time. Users ramp from 0 to the target over the ramp-up, then hold.
Thresholdsk6 pass/fail gates such as p(95)<1000 on http_req_duration or rate<0.01 on http_req_failed. The run fails if any gate fails.
Generated k6 scriptA read-only preview of the script TestVibe generated from this configuration — see exactly what will run before you start it.

Threshold gates apply to Advanced runs only; Simple runs report timings without gating.

Sizing guidance

Start small — 10 users for 60 seconds is enough to validate the configuration end to end. Increase users gradually, and keep ramp-up at 10–20% of the total duration so the system warms up realistically. In Advanced mode, set thresholds from a passing baseline run rather than guessing, then tighten them once results are stable.

Running it

Select Run. The test dispatches to the cloud load fleet, the run appears on the Results tab immediately, and its charts update live while virtual users execute. Cancel stops an in-flight run; Delete removes a terminal one.

You don't have to click the button yourself, either. Load tests can be listed and dispatched from CI over the REST API, from the testvibe CLI (testvibe load run "Checkout under load" --wait makes a handy CI gate), or from AI tools via the MCP server. For a recurring schedule, create an Automation with a Run a load test action — no external scheduler needed.

Reading the results

A passed Simple-mode run on the Results tab: a What this run did summary, KPI tiles for feature runs, run duration p95, failed runs and peak concurrent users, and the feature-run duration percentile chart, with runs-per-second, active-users, and failed-runs charts below.
A passed Simple-mode run: "What this run did" summary, KPI tiles, and the duration-percentile chart, with throughput, users, and failure charts below.

The Results tab shows a strip of past runs — select one to inspect it. Each result opens with a What this run did block: the mode, target URL, load profile, and the features exercised, so a result is never ambiguous about what produced it.

From there, read top to bottom:

Pass/fail semantics differ by mode. An Advanced run passes when every threshold gate holds for the whole run — a failed gate marks the run failed even if all requests technically succeeded. A Simple run has no gates; it fails when the replayed features fail under load.

Two quick sanity checks when a result looks wrong: a 100% error rate usually means the target URL was unreachable from the fleet — check the Target section and any access controls. Flat-zero throughput with running virtual users means journeys are failing before their first request; re-run the journey as a functional test first.

When you're done reading, Ask AI seeds the Assistant with a data-rich summary of the selected run — useful for sharing a quick verdict — and Export downloads the full results as JSON, the per-step/per-endpoint table as CSV, or the raw metric samples as CSV.

Going deeper: server telemetry

Client-side numbers tell you what users experience; server telemetry tells you why. Install the TestVibe telemetry agent in the app you're testing (a NuGet package for .NET, a single-file agent for Node.js) and your results gain live server-side CPU, memory, session, and custom metrics next to the client-side charts. CPU climbing toward saturation while p95 rises is the classic capacity ceiling; memory growing run-over-run without recovering suggests a leak the load test is exposing.

Wrap-up

Load testing in TestVibe is deliberately boring to operate: pick the journeys you already have (or the endpoints you care about), set users and duration, press Run, and read the charts. The heavy lifting — script generation, fleet dispatch, sharding across machines, merging results — is handled for you.

Want to try it on your own app? TestVibe is in early access — get early access and your first load test can be 10 users for 60 seconds. The load-testing docs cover every setting in detail.

Early access

Ready for tests that write themselves?