Skip to content

Commit ff1911b

Browse files
authored
Merge pull request #1698 from bpstelios10/SCALA-568-gatling-test-in-scala
Scala 568 gatling test in scala
2 parents 97a78ab + 28863da commit ff1911b

File tree

8 files changed

+121
-0
lines changed

8 files changed

+121
-0
lines changed

scala-gatling/.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
target
2+
.idea
3+
.settings
4+
.classpath
5+
.project

scala-gatling/README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
### Relevant Articles:
2+
- [Testing With Gatling Using Scala]()
3+
4+
### Gatling Executions
5+
From this module's folder, we first compile tests: `sbt test:compile`
6+
7+
Then run the simulation: `sbt 'Gatling/testOnly com.baeldung.gatling.PeakLoadSimulation'`
8+
9+
**Notes**: in order to spin-up the right API this example uses, we also need to start the server:
10+
`sbt resApi/run` from root folder

scala-gatling/build.sbt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
enablePlugins(GatlingPlugin)
2+
3+
scalaVersion := "2.13.15"
4+
5+
scalacOptions := Seq(
6+
"-encoding", "UTF-8", "-release:8", "-deprecation",
7+
"-feature", "-unchecked", "-language:implicitConversions", "-language:postfixOps")
8+
9+
val gatlingVersion = "3.13.1"
10+
libraryDependencies += "io.gatling.highcharts" % "gatling-charts-highcharts" % gatlingVersion % "test,it"
11+
libraryDependencies += "io.gatling" % "gatling-test-framework" % gatlingVersion % "test,it"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
sbt.version=1.10.7

scala-gatling/project/plugins.sbt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
addSbtPlugin("io.gatling" % "gatling-sbt" % "4.11.1")
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_todo_endpoint", "/todo", 200),
13+
50,
14+
10,
15+
60
16+
),
17+
getScenario(
18+
"nonExistingEndpoint",
19+
simpleRequest("request_wrong_endpoint", "/not-todo", 200),
20+
5,
21+
10,
22+
60
23+
)
24+
).assertions(
25+
details("request_todo_endpoint").successfulRequests.percent.gt(99.99),
26+
details("request_todo_endpoint").responseTime.percentile4.lt(20),
27+
details("request_todo_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:9000").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)