Teaches load and performance testing from zero: a tool-selection table choosing between k6, JMeter, Gatling, Locust, and Artillery from observable project facts; the six load profiles (smoke, average-load, stress, spike, soak, breakpoint); open vs closed workload models; why percentiles beat averages; turning a run into a pass/fail CI gate with a first runnable k6 script; a performance-incident triage workflow (confirm with a k6 smoke run, flame-graph the hot path, check slow queries, localize the cause); and full Gatling (Simulation DSL, injectOpen/injectClosed, setUp().assertions()) and Locust (HttpUser + @task locustfile, headless / distributed runs, CSV gating) deep dives in references. Use when a service needs performance coverage and the tool, load profile, or pass/fail threshold has not been decided yet, or when a live performance incident needs cause localization.
75
94%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Open holds arrival rate constant; closed holds concurrency constant. This table maps the two models onto the five tools, with the exact executor / injection names each one uses.
| Tool | Open (arrival rate held constant) | Closed (concurrency held constant) |
|---|---|---|
| k6 | constant-arrival-rate, ramping-arrival-rate | constant-vus, ramping-vus, shared-iterations, per-vu-iterations (k6 executors) |
| Gatling | injectOpen(...) with atOnceUsers(nbUsers), rampUsers(nbUsers).during(duration), constantUsersPerSec(rate).during(duration), rampUsersPerSec(rate1).to(rate2).during(duration), stressPeakUsers(nbUsers).during(duration) | injectClosed(...) with constantConcurrentUsers(nbUsers).during(duration), rampConcurrentUsers(fromNbUsers).to(toNbUsers).during(duration) (Gatling injection) |
| Artillery | arrivalRate (new VUs per second), rampTo, arrivalCount (Artillery test script) | not the native model |
| JMeter | not the native model | Thread Group: a thread count, a ramp-up period, and a loop count, where "Each thread will execute the test plan in its entirety and completely independently of other test threads" (JMeter test plan) |
| Locust | approximated with constant_throughput wait time, "an adaptive time that ensures the task runs (at most) X times per second" (Locust locustfile) | the default: a fixed user count plus wait_time |
rampUsers(n).during(d) and atOnceUsers(n) are open model profiles despite
the word "users": they inject n users into the system over the window and
never cap how many are inside at once. The closed equivalents are the ones with
"Concurrent" in the name, constantConcurrentUsers and rampConcurrentUsers,
and they live under injectClosed
(Gatling injection). The two
families cannot be mixed in one injection profile.