skills/testing-performance-and-load/SKILL.md
Designs and runs performance and load tests: workload modelling from real traffic, thresholds tied to SLOs, warmup and ramp shapes, percentile-based analysis, and lightweight CI perf checks with k6 or Artillery. Use when a feature has latency or throughput requirements, when "it feels slow" needs to become a number, when a launch needs a capacity check, or when a performance result needs interpreting rather than just collecting.
npx skillsauth add jaktestowac/awesome-copilot-for-testers testing-performance-and-loadInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill when a system's speed or capacity is in question and the answer needs to be a number someone can act on.
Most performance testing produces numbers nobody uses. The two causes are always the same: a workload that does not resemble reality, and a result reported as an average. A test that hammers one endpoint with a flat 500 virtual users tells you how the system responds to something that will never happen, and a mean response time of 200ms is compatible with one user in twenty waiting four seconds.
category_id" is a finding.Different questions need different tests. Pick one per run.
| Question | Test type | Shape | | --- | --- | --- | | Is it fast enough under normal load? | Load test | Steady state at expected concurrency | | Where does it break? | Stress test | Ramp until failure | | Does it survive a sudden surge? | Spike test | Step change up, then down | | Does it degrade over hours? | Soak test | Steady load for 4 to 24 hours | | Did this release make it slower? | Regression comparison | Identical shape, two builds | | How much capacity do we have? | Capacity test | Ramp to the SLO breach point |
A test that tries to answer all six answers none. If "it is slow" is all you have, start with a load test at expected concurrency and let the result narrow the question.
The phase that decides whether the result means anything. Work through ./resources/workload-model.md.
From real traffic where possible:
concurrent users ≈ arrival rate × session duration.When real traffic is unavailable, state the assumptions explicitly and mark the result as assumption-dependent. An assumed workload is workable; an unstated one is not.
Each threshold traces to something: a user need, a documented SLO, a competitor benchmark, or a current baseline you intend to hold.
./resources/thresholds-and-slos.md covers deriving them. The shape:
thresholds: {
'http_req_duration{name:checkout}': ['p(95)<800', 'p(99)<2000'],
'http_req_failed': ['rate<0.001'],
'checkout_completed': ['count>0'],
}
Rules:
Record every difference from production before running anything. The differences bound what the result can claim.
Then decide where the load generator runs. A generator on the same machine as the system under test competes with it for CPU, and the result measures the contention.
Monitor the system, not only the client. Client-side response times tell you something is slow; server CPU, memory, database connections, queue depth, and GC pauses tell you why. A run with no server-side observation produces a symptom and no cause.
Report distributions.
Look for the shapes in ./resources/perf-report-template.md:
Correlate every latency feature with a server-side metric before naming a cause. A hypothesis without a correlating metric is a guess, and performance work built on a guessed bottleneck is expensive.
Use ./resources/perf-report-template.md. It requires:
Add a lightweight CI check when there is something worth protecting: a short run at modest load, thresholds set generously enough not to be flaky, and a comparison against the last release. Recipes in ./resources/k6-recipes.md. Its job is catching an order-of-magnitude regression, not measuring capacity.
./resources/workload-model.md - deriving the endpoint mix, concurrency, think time, and data distribution from real traffic, with a worked example./resources/thresholds-and-slos.md - deriving thresholds from SLOs, percentile choice, error budgets, and per-endpoint targets./resources/k6-recipes.md - k6 scripts for load, stress, spike, and soak shapes, plus the CI regression check and an Artillery equivalent./resources/perf-report-template.md - report structure, the four curve shapes and what each means, and a worked exampleassessing-release-readiness - when a performance result feeds a go/no-go decisionanalyzing-quality-metrics - when performance should be trended across releases rather than measured oncetesting-api-contracts - when the endpoints under load also need shape verificationdesigning-test-data - when the load test needs a realistic hot set and data distributionhandling-sensitive-test-data - when load test data is derived from production trafficautomating-ci-test-pipelines (planned) - for running the CI regression check and storing its historytech-debt-analysis - when the bottleneck is structural rather than a single queryThis skill is complete when:
testing
Tests the customization assets themselves - skills, prompts, custom agents, instructions - the way a product is tested: activation cases that check an asset fires when it should and stays quiet when it should not, output-contract cases, safety cases, collision cases between assets competing for the same trigger, a weighted rubric scored blind, and a baseline-versus-candidate gate before an edit ships. Use when a skill is edited and nobody knows whether behaviour changed, when two skills fight over the same request, when a description is being tuned for discoverability, when a collection has grown past manual spot-checking, or when the request mentions skill evals, prompt regression, or "does this skill actually work".
development
Shapes QA output for the person who has to act on it: result and blocker in the first two lines, one decision per report, findings ordered by what they cost, the long artifact in a file and the decisions in the message, and magnitude stated in units the reader can count. Use when a report is accurate but nobody acts on it, when a finding set is too long to read under time pressure, when the same findings must be retold for a developer, a release manager, and an on-call engineer, or when the request mentions "too long", "make this readable", "just tell me what to do", "so what", or "summarize this for stakeholders". Pairs with unslop-answers, which makes the same report honest.
testing
Verifies that the lines and branches a change actually touched are executed by tests, using LCOV or Cobertura diff coverage instead of whole-repo percentages, and escalates uncovered high-risk changes into a blocking finding. Use when a pull request needs a coverage gate that unrelated tests cannot satisfy, when total coverage looks healthy but the diff is untested, when wiring diff coverage into CI, or when someone claims a change is covered because the suite is green.
development
Cuts AI tells from test code: tests that pass without proving anything, tautological assertions, mock-only tests, hardcoded waits, coverage theater, vague names, swallowed errors, retries used as fixes. Use whenever test code is written, changed, or reviewed, including tests produced as a side effect of a feature task, and when the request mentions "review these tests", "are these tests any good", "this test always passes", "this suite is flaky", or "clean up these tests". Must always apply to test code.