drusolis
drusolis

Reputation: 862

How to loop on a gatling inject?

I've modeled some usage pattern that I want to run against our web app, and what I want to do is loop that pattern over and over for a week. I haven't been able to find the right combination of things to do this though.

val scn: ScenarioBuilder = scenario("Issue Cert Request")
    .exec(http("enroll_child_actor").post("/v1/actor/enroll")
        .body(StringBody(session => createRequestActorBody(getActorId(session.userId))))
        .header("Content-Type","text/plain")
        .header("Authorization", jwt => "ID " + TokenGenerator.get().generateOneTimeUseToken(uberActorSubjectName, Array("ots"), "http://localhost",
          uberActorPrivateKey, uberActorIdentityCert).getEncoded)
        .check(jsonPath("$.identityCertificate").saveAs("childIdCert"),
          jsonPath("$.secureEndpointCertificate").saveAs("childEndpointCert")
        )
    ).exec(http("request_secure_endpoint_certificate").post("/v1/cert/issue")
    .body(StringBody(createRequestCertBodySecureEndpoint))
    .header("Content-Type","text/plain")
    .header("Authorization", session => "ID " + TokenGenerator.get.generateTokenForActor(s"CN=http://localhost,UID=ots:${getActorId(session.userId)}", actorSecureEndpointKeyPair.getPrivate, CaCryptoUtils.certFromPemText(session.get("childEndpointCert")
      .as[String])).getEncoded)
  ).exec(http("request_identity_certificate").post("/v1/cert/issue")
    .body(StringBody(createRequestCertBodySecureEndpoint))
    .header("Content-Type","text/plain")
    .header("Authorization", session => "ID " + TokenGenerator.get.generateTokenForActor(s"CN=http://localhost,UID=ots:${getActorId(session.userId)}", actorIdentityKeyPair.getPrivate, CaCryptoUtils.certFromPemText(session.get("childIdCert").as[String]))
      .getEncoded)
  )

This is where my test is run and these steps are what I want to repeat. I have tried putting a repeat on the scenario itself (above) but that looks like it repeats sessions so that the session.userId duplicates and errors out in the app I'm testing (that field I'm using it in has to be unique).

setUp {
  scn.inject(nothingFor(4 seconds),
    rampUsersPerSec(2) to usersMax during(durationAtMaxInSecs seconds),
    constantUsersPerSec(usersConstant) during(durationAtLowerInSecs seconds),
    nothingFor(3000 seconds)
  ).protocols(httpConf)
}

Short of copying and pasting the injections over and over, how can I get those steps to repeat a specified number of times?

Upvotes: 2

Views: 3436

Answers (1)

user666
user666

Reputation: 1172

Quite similar to what you are looking for , hopefully below will help , I have removed some information :-

val vrScn = scenario("Requests").feed(orderRefs).group("Groups") {
//See this logic how to Short Circuit              
asLongAs(session => jobsQue.length > 0) { 
  exec { session =>
    var requestIdValue = new scala.util.Random().nextInt(Integer.MAX_VALUE).toString();
    var length = jobsQue.length
    try {
      var reportElement = jobsQue.pop()
    //Other variables
    } catch {
      case e: NoSuchElementException => print("Erorr")
    }

    //Set what you want to set 
    session.setAll(
      "reportsRuntimeInfos" -> "FIRST_REQUEST",
      "xmlRequest" -> xml)
  }

    .group("${requestedPageSize} Page Report") {
      group("${requestIdValue}") {
        exec(
          http("Request Report")
            .put(Configuration.URL + "/endpoint1")
            .header("Content-Type", "application/xml")
            .body(StringBody("${xmlRequest}"))
            .check(status.is(200)))
          .pause(Configuration.THINK_TIME_AFTER_PUT second)
          //See this logic how to Short Circuit
          .asLongAs(session => (!ALL_STOP_STATUS.contains(session.attributes("responseStatus")) && session.attributes("statusCode") == 200 && session.attributes("reportsRuntimeInfos") != "")) {
            exec(
              http("Poll")
                .get(Configuration.URL + "/endpoint2") ))
          }

      }
    }
}

  setUp(scn.inject(atOnceUsers(Configuration.NO_OF_USERS))).maxDuration(Configuration.MAX_DURATION minutes);

Upvotes: 2

Related Questions