1

I'm new to Scala, and trying to write few scripts for Load testing using Gatling. I'm trying to define a re-usable method to send the load, hence I created below method:

def startLoad(scenario: Array[ScenarioBuilder]) = {
        setUp(
            scnGetAuthorizationToken.inject(
              atOnceUsers(1)
              ),
            
        for (i <- 0 until scenario.length) {
            scenario(i).inject(
               nothingFor(5 seconds),
               atOnceUsers(atOnceUserCount)
               ).throttle(
                   reachRps(maxRps/2) in (testDuration/4 seconds),
                   reachRps(maxRps/2) in (testDuration/4 seconds),
                   reachRps(maxRps) in (testDuration/2 seconds)),
             }
            ).protocols(httpConf.inferHtmlResources())
             .maxDuration(testDuration seconds)
             .assertions(
                 global.responseTime.max.lt(maxResponseTime),
                 global.successfulRequests.percent.gt(successfulRequests)
                 )
        }

But, compiler is throwing below error for the for statement. I got same error when I used "foreach" also:

type mismatch; found : Unit required: io.gatling.core.structure.PopulationBuilder

Can someone please help me how to get rid off this error?

In general, I would like to have this code in the following format (few lines of code is called on different variables of ScenarioBuilder type), and hence trying to come up with a re-usable method as defined above:

def startLoad(scenario: Array[ScenarioBuilder]) = {
        setUp(
            scnGetAuthorizationToken.inject(
              atOnceUsers(1)
              ),
            
            scenario1.inject(
               nothingFor(5 seconds),
               atOnceUsers(atOnceUserCount)
               ).throttle(
                   reachRps(maxRps/2) in (testDuration/4 seconds),
                   reachRps(maxRps/2) in (testDuration/4 seconds),
                   reachRps(maxRps) in (testDuration/2 seconds)),
             
            scenario2.inject(
               nothingFor(5 seconds),
               atOnceUsers(atOnceUserCount)
               ).throttle(
                   reachRps(maxRps/2) in (testDuration/4 seconds),
                   reachRps(maxRps/2) in (testDuration/4 seconds),
                   reachRps(maxRps) in (testDuration/2 seconds)),
                   
            scenario3.inject(
               nothingFor(5 seconds),
               atOnceUsers(atOnceUserCount)
               ).throttle(
                   reachRps(maxRps/2) in (testDuration/4 seconds),
                   reachRps(maxRps/2) in (testDuration/4 seconds),
                   reachRps(maxRps) in (testDuration/2 seconds)),
           ------        

            ).protocols(httpConf.inferHtmlResources())
             .maxDuration(testDuration seconds)
             .assertions(
                 global.responseTime.max.lt(maxResponseTime),
                 global.successfulRequests.percent.gt(successfulRequests)
                 )
        }

So, basically, I would like to repeat below lines of code for every element of the array that is passed as an argument to the method.

             inject(
                   nothingFor(5 seconds),
                   atOnceUsers(atOnceUserCount)
                   ).throttle(
                       reachRps(maxRps/2) in (testDuration/4 seconds),
                       reachRps(maxRps/2) in (testDuration/4 seconds),
                       reachRps(maxRps) in (testDuration/2 seconds)),
1
  • 2
    It's extremely hard to read this code, because the indentation is all messed up. If you can edit your question to contain properly indented code, it would be easier for someone to help you. Commented Aug 4, 2020 at 23:41

1 Answer 1

2

Gatling is not executing Simulation classes code directly. Think of it as a builder for a test configuration that is read by a framework.

Method setUp can be called only once per Simulation class. If you want to create 3 different scenarios with the same injection profile, throttle and assertions the best way will be to create an abstract class with all those settings defined and extend that class in 3 other ones like:

import io.gatling.core.Predef.{Simulation, _}
import io.gatling.core.structure.ScenarioBuilder
import io.gatling.http.Predef.{http, status, _}

abstract class BaseScenario(scenario: ScenarioBuilder) extends Simulation{
  setUp(scenario.inject(
    atOnceUsers(5))
  ).protocols(
    http.shareConnections
  ).assertions(
    global.failedRequests.percent.lte(1)
  )
}

class ScenarioA extends BaseScenario(
  scenario("Example Scenario A")
    .exec(
      http("Get A")
        .get("http://aaaa.com")
        .check(status.is(200))
    )
)

class ScenarioB extends BaseScenario(
  scenario("Example Scenario A")
    .exec(
      http("Get B")
        .get("http://bbbb.com")
        .check(status.is(200))
    )
)
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.