Reputation: 862
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
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