gatling - paris perf user group

53
Load testing made easy Stéphane Landelle @ eBusiness Information @slandelle

Upload: slandelle

Post on 10-May-2015

1.888 views

Category:

Technology


7 download

DESCRIPTION

Talk about Gatling at the Paris Performance User Group

TRANSCRIPT

Page 1: Gatling - Paris Perf User Group

Load testing made easy

Stéphane Landelle @ eBusiness Information @slandelle

Page 2: Gatling - Paris Perf User Group

"GUI"

"1user=1thread"

"Blocking I/O

- Code (Scala)

- Actor model - Non blocking I/O

Page 3: Gatling - Paris Perf User Group

Scenario scripts"

Page 4: Gatling - Paris Perf User Group

val scn = scenario("Scala.Io DoS") .repeat(10000) { exec(http("Scala.Io").get("http://scala.io")) } setUp( scn.inject(rampUsers(10000) over 30 seconds) )

Write Scala code…

Page 5: Gatling - Paris Perf User Group

… use the rich DSL … Checks

regex / css / xpath / jsonPath find / findAll / count is / in / not / whatever

Structures doIf / repeat / during / asLongAs randomSwitch / roundRobinSwitch

Error handling tryMax / exitBlockOnFail

Feeders csv / tsv / jdbc

Page 6: Gatling - Paris Perf User Group

… or use the Recorder

Page 7: Gatling - Paris Perf User Group

Orchestration"

Page 8: Gatling - Paris Perf User Group

Actors

Page 9: Gatling - Paris Perf User Group

Scenario = Actor Workflow

Repeat Actor

Start Actor

Http Request Actor

End Actor

Async Handler Actor

Session

Page 10: Gatling - Paris Perf User Group

Scenario = Actor Workflow

Repeat Actor

Start Actor

Http Request Actor

End Actor

Async Handler Actor

Session

Page 11: Gatling - Paris Perf User Group

Scenario = Actor Workflow

Repeat Actor

Start Actor

Http Request Actor

End Actor

Async Handler Actor

Async Handler

Session

Page 12: Gatling - Paris Perf User Group

Scenario = Actor Workflow

Repeat Actor

Start Actor

Http Request Actor

End Actor

Async Handler Actor

Async Handler

Session

Page 13: Gatling - Paris Perf User Group

Scenario = Actor Workflow

Repeat Actor

Start Actor

Http Request Actor

End Actor

Async Handler Actor

Session

Page 14: Gatling - Paris Perf User Group

Scenario = Actor Workflow

Repeat Actor

Start Actor

Http Request Actor

End Actor

Async Handler Actor

Session

Page 15: Gatling - Paris Perf User Group

I/O"

Page 16: Gatling - Paris Perf User Group

NIO

Page 17: Gatling - Paris Perf User Group

Extensions"

Page 18: Gatling - Paris Perf User Group

•  Maven Plugin •  Maven archetype (run in IDE) •  Jenkins plugin •  Graphite live reporting •  SBT plugin (WIP)

Page 19: Gatling - Paris Perf User Group
Page 20: Gatling - Paris Perf User Group

Gatling 2"

Page 21: Gatling - Paris Perf User Group

• Planned for 2014: o  Tons of refactoring o  Tons of new features

• Sorry folks, we’re late: o Greater good: stability

• Milestones: o Current M3 o Next M4 december?

Page 22: Gatling - Paris Perf User Group

New Expression API"

Page 23: Gatling - Paris Perf User Group

Expression in Gatling 1

type Expression = Session => String implicit def toExpression(s: String): Expression http("Foo").get("https://www.google.fr/search?q=${term}")

Page 24: Gatling - Paris Perf User Group

Gatling 1 issues o What if “term” is undefined? o What if “term” is of wrong type?

è Unsafe, deal with Exceptions, not generic

repeat("${times}") {} // Expects Int foreach("${seq}”) {} // Expects Seq

Page 25: Gatling - Paris Perf User Group

Validation

Validation[+T] -  map -  flatMap

Success[+T] (value: T)

Failure (message: String)

Page 26: Gatling - Paris Perf User Group

Usage: Building a request

flatMap that s**t!

buildURI(httpAttributes.urlOrURI) .flatMap(configureQueryCookiesAndProxy) .flatMap(configureVirtualHost) .flatMap(configureHeaders) .flatMap(configureRealm)

Page 27: Gatling - Paris Perf User Group

New Expression API

type Expression[T] = Session => Validation[T] implicit def toExpression[T](s: String): Expression[T]

Page 28: Gatling - Paris Perf User Group

New Session API

val foo: Validation[T] = session("foo").validate[T] // unsafe: val bar: T = session("foo").as[T] val baz: Option[T] = session("foo").asOption[T]

