Introduction:
Gatling is a light weighted load generator. Though it is 'load test as code', sometimes it is hard to debug. Especially when there is lack of documentation and tutorial. I run into an issue when upgrading from 2.3.1 to 3.0.2. The error message is not very helpful.
Here I will show this case to illustrate an upgrading issue, as well is tricks to print out some debug information.
Some Debug Tricks:
According to gatling document, you can print out debug information in 2 ways.
-
change conf/logback.xml to DEBUG/TRACE for logger name="io.gatling.http.engine.response"
- Use println in exec. This is more flexible and can prints the exact information I need. How ever I would like to put the debug messages in a separate file. Here is an example:
The code won't work in 3.0.2, but as an example how to print debug information tailored to my case.val file = System.getProperty("file", "/tmp/debug_cookie.out") val scn = scenario(myReadScenario) .during (myDuration) { feed(userData) .exec(http(myReadRequest) .get("something that returns pagedResultsCookie at the end") .queryParam("_pageSize", "1") .check(jsonPath("$.pagedResultsCookie").saveAs("pageCookie"))) .asLongAs(some-condition) { exec(session => { scala.tools.nsc.io.File(file).appendAll("debug====") scala.tools.nsc.io.File(file).appendAll(session("pageCookie").as[String]+"\n") session }) .exec(http(myReadRequest) .get("something that returns pagedResultsCookie at the end") .queryParam("_pageSize", "50") .queryParam("_pagedResultsCookie", "${pageCookie}") .check(jsonPath("$.pagedResultsCookie").saveAs("pageCookie"))) }
It works in 2.3.1 But not in 3.0.2:
I have a test that go over each page of pagination. In 2.3.1, I used something like:
val scn = scenario(myReadScenario)
.during (myDuration) {
feed(userData)
.exec(http(myReadRequest)
.get("something that returns pagedResultsCookie at the end")
.queryParam("_pageSize", "50")
.check(jsonPath("$.pagedResultsCookie").saveAs("pageCookie")))
.asLongAs(session => session("pageCookie").as[String] != null) {
exec(http(myReadRequest)
.get("/openidm/managed/role/${name}/members")
.queryParam("_pageSize", "50")
.queryParam("_pagedResultsCookie", "${pageCookie}")
.check(jsonPath("$.pagedResultsCookie").saveAs("pageCookie")))
}
}
In 3.0.2, It throws an exception 'j.l.ClassCastException: value is null'
I have to read the gatling session source code to understand why the exception is thrown. The session("key") returns asOption. When the response has '"PagedResultsCookie": null' the asOption tries to cast the value null into String. That is the short version of the explanation. But I do not understand why it works in 2.3.1.val scn = scenario(myReadScenario) .during (myDuration) { feed(userData) .exec(http(myReadRequest) .get("something that returns pagedResultsCookie at the end") .queryParam("_pageSize", "50") .check(jsonPath("$.pagedResultsCookie").saveAs("pageCookie"))) .asLongAs(session => session("pageCookie").as[String] != null) { exec(http(myReadRequest) .get("/openidm/managed/role/${name}/members") .queryParam("_pageSize", "50") .queryParam("_pagedResultsCookie", "${pageCookie}") .check(jsonPath("$.pagedResultsCookie").saveAs("pageCookie"))) } }
My current workaround is use:
.asLongAs(session => session.attributes.getOrElse("pageCookie", null) != null )This will by pass the wrapper for session. Maybe there is a better solution, I'd be happy to know it.
References:
https://gatling.io/docs/current/whats_new/3.0/?highlight=transformresponse
https://gatling.io/docs/current/migration_guides/2.3-to-3.0/
Comments
Post a Comment