Explore the JavaScript SDK — From Template to Production-Ready Simulations
Why this guide exists
Build on the quick-start information from the Installation Guide and learn how to assemble production-ready scripts. This page collects the core building blocks—scenarios, feeders, checks, workload models, and operational tips—without forcing you through every editor action. If you need a slower pace, fall back to Create your first JavaScript-based simulation.
What you will cover
- Anatomy of a maintainable simulation module.
- Feeding data and correlating dynamic responses.
- Choosing injection profiles that mimic real traffic.
- Running, troubleshooting, and governing JavaScript-based load tests.
When we skip implementation details, we link to the relevant reference material so you can dive deeper on demand.
Prerequisites
- Node.js 18 or newer (LTS releases recommended) with npm 8+.
- A TypeScript-friendly editor (VS Code, WebStorm, etc.).
- A non-production system you are allowed to exercise with load tests.
- Optional: a Gatling Enterprise account for distributed execution.
Setup recap
Clone the se-ecommerce-demo-gatling-tests repository, install dependencies, and confirm that Gatling runs locally:
git clone https://github.com/gatling/se-ecommerce-demo-gatling-tests.git
cd se-ecommerce-demo-gatling-tests/javascript
npm install
npm run gatling:test -- --simulation src/basicSimulation.gatling
Need help with IDE configuration or project layout? Revisit the Installation Guide before continuing.
Understand the core concepts
| Concept | Description | Deep dive |
|---|---|---|
| Simulation | Default export of a .gatling.ts file that wires scenarios and injection. |
Simulation concepts |
| Protocol | Shared configuration (e.g., base URL, headers) applied to one or more scenarios. | HTTP protocol reference |
| Scenario | Virtual user behavior—chains of requests, pauses, and logic. | Scenario reference |
| Feeder | Data source (arrays, CSV, custom functions) injected into sessions. | Feeders reference |
| Checks & Assertions | Response validations and pass/fail thresholds. | Checks reference, Assertions |
| Injection Profile | Defines arrival rate and ramp-up strategy. | Injection reference |
Mental model: translate your business journey into scenarios, feed them contextual data, drive them with an injection profile, and guard the outcome with assertions.
Assemble a baseline simulation
Start from a single module, then break logic into helpers as the script grows.
Baseline example
import { constantUsersPerSec, scenario, simulation } from "@gatling.io/core";
import { http, status } from "@gatling.io/http";
export default simulation((setUp) => {
const httpProtocol = http
.baseUrl("https://api-ecomm.gatling.io")
.acceptHeader("application/json");
const scn = scenario("JS Browse")
.exec(
http("GET session")
.get("/session")
.check(status().is(200))
)
.pause(1)
.exec(
http("GET catalog")
.get("/catalog")
.check(status().in(200, 304))
);
const usersPerSec = 2;
const durationSeconds = 60;
setUp(
scn.injectOpen(constantUsersPerSec(usersPerSec).during(durationSeconds))
).protocols(httpProtocol);
});Key points:
- Keep protocol builders immutable and share them across scenarios with
.protocols(). - Use environment variables (or typed configuration helpers) for quick parameterisation.
- Export the simulation as the module default so the Gatling CLI can pick it up automatically.
Enrich scenarios with data and behavior
Feeders: avoid hot-cache artifacts
import { exec, scenario } from "@gatling.io/core";
import { http, status } from "@gatling.io/http";
import products from "./resources/products.json" assert { type: "json" };
const productFeeder = () =>
products[Math.floor(Math.random() * products.length)];
const browse = scenario("Browse with data").exec(
(session) => session.set("product", productFeeder()),
http("View product")
.get((session) => `/items/${session.get<string>("product").sku}`)
.check(status().is(200))
);
- Store CSV/JSON under
src/resourcesso they are bundled. - Pick a strategy (
random,queue,circular) that balances uniqueness and repeatability. See the Feeders reference for additional helpers.
Correlation: capture dynamic values
import { scenario } from "@gatling.io/core";
import { css, http, status } from "@gatling.io/http";
const addWithCsrf = scenario("Add with CSRF")
.exec(
http("Get account")
.get("/account")
.check(css("input[name='csrfToken']", "value").saveAs("csrf"))
)
.pause(1)
.exec(
http("Submit form")
.post("/account")
.formParam("csrfToken", (session) => session.get<string>("csrf"))
.check(status().in(200, 302))
);
- Pair extractors with a status/content check so failures surface immediately.
- Choose the extractor that matches the response format (
jsonPath,css,regex, etc.). The check reference lists every option.
Compose journeys
Break long user journeys into reusable chains:
import { exec, scenario } from "@gatling.io/core";
import { http, status } from "@gatling.io/http";
const search = exec(
http("Search")
.get("/search")
.queryParam("q", (session) => session.get<string>("term"))
.check(status().is(200))
);
const view = exec(
http("View item")
.get((session) => `/items/${session.get<string>("sku")}`)
.check(status().in(200, 304))
);
const browse = scenario("Browse").repeat(3).on(search, view);
Extract common chains or helpers into separate modules (e.g., src/utils/protocols.ts) and import them where needed.
Model realistic workloads
Use injection profiles to express how traffic arrives. Combine warm-up, steady state, and cool-down phases to mimic production.
setUp(
browse.injectOpen(
nothingFor(5),
rampUsers(50).during(30),
constantUsersPerSec(10).during(60)
),
addWithCsrf.injectOpen(constantUsersPerSec(2).during(90))
).assertions(
global().successfulRequests().percent().gt(99),
details("Browse", "Search").responseTime().percentile3().lt(1500)
);
// Import nothingFor, rampUsers, constantUsersPerSec, global, and details from "@gatling.io/core".
Need a refresher on each injection helper? Review the injection reference and the workload modelling guide.
Run and inspect results
- Run locally with
npm run gatling:test -- --simulation <path>or in interactive mode with--interactive. - After each run, open
target/gatling/<simulation>-<timestamp>/index.htmlto review percentiles, throughput, and errors. - Automate the same commands in CI, or evaluate Gatling Enterprise for distributed load and real-time dashboards.
Operational hygiene
- Commit simulations alongside application code and review them like any other change.
- Externalize secrets via environment variables or Gatling Enterprise configuration-as-code.
- Encode SLOs with assertions so builds fail fast when thresholds are breached.
- Document scenario intent, metrics, and known caveats in README files or ADRs.
Where to go next
- Want a slower, instructional pace? Follow Create your first JavaScript-based simulation.
- Need setup or packaging reminders? Revisit the Installation Guide.
- Expand beyond HTTP with the protocol guides and the HTTP scripting reference.
- Ready for team-wide load infrastructure? Scale out and automate with Gatling Enterprise.