Gatling - How to Send Post Request in StringBody() With Random Data
In this Gatling tutorial, we show how t send post requests which contain random data in the StringBody()
.
In most performance testing scenarios, you want to randomize the data that is sent as post request to simulate different sessions. For this, we can make use of feeders which read data from CSV files or plain text.
If you haven’t setup Gatling on your machine yet, you can read the post that explains how to setup Gatling as a Maven project.
Scala Random String Generator
First, we need a method which generates a random string in Scala:
object randomStringGenerator {
def randomString(length: Int) = scala.util.Random.alphanumeric.filter(_.isLetter).take(length).mkString
}
XML Request as Post Body
In this example, we are sending an XML post request. This contains a log_session_id parameter which needs to be different in each request:
val req = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<gpOBJECT>\n" +
"<gpPARAM name=\"auth_method\">3</gpPARAM>\n" +
"<gpPARAM name=\"app_url\">MY_APP</gpPARAM>\n" +
"<gpPARAM name=\"log_session_id\">0000000000</gpPARAM>\n" +
"<gpPARAM name=\"device_id\">b02edd23,ClientIP=10.211.55.3</gpPARAM>\n" +
"<gpPARAM name=\"service\">ACTIVATION</gpPARAM>\n" +
"</gpOBJECT>"
We need to have a way of sending the above XML request as a post in the StringBody()
in Gatling, but in each request, the log_session_id
value should be a random string.
For this, we need to make use of feeders.
Feeder in StringBody()
var randomSession = Iterator.continually(Map("randsession" -> ( req.replace("0000000000", randomStringGenerator.randomString(10)))))
val scn = scenario("Activate")
.feed(randomSession)
.exec(http("activate request")
.post("/login/activate")
.body(StringBody("""${randsession}"""))
The full script to send random post request in StringBody()
in Gatling:
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.http.config.HttpProtocolBuilder.toHttpProtocol
import io.gatling.http.request.builder.HttpRequestBuilder.toActionBuilder
class Activate extends Simulation {
object randomStringGenerator {
def randomString(length: Int) = scala.util.Random.alphanumeric.filter(_.isLetter).take(length).mkString
}
val req = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<gpOBJECT>\n" +
"<gpPARAM name=\"auth_method\">3</gpPARAM>\n" +
"<gpPARAM name=\"app_url\">MY_APP</gpPARAM>\n" +
"<gpPARAM name=\"log_session_id\">0000000000</gpPARAM>\n" +
"<gpPARAM name=\"device_id\">b02edd23,ClientIP=10.211.55.3</gpPARAM>\n" +
"<gpPARAM name=\"service\">ACTIVATION</gpPARAM>\n" +
"</gpOBJECT>"
var randomSession = Iterator.continually(Map("randsession" -> ( req.replace("0000000000", randomStringGenerator.randomString(10)))))
val httpConf = http
.baseURL("http://localhost:5000")
.acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
.userAgentHeader("Mozilla/4.0(compatible;IE;GACv10\. 0\. 0\. 1)")
val scn = scenario("Activate")
.feed(randomSession)
.exec(http("activate request")
.post("/login/activate")
.body(StringBody("""${randsession}"""))
.check(status.is(200)))
.pause(5)
setUp(
scn.inject(atOnceUsers(5))
).protocols(httpConf)
}