Skip to content

Commit 411bd03

Browse files
committed
[SCALA-568] Added gatling simulation
for testing against a server with a steady load
1 parent f0ef08a commit 411bd03

File tree

4 files changed

+99
-0
lines changed

4 files changed

+99
-0
lines changed

scala-gatling/README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
### Relevant Articles:
2+
- [Testing With Gatling Using Scala]()
3+
4+
### Gatling Executions
5+
compile tests: `sbt test:compile`
6+
then run the simulation: `sbt 'Gatling/testOnly com.baeldung.gatling.PeakLoadSimulation'`
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.baeldung.gatling
2+
3+
import io.gatling.core.Predef._
4+
import io.gatling.core.structure.ChainBuilder
5+
import io.gatling.http.Predef._
6+
import io.gatling.http.request.builder.HttpRequestBuilder
7+
8+
object ChainRequestsProvider {
9+
10+
def simpleRequest(
11+
requestName: String,
12+
requestPath: String,
13+
expectedResponseStatus: Int
14+
): ChainBuilder = {
15+
val request: HttpRequestBuilder = http(requestName)
16+
.get(requestPath)
17+
.check(status.is(expectedResponseStatus))
18+
.check(bodyString.optional.saveAs("sBodyString"))
19+
20+
exec(session => session.markAsSucceeded)
21+
.exec(request)
22+
.doIf(_.isFailed) {
23+
exec { session =>
24+
println("***Failure on [" + requestPath + "] endpoint:")
25+
print("Gatling Session Data: ")
26+
println(session.attributes.get("sBodyString"))
27+
session
28+
}
29+
}
30+
}
31+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.baeldung.gatling
2+
3+
import io.gatling.core.Predef.{details, _}
4+
import com.baeldung.gatling.ChainRequestsProvider.simpleRequest
5+
import com.baeldung.gatling.ScenariosProvider.getScenario
6+
7+
class PeakLoadSimulation extends Simulation {
8+
9+
setUp(
10+
getScenario(
11+
"getExistingEndpoint",
12+
simpleRequest("request_status_endpoint", "/health/status", 200),
13+
50,
14+
10,
15+
60
16+
),
17+
getScenario(
18+
"nonExistingEndpoint",
19+
simpleRequest("request_wrong_endpoint", "/health/status1", 200),
20+
5,
21+
10,
22+
60
23+
)
24+
).assertions(
25+
details("request_status_endpoint").successfulRequests.percent.gt(99.99),
26+
details("request_status_endpoint").responseTime.percentile4.lt(20),
27+
details("request_status_endpoint").requestsPerSec.gt(40),
28+
details("request_wrong_endpoint").successfulRequests.percent.lt(1),
29+
details("request_wrong_endpoint").responseTime.percentile4.lt(20)
30+
)
31+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.baeldung.gatling
2+
3+
import io.gatling.core.Predef._
4+
import io.gatling.core.structure.{ChainBuilder, PopulationBuilder}
5+
import io.gatling.http.Predef.http
6+
7+
import scala.language.postfixOps
8+
9+
object ScenariosProvider {
10+
11+
private val httpProtocol =
12+
http.baseUrl("http://localhost:8080").disableCaching.disableFollowRedirect
13+
14+
def getScenario(
15+
scenarioName: String,
16+
request: ChainBuilder,
17+
tps: Double,
18+
rampUpSeconds: Int,
19+
durationSeconds: Int
20+
): PopulationBuilder = {
21+
scenario(scenarioName)
22+
.exec(request)
23+
.inject(
24+
rampUsersPerSec(0).to(tps).during(rampUpSeconds),
25+
constantUsersPerSec(tps)
26+
.during(durationSeconds - rampUpSeconds - rampUpSeconds),
27+
rampUsersPerSec(tps).to(0).during(rampUpSeconds)
28+
)
29+
.protocols(httpProtocol)
30+
}
31+
}

0 commit comments

Comments
 (0)