Page 29: Gatling - Paris Perf User Group

New Templating API"

Page 30: Gatling - Paris Perf User Group

Templating API in Gatling 1

•  (Session => String) / Expression:

o  Function o  Implicitly compiled EL String

• Scalate SSP

Page 31: Gatling - Paris Perf User Group

Scalate SSP

o  Can have complex logic

o  Scala compiler in the background (overhead, proper stop) o  Own API, learning curve o  Does play well with Session API

Why do we need this anyway?

Page 32: Gatling - Paris Perf User Group

New Templating API: the EL way

Embedded

// passing an EL String setBody(StringBody("""{ foo: "${foo}", bar: ${bar} }""")

Page 33: Gatling - Paris Perf User Group

New Templating API: the EL way

External EL based text file

// passing an EL File setBody(ELFileBody("body.txt"))

{ foo: "${foo}", bar: ${bar} }

Page 34: Gatling - Paris Perf User Group

New Templating API: the EL way

o  Simple

o  Limited, can’t implement complex logic

Page 35: Gatling - Paris Perf User Group

Why do we need non-Scala templates anyway?!

We’re not in JSP world!

We have multiline Strings and macros!

Page 36: Gatling - Paris Perf User Group

String interpolation val jsonTemplate: Expression[String] = session => for { foo <- session("foo").validate[String] bar <- session("bar").validate[Int] } yield s"""{

foo: "$foo", bar: $bar }"""

Page 37: Gatling - Paris Perf User Group

String interpolation

o  Pure Scala o  Compile time, not runtime o  Standard Scala library

o  Requires a bit more Scala skills o  Complex logic => intermediate String concatenations

Page 38: Gatling - Paris Perf User Group

Fastring

https://github.com/Atry/fastring •  StringBuilder underneath •  Produces Fastrings, not Strings

Page 39: Gatling - Paris Perf User Group

Fastring val jsonTemplate: Expression[String] = session => for (foos <- session("foos").validate[Seq[String]]) yield

fast"""{ foos = [

${foos.map(foo => fast"""{foo: "$foo"}""").mkFastring("\n")} ]

}""".toString

Page 40: Gatling - Paris Perf User Group

Checks improvements

Page 41: Gatling - Paris Perf User Group

Regex check in Gatling 1

è produces Strings è no more than 1 capture group

regex("foo(.*)bar").saveAs("baz")

Page 42: Gatling - Paris Perf User Group

Issue <form> <input type="hidden" name="foo" value="foo" /> <input type="hidden" name="bar" value="baz" /> </form>

è workaround: 2 regex + manual zip

Page 43: Gatling - Paris Perf User Group

Tuple support We need:

String (String, String)

(String, String, String) (String, String, String, String)

But generic, please…

Page 44: Gatling - Paris Perf User Group

Type class FTW regex[T](pattern: Expression[String]) (implicit groupExtractor: GroupExtractor[T])

object GroupExtractor { implicit val groupExtractor2: GroupExtractor[(String, String)] = ??? } trait GroupExtractor

regex[(String, String)]("foo(.*)bar(.*)baz")

Page 45: Gatling - Paris Perf User Group

Also for •  headerRegex[T] T of String, Tuple2[String] , Tuple3[String]… •  jsonPath[T] T of Int, Long, Double, Float, String, List, Map •  XPath? •  CSS selectors?

Page 46: Gatling - Paris Perf User Group

Resource fetching""

Page 47: Gatling - Paris Perf User Group

Gatling 1

HTML page

Resource 1

Resource 2

Resource 3

Sequential workflow

Page 48: Gatling - Paris Perf User Group

Not how browsers work

HTML page

Resource 1

Resource 2

Resource 3

Parallel workflow

Page 49: Gatling - Paris Perf User Group

Very complex actually 1. Fetch HTML 2. Fetch HTML embedded resources 3. Fetch some additional resources (CSS @import) 4. Fetch matching CSS rules resources (@font-face, background-image) 5. …

(not accounting for javascript)

è Can’t be perfect without being a browser è Will have to approximate

Page 50: Gatling - Paris Perf User Group

Kind of scatter-gather pattern

HTML page

ResourceFetcher Actor

Beware of Session reconciliation!

Session + HTML

Fetch resources

New Session

Next

Page 51: Gatling - Paris Perf User Group

DSL exec( http(“Page").get("http://foo.com") .resources( http(“Ajax1").get("http://foo.com/ajax1"), http(“Ajax2").get("http://foo.com/ajax2") .check(regex("foo(.*)bar").saveAs("baz")) ) )

Page 52: Gatling - Paris Perf User Group
Page 53: Gatling - Paris Perf User Group

http://gatling-tool.orghttp://github.com/excilys/gatling@GatlingTool