Réaliser des
   tests de charge
     avec Gatling
par Stéphane Landelle    @slandelle
  & Romain Sertelon     @BluePyth




                                      1
Plan

•Pourquoi un nième
 injecteur ?
•Solution
•Démo
                     2
Pourquoi un nième
   injecteur ?


                    3
Problème 1:
Les performances




                   4
1 utilisateur = 1 thread



                           5
~50 threads/JVM
                  6
~2000 threads/JVM
                    7
IO bloquants



               8
Au fait, que font ces
      threads?




   Ils attendent…

                        9
Et sinon?



Ils dorment…



                   10
Problème 2:
Utilisabilité &
Maintenabilité

                  11
Une interface graphique ?




                            12
Du XML ?
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="2.1">
 <hashTree>
   <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
    <stringProp name="TestPlan.comments"></stringProp>
    <boolProp name="TestPlan.functional_mode">false</boolProp>
    <boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
    <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel"
testclass="Arguments">
     <collectionProp name="Arguments.arguments"/>
    </elementProp>
    <stringProp name="TestPlan.user_define_classpath"></stringProp>
   </TestPlan>
   <hashTree>
    <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true">
     <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
     <elementProp name="ThreadGroup.main_controller" elementType="LoopController"
guiclass="LoopControlPanel">
       <boolProp name="LoopController.continue_forever">false</boolProp>
       <stringProp name="LoopController.loops">1</stringProp>
     </elementProp>
     <stringProp name="ThreadGroup.num_threads">1500</stringProp>
     <stringProp name="ThreadGroup.ramp_time">200</stringProp>




                                                                                                             13
Solution
•Portable (JVM)
•Réellement asynchrone
•Ergonomique
•Evolutive
                         14
Async = Acteurs




                  15
Async = IO non
   bloquants

• Netty
• Async Http Client
                      16
Scénarios
   =
  DSL

            17
Scénarios = code
val scn = scenario("My Scenario")
  .exec(http("Login page").get("/login.html"))

 .exec(http("Login").post("/login")
    .param("username", "foo")
    .param("password", "bar"))

 .loop(
     chain.exec(http("Home").get("/home.html")
       .check(regex("""<a href="/account/(ACC[0-9]*)">"""))
     )
 ).times(5)

                                                              18
Démo !



         19
Screenshot recorder 1


                        20
Screenshot recorder 2


                        21
Conclusion


http://gatling-tool.org
@GatlingTool
https://github.com/excilys/gatlin
g

                                    22

Gatling Tool in Action at DevoxxFR 2012