From eed6c93543b18001962ed6c80e62a364d3f97612 Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Sun, 6 Sep 2020 23:29:31 +0200 Subject: [PATCH 1/5] Fix dynamic parameter Wrong Gatling usage: randCustId() was only called once. One needs to pass a function. --- .../src/main/resources/scripts/Gatling/GatlingScenario.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala b/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala index f9b3837759..d253ecab83 100644 --- a/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala +++ b/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala @@ -20,7 +20,7 @@ class RewardsScenario extends Simulation { .repeat(10){ exec(http("transactions_add") .post("/transactions/add/") - .body(StringBody("""{ "customerRewardsId":null,"customerId":""""+ randCustId() + """","transactionDate":null }""")).asJson + .body(StringBody(_ => s"""{ "customerRewardsId":null,"customerId":"${randCustId()}","transactionDate":null }""")).asJson .check(jsonPath("$.id").saveAs("txnId")) .check(jsonPath("$.transactionDate").saveAs("txtDate")) .check(jsonPath("$.customerId").saveAs("custId"))) From bbdce526c75236aebe0d28a06f8eda6868a1ddf6 Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Sun, 6 Sep 2020 23:32:19 +0200 Subject: [PATCH 2/5] Fix random cust id generation to reduce collisions The current range causes lots of collisions and the application doesn't handle them gracefully, causing lots of exceptions to get logged and hamerring performance. Use 100,000 like the JMeter test, see https://github.com/slandelle/tutorials/blob/master/testing-modules/load-testing-comparison/src/main/resources/scripts/JMeter/Test%20Plan.jmx#L203 --- .../src/main/resources/scripts/Gatling/GatlingScenario.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala b/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala index d253ecab83..70c7d51748 100644 --- a/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala +++ b/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala @@ -7,7 +7,7 @@ import scala.concurrent.duration._ class RewardsScenario extends Simulation { - def randCustId() = Random.nextInt(99) + def randCustId() = Random.nextInt(100000) val httpProtocol = http.baseUrl("http://localhost:8080") .acceptHeader("text/html,application/json;q=0.9,*/*;q=0.8") From b2643fc0dded537af91306146b72de583fd47bd2 Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Sun, 6 Sep 2020 23:33:17 +0200 Subject: [PATCH 3/5] Use ThreadLocalRandom instead of Random which is synchronized --- .../src/main/resources/scripts/Gatling/GatlingScenario.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala b/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala index 70c7d51748..28314dca08 100644 --- a/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala +++ b/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala @@ -7,7 +7,7 @@ import scala.concurrent.duration._ class RewardsScenario extends Simulation { - def randCustId() = Random.nextInt(100000) + def randCustId() = java.util.concurrent.ThreadLocalRandom.current().nextInt(1, 10000) val httpProtocol = http.baseUrl("http://localhost:8080") .acceptHeader("text/html,application/json;q=0.9,*/*;q=0.8") From a3626ba16c9fbad2f5f8c04390db655cc0ef873c Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Sun, 6 Sep 2020 23:34:37 +0200 Subject: [PATCH 4/5] Add missing optional option on the check that captures the reward This shouldn't be an error, it's an expected situation as described in the article. --- .../src/main/resources/scripts/Gatling/GatlingScenario.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala b/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala index 28314dca08..bda5e07c28 100644 --- a/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala +++ b/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala @@ -28,7 +28,7 @@ class RewardsScenario extends Simulation { .exec(http("get_reward") .get("/rewards/find/${custId}") - .check(jsonPath("$.id").saveAs("rwdId"))) + .check(jsonPath("$.id").optional.saveAs("rwdId"))) .pause(1) .doIf("${rwdId.isUndefined()}"){ From 7c41e378296080881ec0eabf7b394c3e0b063090 Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Sun, 6 Sep 2020 23:37:51 +0200 Subject: [PATCH 5/5] Remove the unfair 1 second pauses between requests Those pauses don't exist in the JMeter test. They just artificially reduce the Gatling test's throughput. --- .../src/main/resources/scripts/Gatling/GatlingScenario.scala | 3 --- 1 file changed, 3 deletions(-) diff --git a/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala b/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala index bda5e07c28..f17f5f6124 100644 --- a/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala +++ b/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala @@ -24,12 +24,10 @@ class RewardsScenario extends Simulation { .check(jsonPath("$.id").saveAs("txnId")) .check(jsonPath("$.transactionDate").saveAs("txtDate")) .check(jsonPath("$.customerId").saveAs("custId"))) - .pause(1) .exec(http("get_reward") .get("/rewards/find/${custId}") .check(jsonPath("$.id").optional.saveAs("rwdId"))) - .pause(1) .doIf("${rwdId.isUndefined()}"){ exec(http("rewards_add") @@ -41,7 +39,6 @@ class RewardsScenario extends Simulation { .exec(http("transactions_add") .post("/transactions/add/") .body(StringBody("""{ "customerRewardsId":"${rwdId}","customerId":"${custId}","transactionDate":"${txtDate}" }""")).asJson) - .pause(1) .exec(http("get_reward") .get("/transactions/findAll/${rwdId}"))