Simulation structure
Learn about the main parts of a Gatling simulation: DSL import, protocol configuration, headers definition, scenario definition, simulation definitions, hooks
A Simulation
is a real Scala class containing 4 different parts:
- The HTTP protocol configuration
- The headers definition
- The scenario definition
- The simulation definition
To illustrate this point we will take one of our sample simulations: computerdatabase.BasicSimulation
Test
.
Some tools such as maven surefire aggressively consider classes with such naming pattern are for them to handle and will try to launch them.DSL imports
The Gatling DSL requires some imports:
import io.gatling.core.Predef._ // required for Gatling core structure DSL
import io.gatling.jdbc.Predef._ // can be omitted if you don't use jdbcFeeder
import io.gatling.http.Predef._ // required for Gatling HTTP DSL
import scala.concurrent.duration._ // used for specifying duration unit, eg "5 second"
HTTP protocol configuration
The first element is the configuration of the HTTP protocol. In this example, this configuration is very basic and just defines:
- the
baseUrl
, which will be prepended to all the relative paths in the scenario definition. Here, the base URL is http://computer-database.gatling.io. - common headers, which will be added on each request.
The HTTP Configuration is stored as a Scala value so that we can set it later in the simulation definition.
Headers definition
As you’ll see later, when we define the scenario for Gatling, we can provide the headers used for each request sent to the server. As the file was generated by the recorder, all headers are declared in the beginning of the file and used in the scenario definition.
Accept-Encoding
or If-Last-Modified
).Headers are declared as Scala Maps:
val someExtraHeaders = Map("Origin" -> "http://mydomain.com")
http("request")
.get("/foo")
.headers(someExtraHeaders)
Scenario definition
After the headers definition comes the scenario definition. This definition has a name because you can define several scenarios in the same simulation. A scenario is usually stored in a Scala value:
val scn = scenario("ScenarioName") // etc...
The scenario structure basically consists of chaining two methods: exec
and pause
.
The first one is used to describe an action, usually a request sent to the tested application; the second one is used to simulate the think time of the user between consecutive requests.
HTTP requests are defined as follows in a scenario:
// Here's an example of a POST request
http("request_10")
.post("/computers")
.formParam("name", "Beautiful Computer")
.formParam("introduced", "2012-05-30")
.formParam("discontinued", "")
.formParam("company", "37")
The above example produces a POST HTTP request that creates a new computer model:
HTTP request:
POST http://computer-database.gatling.io/computers
headers=
Accept: [text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8]
Content-Type: [application/x-www-form-urlencoded]
DNT: [1]
Accept-Language: [en-US,en;q=0.5]
Accept-Encoding: [gzip, deflate]
User-Agent: [Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0]
Referer: [http://computer-database.gatling.io/computers/new]
params=
company: [37]
discontinued: []
name: [Beautiful Computer]
introduced: [2012-05-30]
Simulation definitions
The last part of the file contains the simulation definition, this is where you define the load you want to inject to your server, e.g.:
setUp(
scn.inject(atOnceUsers(1)) // (1)
.protocols(httpProtocol) // (2)
)
which correspond to:
- We inject one single user into the
scn
scenario - We configure
httpProtocol
on thesetUp
so that we pass the base URL and the common headers.
Hooks
Gatling provides two hooks:
before
for executing some code before the simulation actually runsafter
for executing some code after the simulation actually runs
before {
println("Simulation is about to start!")
}
after {
println("Simulation is finished!")
}