SlideShare a Scribd company logo
Performance tests with
Gatling
Andrzej Ludwikowski
About me
➔aludwikowski.blogspot.com
➔github.com/aludwiko
➔@aludwikowski
Stress test your backend with Gatling
Performance tests - why so hard?
Simulate production as close as possible:
● hardware
○ CPU, RAM, storage, ...
● software
○ OS, Virtualization, DBs, …
● load
● isolation
Performance tests - why so hard?
Necessary to have:
● infrastructure
● monitoring
● logging
Performance tests - why so hard?
● Your performance intuition is wrong!
1. collect the data (monitoring, logging, profiling)
2. find the bottleneck (based on data)
3. fix the bottleneck
4. collect the data and check the assumptions
5. go to 1.
Performance tests - why so hard?
Lies, damned lies, and statistics:
● arithmetic mean = 2.9
● median = 1
● standard deviation = 6 (only for normal distribution)
Performance tests - why so hard?
● Anscombe's quartet
http://bravenewgeek.com/tag/coordinated-omission/
Property Value
Mean of x 9
Sample variance of x 11
Mean of y 7.50
Sample variance of y 4.125
Correlation between x and y 0.816
Linear regression line y = 3 + 0.5x
Coefficient of determination of
the linear regression
0.67
Performance tests - why so hard?
Lies, damned lies, and statistics:
● arithmetic mean = 2.9
● median = 1
● standard deviation = 6 (only for normal distribution)
Use:
percentiles
50th = 1
70th = 1
90th = 2.9
95th = 11.45
99th = 18.29
Check percentiles implementation!
Performance tests - why so hard?
● Coordinated omission problem by Gil Tene
http://bravenewgeek.com/tag/coordinated-omission/
Coordinated omission problem
http://bravenewgeek.com/tag/coordinated-omission/
system.exit(0)
Coordinated omission problem
http://bravenewgeek.com/tag/coordinated-omission/
system.exit(0)
samples 31
50 th 1
70 th 1
90 th 1
95 th 1
99 th 12.89
99,9 th 28.30
99,99 th 29.82
avg 1.93
Coordinated omission problem
http://bravenewgeek.com/tag/coordinated-omission/
system.exit(0)
samples 10001
50 th 1
70 th 1
90 th 1
95 th 1
99 th 1
99,9 th 1.15
99,99 th 28.01
avg 1.03
Coordinated omission problem
http://bravenewgeek.com/tag/coordinated-omission/
system.exit(0)
Coordinated omission problem
http://bravenewgeek.com/tag/coordinated-omission/
system.exit(0)
samples 60
50 th 1
70 th 12.6
90 th 24.3
95 th 27.2
99 th 29.45
99,9 th 29.95
99,99 th 29.99
avg 8.25
Coordinated omission problem
Coordinated omission problem
total time 60 s
max 30 s
99th 1 s
Coordinated omission problem
total time 60 s
max 30 s
99th 1 s
time in % for max 50%
Coordinated omission problem
total time 60 s
max 30 s
99th 1 s
time in % for max 50%
expected time in % for 99th 50% - 1% = 49%
Coordinated omission problem
total time 60 s
max 30 s
99th 1 s
time in % for max 50%
expected time in % for 99th 50% - 1% = 49%
real time for 99th 60 s * 49% = 29.4 s
Coordinated omission problem
http://bravenewgeek.com/tag/coordinated-omission/
Performance tests - why so hard?
● Coordinated omission vs Gatling
http://bravenewgeek.com/tag/coordinated-omission/
Performance tests - why so hard?
● Tests…
Performance tests - why so hard?
● Tests…
Gatling
Gatling
Why Gatling?
● non-blocking, asynchronous stack (scala, akka, netty)
● scala !!!111oneoneone (maven, sbt support)
● DSL
● recorder
● math is good
● reports
● integration & performance tests
Gatling DSL
class BasicSimulation extends Simulation {
val httpConf = http
.baseURL("http://computer-database.gatling.io")
.acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
.acceptEncodingHeader("gzip, deflate")
.acceptLanguageHeader("en-US,en;q=0.5")
.userAgentHeader("Mozilla/5.0 (Macintosh; X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0")
val firstScenario = scenario("First Scenario Name")
.exec(http("Request name").get("/"))
.pause(7)
setUp(firstScenario.inject(atOnceUsers(1)).protocols(httpConf))
}
Gatling DSL
class FirstScenarioV2 extends MySimulation {
val firstScenario = scenario("First Scenario Name")
.exec(http("Go to root page").get("/"))
.pause(7 seconds)
setUp(firstScenario.inject(atOnceUsers(1)).protocols(httpConf))
}
Gatling DSL
import io.gatling.core.Predef._
import io.gatling.http.Predef._
class FirstScenarioV2 extends MySimulation {
val firstScenario = scenario("First Scenario Name")
.exec(http("Go to root page").get("/"))
.pause(7 seconds)
setUp(firstScenario.inject(atOnceUsers(1)).protocols(httpConf))
}
Gatling DSL
class ComplexScenario extends MySimulation {
val complexScenario = scenario("Complex demo scenario")
.exec(http("request_1").get("/")).pause(7)
.exec(http("request_2").get("/computers?f=macbook")).pause(2)
.exec(http("request_3").get("/computers/6")).pause(3)
.exec(http("request_4").get("/")).pause(2)
.exec(http("request_5").get("/computers?p=1")).pause(670 milliseconds)
.exec(http("request_6").get("/computers/new")).pause(1)
.exec(http("request_7")
.post("/computers")
.formParam("name", "MyComputer").formParam("introduced", "2012-05-30").formParam("company", "37"))
setUp(complexScenario.inject(atOnceUsers(1)).protocols(httpConf))
}
Gatling DSL
class ComplexScenarioV2 extends MySimulation {
val complexScenario = scenario("Complex demo scenario")
.exec(goToRootPage).pause(7)
.exec(searchFor("macbook")).pause(2)
.exec(positionAt(6)).pause(3)
.exec(goToRootPage).pause(2)
.exec(goToPage(1)).pause(670 milliseconds)
.exec(openNewComputerForm).pause(1)
.exec(addNewComputer)
setUp(complexScenario.inject(atOnceUsers(1)).protocols(httpConf))
}
Gatling DSL
class ComplexScenarioV3 extends MySimulation {
val search = exec(goToRootPage).pause(7)
.exec(searchFor("macbook")).pause(2)
.exec(positionAt(6)).pause(3)
val addComputer = exec(goToRootPage).pause(2)
.exec(goToPage(1)).pause(670 milliseconds)
.exec(openNewComputerForm).pause(1)
.exec(addNewComputer)
val complexScenario = scenario("Complex demo scenario").exec(search, addComputer)
setUp(complexScenario.inject(atOnceUsers(1)).protocols(httpConf))
}
Gatling DSL - checks
scenario("DSL demo")
.exec(http("go to page")
.get("/computers")
.check(status.is(200))
.check(status.in(200 to 210))
Gatling DSL - checks
scenario("DSL demo")
.exec(http("go to page")
.get("/computers")
.check(regex("computers")
.find(1)
.exists)
https://www.pinterest.com/pin/491666484294006138/
Gatling DSL - checks
scenario("First Scenario Name")
.exec(http("Request name")
.get("/computers")
.check(jsonPath("$..foo.bar[2].baz").ofType[String].notExists)
.check(xpath("//input[@id='text1']/@value").is("test"))
.check(css("...").transform(_.split('|').toSeq).is(Seq("1", "2")))
Gatling DSL - checks
scenario("DSL demo")
.exec(http("Authorize")
.get("/auth")
.check(regex("token").find(1).exists
.saveAs("authorizationToken")))
.exec(http("Authorized resource")
.get("/authorized_resource?token=${authorizationToken}"))
Gatling DSL - looping
repeat(5, "i") {
exec(goToPage("${i}".toInt))
.pause(1)
}
● repeat
● foreach
● during
● asLongAs
● forever
https://blog.hubspot.com/blog/tabid/6307/bid/32019/Why-Every-Marketer-Needs-Closed-Loop-Reporting.aspx#sm.0005lrqj811waf3ntmn1cul3881gr
Gatling DSL - polling
exec(
polling
.every(10 seconds)
.exec(searchFor("thinkpad"))
)
http://www.firmus-solutions.com/terms-conditions.html
Gatling DSL - conditions
doIf(session => session("user").as[String].startsWith("admin")) {
exec(goToAdminPage)
}
● doIf
● doIfEquals
● doIfOrElse
● doSwitch
● doSwitchOrElse
● randomSwitch
https://en.wikipedia.org/wiki/Decision_tree
Gatling DSL - error management
exec(sendMoney)
.tryMax(10){
exec(checkIfMoneyReceived)
}
● tryMax
● exitBlockOnFail
● exitHereIfFailed
Alice Bob
Kafka
Gatling DSL - setup
setUp(myScenario
.inject(
nothingFor(4 seconds),
atOnceUsers(10),
rampUsers(10) over (5 seconds))
.protocols(httpConf))
.maxDuration(10 minutes)
● constantUsersPerSec
● rampUsersPerSec
● splitUsers
● heavisideUsers
Gatling DSL - setup
setUp(myScenario
.inject(atOnceUsers(10))
.protocols(httpConf))
.assertions(
global.responseTime.max.lt(50),
global.failedRequests.percent.is(0)
)
http://englishthroughlaxas.blogspot.com/2015/07/531-24-expression-of-assertion-emphasis.html
Gatling DSL - setup
setUp(myScenario
.inject(atOnceUsers(10))
.protocols(httpConf))
.throttle(
reachRps(100) in (30 second),
holdFor(1 minute),
jumpToRps(50),
holdFor(2 hours)
)
Gatling DSL - feeders
val companies = List("apple", "lenovo", "hp")
val feeder = Iterator.continually(
Map("company" -> companies(Random.nextInt(companies.size))))
val searching = scenario("Searching")
.feed(feeder)
.exec(searchFor("${company}"))
● RecordSeqFeederBuilder
● CSV
● JSON
● JDBC
● Sitemap
● Redis
● … http://favim.com/orig/201104/23/Favim.com-22725.jpg
Gatling DSL - resource inferring
val httpConf = http
.baseURL("http://computer-database.gatling.io")
.acceptHeader("...")
.acceptEncodingHeader("...")
.acceptLanguageHeader("...")
.inferHtmlResources()
.userAgentHeader("...")
Gatling - launching
● gatling:test
● gatling:testOnly x.y.z.GetUserSimulation
Gatling DSL - other goodies
● Custom validators
● HTTP
○ SSL
○ SSE (Server Sent Event)
○ basic cookies support
● WebSocket
● JMS
● Pluginable architecture:
○ cassandra plugin
○ kafka plugin
○ rabbitMQ
○ AMQP
Gatling DSL - logging/debugging
● logging ALL HTTP request and responses
<logger name="io.gatling.http.ahc" level="TRACE" />
<logger name="io.gatling.http.response" level="TRACE" />
● logging ONLY FAILED HTTP request and responses
<logger name="io.gatling.http.ahc" level="DEBUG" />
<logger name="io.gatling.http.response" level="DEBUG" />
Gatling DSL - reporting
================================================================================
---- Global Information --------------------------------------------------------
> request count 10 (OK=10 KO=0 )
> min response time 40 (OK=40 KO=- )
> max response time 177 (OK=177 KO=- )
> mean response time 55 (OK=55 KO=- )
> std deviation 41 (OK=41 KO=- )
> response time 50th percentile 42 (OK=42 KO=- )
> response time 75th percentile 43 (OK=43 KO=- )
> response time 95th percentile 117 (OK=117 KO=- )
> response time 99th percentile 165 (OK=165 KO=- )
> mean requests/sec 0.909 (OK=0.909 KO=- )
---- Response Time Distribution ------------------------------------------------
> t < 800 ms 10 (100%)
> 800 ms < t < 1200 ms 0 ( 0%)
> t > 1200 ms 0 ( 0%)
> failed 0 ( 0%)
================================================================================
Gatling DSL - distributed
Gatling DSL - distributed
IT system
Gatling DSL - distributed
● manually
● Gatling FrontLine
● Flood.io
IT system
Stress test your backend with Gatling

More Related Content

PDF
Performance tests with Gatling (extended)
PPTX
Performance tests with Gatling
PDF
Blast your app with Gatling! by Stephane Landelle
PDF
Painless JavaScript Testing with Jest
ODP
Gatling - Stress test tool
PDF
We Are All Testers Now: The Testing Pyramid and Front-End Development
PDF
Browser testing with nightwatch.js - Drupal Europe
PDF
Unit Testing with Jest
Performance tests with Gatling (extended)
Performance tests with Gatling
Blast your app with Gatling! by Stephane Landelle
Painless JavaScript Testing with Jest
Gatling - Stress test tool
We Are All Testers Now: The Testing Pyramid and Front-End Development
Browser testing with nightwatch.js - Drupal Europe
Unit Testing with Jest

What's hot (20)

PDF
Unit testing JavaScript using Mocha and Node
PDF
Testing javascript in the frontend
PDF
JavaScript TDD with Jasmine and Karma
PDF
Unit testing with mocha
PDF
Adventures In JavaScript Testing
PDF
Testing JavaScript Applications
PDF
Advanced Jasmine - Front-End JavaScript Unit Testing
PDF
Load Testing with RedLine13: Or getting paid to DoS your own systems
PDF
Quick tour to front end unit testing using jasmine
PDF
Unit Testing Express Middleware
PDF
JavaScript Test-Driven Development with Jasmine 2.0 and Karma
PDF
PL/SQL Unit Testing Can Be Fun!
PDF
Intro to testing Javascript with jasmine
PPTX
Automation patterns on practice
PPTX
Test driving-qml
PPT
Find bottleneck and tuning in Java Application
KEY
Groovy Ecosystem - JFokus 2011 - Guillaume Laforge
PDF
Unit tests in node.js
PPTX
Full Stack Unit Testing
PDF
Load Testing with PHP and RedLine13
Unit testing JavaScript using Mocha and Node
Testing javascript in the frontend
JavaScript TDD with Jasmine and Karma
Unit testing with mocha
Adventures In JavaScript Testing
Testing JavaScript Applications
Advanced Jasmine - Front-End JavaScript Unit Testing
Load Testing with RedLine13: Or getting paid to DoS your own systems
Quick tour to front end unit testing using jasmine
Unit Testing Express Middleware
JavaScript Test-Driven Development with Jasmine 2.0 and Karma
PL/SQL Unit Testing Can Be Fun!
Intro to testing Javascript with jasmine
Automation patterns on practice
Test driving-qml
Find bottleneck and tuning in Java Application
Groovy Ecosystem - JFokus 2011 - Guillaume Laforge
Unit tests in node.js
Full Stack Unit Testing
Load Testing with PHP and RedLine13
Ad

Similar to Stress test your backend with Gatling (20)

PDF
JDD 2017: Performance tests with Gatling (Andrzej Ludwikowski)
PDF
Performance tests - it's a trap
PPTX
ScalaCheck
PDF
CBDW2014 - MockBox, get ready to mock your socks off!
PDF
Token Testing Slides
ODP
Good Practices On Test Automation
PPTX
Testing ASP.NET - Progressive.NET
PDF
Performance tests with gatling
PDF
Unit testing in iOS featuring OCUnit, GHUnit & OCMock
ZIP
Automated Frontend Testing
PDF
Performance Test Driven Development with Oracle Coherence
PDF
Pocket Talk; Spock framework
PDF
Spock framework
PDF
Paradigma FP y OOP usando técnicas avanzadas de Programación | Programacion A...
PDF
JAVASCRIPT TDD(Test driven Development) & Qunit Tutorial
PDF
Testing and validating spark programs - Strata SJ 2016
PDF
Artem Storozhuk "Building SQL firewall: insights from developers"
PDF
How to fake_properly
KEY
Django’s nasal passage
PDF
Thomas Fuchs Presentation
JDD 2017: Performance tests with Gatling (Andrzej Ludwikowski)
Performance tests - it's a trap
ScalaCheck
CBDW2014 - MockBox, get ready to mock your socks off!
Token Testing Slides
Good Practices On Test Automation
Testing ASP.NET - Progressive.NET
Performance tests with gatling
Unit testing in iOS featuring OCUnit, GHUnit & OCMock
Automated Frontend Testing
Performance Test Driven Development with Oracle Coherence
Pocket Talk; Spock framework
Spock framework
Paradigma FP y OOP usando técnicas avanzadas de Programación | Programacion A...
JAVASCRIPT TDD(Test driven Development) & Qunit Tutorial
Testing and validating spark programs - Strata SJ 2016
Artem Storozhuk "Building SQL firewall: insights from developers"
How to fake_properly
Django’s nasal passage
Thomas Fuchs Presentation
Ad

More from Andrzej Ludwikowski (8)

PDF
Event-driven systems without pulling your hair out
PDF
Event Sourcing - what could go wrong - Devoxx BE
PDF
Event Sourcing - what could go wrong - Jfokus 2022
PDF
Event sourcing - what could possibly go wrong ? Devoxx PL 2021
PDF
Event Sourcing - what could possibly go wrong?
PDF
Cassandra lesson learned - extended
PDF
Cassandra - lesson learned
PPTX
Annotation processing tool
Event-driven systems without pulling your hair out
Event Sourcing - what could go wrong - Devoxx BE
Event Sourcing - what could go wrong - Jfokus 2022
Event sourcing - what could possibly go wrong ? Devoxx PL 2021
Event Sourcing - what could possibly go wrong?
Cassandra lesson learned - extended
Cassandra - lesson learned
Annotation processing tool

Recently uploaded (20)

PPTX
Online Work Permit System for Fast Permit Processing
PDF
Build Multi-agent using Agent Development Kit
PDF
Exploring AI Agents in Process Industries
PDF
The Role of Automation and AI in EHS Management for Data Centers.pdf
DOCX
The Future of Smart Factories Why Embedded Analytics Leads the Way
PDF
Convert Thunderbird to Outlook into bulk
PDF
How to Confidently Manage Project Budgets
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
PDF
AI in Product Development-omnex systems
PPTX
Odoo Consulting Services by CandidRoot Solutions
PDF
Become an Agentblazer Champion Challenge Kickoff
PDF
Micromaid: A simple Mermaid-like chart generator for Pharo
PDF
QAware_Mario-Leander_Reimer_Architecting and Building a K8s-based AI Platform...
PPTX
Safe Confined Space Entry Monitoring_ Singapore Experts.pptx
PDF
IEEE-CS Tech Predictions, SWEBOK and Quantum Software: Towards Q-SWEBOK
PPTX
Lecture #1.ppt.pptx, Visuals Programming
PPTX
Materi_Pemrograman_Komputer-Looping.pptx
PDF
Comprehensive Salesforce Implementation Services.pdf
PDF
The Future of Smart Factories Why Embedded Analytics Leads the Way
PPTX
Materi-Enum-and-Record-Data-Type (1).pptx
Online Work Permit System for Fast Permit Processing
Build Multi-agent using Agent Development Kit
Exploring AI Agents in Process Industries
The Role of Automation and AI in EHS Management for Data Centers.pdf
The Future of Smart Factories Why Embedded Analytics Leads the Way
Convert Thunderbird to Outlook into bulk
How to Confidently Manage Project Budgets
2025 Textile ERP Trends: SAP, Odoo & Oracle
AI in Product Development-omnex systems
Odoo Consulting Services by CandidRoot Solutions
Become an Agentblazer Champion Challenge Kickoff
Micromaid: A simple Mermaid-like chart generator for Pharo
QAware_Mario-Leander_Reimer_Architecting and Building a K8s-based AI Platform...
Safe Confined Space Entry Monitoring_ Singapore Experts.pptx
IEEE-CS Tech Predictions, SWEBOK and Quantum Software: Towards Q-SWEBOK
Lecture #1.ppt.pptx, Visuals Programming
Materi_Pemrograman_Komputer-Looping.pptx
Comprehensive Salesforce Implementation Services.pdf
The Future of Smart Factories Why Embedded Analytics Leads the Way
Materi-Enum-and-Record-Data-Type (1).pptx

Stress test your backend with Gatling

  • 4. Performance tests - why so hard? Simulate production as close as possible: ● hardware ○ CPU, RAM, storage, ... ● software ○ OS, Virtualization, DBs, … ● load ● isolation
  • 5. Performance tests - why so hard? Necessary to have: ● infrastructure ● monitoring ● logging
  • 6. Performance tests - why so hard? ● Your performance intuition is wrong! 1. collect the data (monitoring, logging, profiling) 2. find the bottleneck (based on data) 3. fix the bottleneck 4. collect the data and check the assumptions 5. go to 1.
  • 7. Performance tests - why so hard? Lies, damned lies, and statistics: ● arithmetic mean = 2.9 ● median = 1 ● standard deviation = 6 (only for normal distribution)
  • 8. Performance tests - why so hard? ● Anscombe's quartet http://bravenewgeek.com/tag/coordinated-omission/ Property Value Mean of x 9 Sample variance of x 11 Mean of y 7.50 Sample variance of y 4.125 Correlation between x and y 0.816 Linear regression line y = 3 + 0.5x Coefficient of determination of the linear regression 0.67
  • 9. Performance tests - why so hard? Lies, damned lies, and statistics: ● arithmetic mean = 2.9 ● median = 1 ● standard deviation = 6 (only for normal distribution) Use: percentiles 50th = 1 70th = 1 90th = 2.9 95th = 11.45 99th = 18.29 Check percentiles implementation!
  • 10. Performance tests - why so hard? ● Coordinated omission problem by Gil Tene http://bravenewgeek.com/tag/coordinated-omission/
  • 15. Coordinated omission problem http://bravenewgeek.com/tag/coordinated-omission/ system.exit(0) samples 60 50 th 1 70 th 12.6 90 th 24.3 95 th 27.2 99 th 29.45 99,9 th 29.95 99,99 th 29.99 avg 8.25
  • 17. Coordinated omission problem total time 60 s max 30 s 99th 1 s
  • 18. Coordinated omission problem total time 60 s max 30 s 99th 1 s time in % for max 50%
  • 19. Coordinated omission problem total time 60 s max 30 s 99th 1 s time in % for max 50% expected time in % for 99th 50% - 1% = 49%
  • 20. Coordinated omission problem total time 60 s max 30 s 99th 1 s time in % for max 50% expected time in % for 99th 50% - 1% = 49% real time for 99th 60 s * 49% = 29.4 s
  • 22. Performance tests - why so hard? ● Coordinated omission vs Gatling http://bravenewgeek.com/tag/coordinated-omission/
  • 23. Performance tests - why so hard? ● Tests…
  • 24. Performance tests - why so hard? ● Tests…
  • 27. Why Gatling? ● non-blocking, asynchronous stack (scala, akka, netty) ● scala !!!111oneoneone (maven, sbt support) ● DSL ● recorder ● math is good ● reports ● integration & performance tests
  • 28. Gatling DSL class BasicSimulation extends Simulation { val httpConf = http .baseURL("http://computer-database.gatling.io") .acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") .acceptEncodingHeader("gzip, deflate") .acceptLanguageHeader("en-US,en;q=0.5") .userAgentHeader("Mozilla/5.0 (Macintosh; X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0") val firstScenario = scenario("First Scenario Name") .exec(http("Request name").get("/")) .pause(7) setUp(firstScenario.inject(atOnceUsers(1)).protocols(httpConf)) }
  • 29. Gatling DSL class FirstScenarioV2 extends MySimulation { val firstScenario = scenario("First Scenario Name") .exec(http("Go to root page").get("/")) .pause(7 seconds) setUp(firstScenario.inject(atOnceUsers(1)).protocols(httpConf)) }
  • 30. Gatling DSL import io.gatling.core.Predef._ import io.gatling.http.Predef._ class FirstScenarioV2 extends MySimulation { val firstScenario = scenario("First Scenario Name") .exec(http("Go to root page").get("/")) .pause(7 seconds) setUp(firstScenario.inject(atOnceUsers(1)).protocols(httpConf)) }
  • 31. Gatling DSL class ComplexScenario extends MySimulation { val complexScenario = scenario("Complex demo scenario") .exec(http("request_1").get("/")).pause(7) .exec(http("request_2").get("/computers?f=macbook")).pause(2) .exec(http("request_3").get("/computers/6")).pause(3) .exec(http("request_4").get("/")).pause(2) .exec(http("request_5").get("/computers?p=1")).pause(670 milliseconds) .exec(http("request_6").get("/computers/new")).pause(1) .exec(http("request_7") .post("/computers") .formParam("name", "MyComputer").formParam("introduced", "2012-05-30").formParam("company", "37")) setUp(complexScenario.inject(atOnceUsers(1)).protocols(httpConf)) }
  • 32. Gatling DSL class ComplexScenarioV2 extends MySimulation { val complexScenario = scenario("Complex demo scenario") .exec(goToRootPage).pause(7) .exec(searchFor("macbook")).pause(2) .exec(positionAt(6)).pause(3) .exec(goToRootPage).pause(2) .exec(goToPage(1)).pause(670 milliseconds) .exec(openNewComputerForm).pause(1) .exec(addNewComputer) setUp(complexScenario.inject(atOnceUsers(1)).protocols(httpConf)) }
  • 33. Gatling DSL class ComplexScenarioV3 extends MySimulation { val search = exec(goToRootPage).pause(7) .exec(searchFor("macbook")).pause(2) .exec(positionAt(6)).pause(3) val addComputer = exec(goToRootPage).pause(2) .exec(goToPage(1)).pause(670 milliseconds) .exec(openNewComputerForm).pause(1) .exec(addNewComputer) val complexScenario = scenario("Complex demo scenario").exec(search, addComputer) setUp(complexScenario.inject(atOnceUsers(1)).protocols(httpConf)) }
  • 34. Gatling DSL - checks scenario("DSL demo") .exec(http("go to page") .get("/computers") .check(status.is(200)) .check(status.in(200 to 210))
  • 35. Gatling DSL - checks scenario("DSL demo") .exec(http("go to page") .get("/computers") .check(regex("computers") .find(1) .exists) https://www.pinterest.com/pin/491666484294006138/
  • 36. Gatling DSL - checks scenario("First Scenario Name") .exec(http("Request name") .get("/computers") .check(jsonPath("$..foo.bar[2].baz").ofType[String].notExists) .check(xpath("//input[@id='text1']/@value").is("test")) .check(css("...").transform(_.split('|').toSeq).is(Seq("1", "2")))
  • 37. Gatling DSL - checks scenario("DSL demo") .exec(http("Authorize") .get("/auth") .check(regex("token").find(1).exists .saveAs("authorizationToken"))) .exec(http("Authorized resource") .get("/authorized_resource?token=${authorizationToken}"))
  • 38. Gatling DSL - looping repeat(5, "i") { exec(goToPage("${i}".toInt)) .pause(1) } ● repeat ● foreach ● during ● asLongAs ● forever https://blog.hubspot.com/blog/tabid/6307/bid/32019/Why-Every-Marketer-Needs-Closed-Loop-Reporting.aspx#sm.0005lrqj811waf3ntmn1cul3881gr
  • 39. Gatling DSL - polling exec( polling .every(10 seconds) .exec(searchFor("thinkpad")) ) http://www.firmus-solutions.com/terms-conditions.html
  • 40. Gatling DSL - conditions doIf(session => session("user").as[String].startsWith("admin")) { exec(goToAdminPage) } ● doIf ● doIfEquals ● doIfOrElse ● doSwitch ● doSwitchOrElse ● randomSwitch https://en.wikipedia.org/wiki/Decision_tree
  • 41. Gatling DSL - error management exec(sendMoney) .tryMax(10){ exec(checkIfMoneyReceived) } ● tryMax ● exitBlockOnFail ● exitHereIfFailed Alice Bob Kafka
  • 42. Gatling DSL - setup setUp(myScenario .inject( nothingFor(4 seconds), atOnceUsers(10), rampUsers(10) over (5 seconds)) .protocols(httpConf)) .maxDuration(10 minutes) ● constantUsersPerSec ● rampUsersPerSec ● splitUsers ● heavisideUsers
  • 43. Gatling DSL - setup setUp(myScenario .inject(atOnceUsers(10)) .protocols(httpConf)) .assertions( global.responseTime.max.lt(50), global.failedRequests.percent.is(0) ) http://englishthroughlaxas.blogspot.com/2015/07/531-24-expression-of-assertion-emphasis.html
  • 44. Gatling DSL - setup setUp(myScenario .inject(atOnceUsers(10)) .protocols(httpConf)) .throttle( reachRps(100) in (30 second), holdFor(1 minute), jumpToRps(50), holdFor(2 hours) )
  • 45. Gatling DSL - feeders val companies = List("apple", "lenovo", "hp") val feeder = Iterator.continually( Map("company" -> companies(Random.nextInt(companies.size)))) val searching = scenario("Searching") .feed(feeder) .exec(searchFor("${company}")) ● RecordSeqFeederBuilder ● CSV ● JSON ● JDBC ● Sitemap ● Redis ● … http://favim.com/orig/201104/23/Favim.com-22725.jpg
  • 46. Gatling DSL - resource inferring val httpConf = http .baseURL("http://computer-database.gatling.io") .acceptHeader("...") .acceptEncodingHeader("...") .acceptLanguageHeader("...") .inferHtmlResources() .userAgentHeader("...")
  • 47. Gatling - launching ● gatling:test ● gatling:testOnly x.y.z.GetUserSimulation
  • 48. Gatling DSL - other goodies ● Custom validators ● HTTP ○ SSL ○ SSE (Server Sent Event) ○ basic cookies support ● WebSocket ● JMS ● Pluginable architecture: ○ cassandra plugin ○ kafka plugin ○ rabbitMQ ○ AMQP
  • 49. Gatling DSL - logging/debugging ● logging ALL HTTP request and responses <logger name="io.gatling.http.ahc" level="TRACE" /> <logger name="io.gatling.http.response" level="TRACE" /> ● logging ONLY FAILED HTTP request and responses <logger name="io.gatling.http.ahc" level="DEBUG" /> <logger name="io.gatling.http.response" level="DEBUG" />
  • 50. Gatling DSL - reporting ================================================================================ ---- Global Information -------------------------------------------------------- > request count 10 (OK=10 KO=0 ) > min response time 40 (OK=40 KO=- ) > max response time 177 (OK=177 KO=- ) > mean response time 55 (OK=55 KO=- ) > std deviation 41 (OK=41 KO=- ) > response time 50th percentile 42 (OK=42 KO=- ) > response time 75th percentile 43 (OK=43 KO=- ) > response time 95th percentile 117 (OK=117 KO=- ) > response time 99th percentile 165 (OK=165 KO=- ) > mean requests/sec 0.909 (OK=0.909 KO=- ) ---- Response Time Distribution ------------------------------------------------ > t < 800 ms 10 (100%) > 800 ms < t < 1200 ms 0 ( 0%) > t > 1200 ms 0 ( 0%) > failed 0 ( 0%) ================================================================================
  • 51. Gatling DSL - distributed
  • 52. Gatling DSL - distributed IT system
  • 53. Gatling DSL - distributed ● manually ● Gatling FrontLine ● Flood.io IT system