Skip to content

Performance / Load Testing

SLO verification in staging, shaped against the expected load profile. Not "does it work fast" — "does it hold the promise the brief made under the load the brief named."*

Owners: QA, Tech Lead Phase it lives in: How We Build (Volume IV) The corpus principle this enacts: Predictions over plans — performance targets are predictions, checked.

Where it lives in the chain

How to do this

The load test is derived from the load profile named in the performance ADR — not made up at test time:

  1. Load profile"200 graders submitting simultaneously at end of semester; 50 sustained throughout normal hours." From the brief.
  2. Test scenario — recreate the load profile in staging. Use real-ish data shapes; not synthetic, not toy.
  3. SLO assertion"p95 latency under 800ms at the named load." Pass or fail.
  4. Bottleneck attribution — when the test fails, which component slowed? Database? Service? Queue? Externalised dependency? The test must produce that answer.

What good practice looks like

The load test runs in CI, against staging, on every release candidate. A failed load test blocks release. Performance is not optimised when convenient — it is verified when promised.

Performance regressions show up first at p95 and p99, not at p50. A team that watches only the median ships features that work for 50% of users while quietly degrading the experience for the rest. The test asserts at the right percentile — the one the SLA promised.

The team's discipline: performance is treated like a feature. Named at shaping (the ility), built into the design (the architecture), verified at release (the load test), watched in production (the SLI). A performance bug found in production is a chain-aware scenario-gap — the load profile wasn't tested at the scale that matters.

200apps · How We Work · NWIRE