Teaches load and performance testing from zero: how to choose between k6, JMeter, Gatling, Locust, and Artillery based on observable project facts (team language, tests-as-code vs GUI authoring, protocols beyond HTTP, CI gating needs); the six load profiles (smoke, average-load, stress, spike, soak, breakpoint) and the question each one answers; the difference between open workload models that hold arrival rate constant and closed models that hold concurrent users constant; why percentiles rather than averages are the unit of measurement; and how to turn a run into a pass/fail CI gate, with a first runnable k6 script. Use when a service needs performance coverage and the tool, the load profile, or the pass/fail threshold has not been decided yet.
76
95%
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.