Search code examples
scalatestinggatlingscala-gatling

Gatling load testing and running scenarios


I am looking to create three scenarios:

  • The first scenario will run a bunch of GET requests for 30s
  • The second and third scenarios will run in parallel and wait until the first is finished.

I want the requests from the first scenario to be excluded from the report.

I have the basic outline of what I want to achieve but not seeing expected results:

val myFeeder = csv("somefile.csv")

val scenario1 = scenario("Get stuff")
.feed(myFeeder)
.during(30 seconds) {
  exec(
      http("getStuff(${csv_colName})").get("/someEndpoint/${csv_colName}")
  )
}

val scenario2 = ...

val scenario3 = ...

setUp(
  scenario1.inject(
    constantUsersPerSec(20) during (30 seconds)
  ).protocols(firstProtocaol),

  
  scenario2.inject(
    nothingFor(30 seconds), //wait 30s
    ...
  ).protocols(secondProt)

  scenario3.inject(
    nothingFor(30 seconds),  //wait 30s
    ...
  ).protocols(thirdProt)

)

I am seeing the first scenario being run throughout the entire test. It doesn't stop after the 30s?

For the first scenario I would like to cycle through the CSV file and perform a request for each line. Perhaps 5-10 requests per second, how do I achieve that?

I would also like it to stop after the 30s and then run the other two in parallel. Hence the nothingFor in last two scenarios above.

Also how do I exclude from report, is it possible?


Solution

  • You are likely not getting the expected results due to the combination of settings between your injection profile and your "Get Stuff" scenario.

    constantUsersPerSec(20) during (30 seconds)
    

    will start 20 users on scenario "Get Stuff" every second for 30 seconds. So even during the 30th second, 20 users will START "Get Stuff". The injection pofile only controls when a user starts, not how long they are active for. So when a user executes the "Get Stuff" scenario, they make the 'get' request repeatedly over the course of 30 seconds due to the .during loop.

    So at the very least, you will have users executing "Get Stuff" for 60 seconds - well into the execution of your other scenarios. Depending on the execution time for you getStuff call, it may be even longer.

    To avoid this, you could work out exactly how long you want the "Get Stuff" scenario to run, set that in the injection profile and have no looping in the scenario. Alternatively, you could just set your 'nothingFor' values to be >60s.

    To exclude the Get Stuff calls from reports, you can add silencing to the protocol definition (assuming it's not shared with your other requests). More details at https://gatling.io/docs/3.2/http/http_protocol/#silencing