Gatling... ca va tomber!!

Posté le 30 December 2017

Contact !

Bon, dès que j’entends parler de Gatling, j’ai envie de crier contact en pensant à Predator (film des années 80 pour les plus jeunes) Remember :

On bute le datacenter ?

Presque ! Gatling vous permet de créer vos scénarios d’utilisations et d’injecter en masse. Je préviens : le code est en scala … Non, ne fuyez pas ! C’est très lisible et pas besoin forcément d’écrire grâce à l’enregistreur.

Les rapports sont sous forme de fichier html. Pratique à publier pour les chefs.

L’enregistreur

L’enregistreur est un proxy qui va vous créer votre code pour reproduire ensuite vos scénarios. Pensez à modifier votre Firefox pour qu’il traverse le proxy évidemment.

Pour l’instant, j’ai pas trop forcé les tests. Pour un usage simple, l’interface est sympa, quelques paramètres:

  • le nom du package (première lettre en minuscule)
  • l’emplacement du code (je ne l’ai pas changé pour ma part)

Et n’oubliez pas d’appuyer sur START (le petit bouton en bas à droite… faudrait le mettre ailleurs, je pense)

En avant pour faire vos manipulations ! On se retrouve ensuite pour le code !

Le code

Voila un code généré :

package maison

import scala.concurrent.duration._

import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.jdbc.Predef._

class RecordedSimulation extends Simulation {

	val httpProtocol = http
		.baseURL("http://chez-moi:8081")
		.inferHtmlResources()
		.acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
		.acceptEncodingHeader("gzip, deflate")
		.acceptLanguageHeader("en-US,en;q=0.5")
		.doNotTrackHeader("1")
		.userAgentHeader("Mozilla/5.0 (X11; Linux x86_64; rv:56.0) Gecko/20100101 Firefox/56.0")

	val headers_0 = Map("Upgrade-Insecure-Requests" -> "1")

	val scn = scenario("RecordedSimulation")
		.exec(http("request_0")
			.get("/posts/2017-12-20-nixos.html")
			.headers(headers_0))
		.pause(2)
		.exec(http("request_1")
			.get("/archive.html")
			.headers(headers_0))
		.pause(2)
		.exec(http("request_2")
			.get("/about.html")
			.headers(headers_0))
		.exec(http("request_3")
			.get("/contact.html")
			.headers(headers_0))

	setUp(scn.inject(atOnceUsers(10))).protocols(httpProtocol)
}

3 parties importantes

val httpProtocol établit les parties du protocol http utilisé pour le test :

  • header
  • encoding

val scn : c’est le scénario, un ensemble d’ exec et de pause
Dans exec, on retrouve :

  • http(“blabla”) : ce blabla, vous le récupérez dans le rapport
  • get(“/mapage”) : bah simplement un get de la page
  • headers : une modification du headers par la valeur headers_0

Enfin, la dernière partie qui lance la purée :

setUp(scn.inject(atOnceUsers(10))).protocols(httpProtocol)

Variez ensuite la valeur de 10 par le nombre d’utilisateurs que vous désirez !

Gestion des formulaires

C’est la partie un peu plus dur. Il y a des exemples bien faits dans le package

object Edit {

	val headers_10 = Map("Content-Type" -> "application/x-www-form-urlencoded")

	val edit = exec(http("Form")
		.get("/computers/new"))
		.pause(1)
		.exec(http("Post")
			.post("/computers")
			.headers(headers_10)
			.formParam("name", "Beautiful Computer")
			.formParam("introduced", "2012-05-30")
			.formParam("discontinued", "")
			.formParam("company", "37"))
}

Il faut juste faire attention au formParam qui sont les éléments que vous envoyez.

Mode d’injection des utilisateurs

Pas besoin forcément d’envoyer la charge d’un coup, des fonctions permettent de gérer aussi l’arrivée des utilisateurs :

  • atOnceUsers : toujours le même nombre d’utilisateurs (exemple : tester pour 100 utilisateurs mais avec 10 utilisateurs seulement à la fois)
  • rampUsers : ajoute des utilisateurs suivant une rampe linéaire
  • constantUserPerSec : ajoute des utilisateurs de manière constante

Il existe aussi des variantes (de l’aléatoire par exemple)

Exemple :

setUp(scn.inject(rampUsers(10) over (10 seconds)))
  .protocols(httpProtocol)

Pour plus d’informations

On ré-enclenche ?

Simplement en relancant :

katyucha@MiniLap ➜  gatling-charts-highcharts-bundle-2.3.0 bin/gatling.sh                                         
Choose a simulation number:
     [0] computerdatabase.BasicSimulation
     [1] computerdatabase.advanced.AdvancedSimulationStep01
     [2] computerdatabase.advanced.AdvancedSimulationStep02
     [3] computerdatabase.advanced.AdvancedSimulationStep03
     [4] computerdatabase.advanced.AdvancedSimulationStep04
     [5] computerdatabase.advanced.AdvancedSimulationStep05
     [6] maison.RecordedSimulation
6
Select simulation id (default is 'recordedsimulation'). Accepted characters are a-z, A-Z, 0-9, - and _
Test1
Select run description (optional)
premier test de la série pour 10 users

Et c’est PARTI !

Et on voit comment les dégats?

Please open the following file:
~/gatling-charts-highcharts-bundle-2.3.0/results/balance-1514650260775/index.html

On a un résultat général

mais aussi au détail (images, pages…etc)

Conclusion

Un bon outils, assez simple à mettre en place. Pour des scénarios plus complexes, des compétences en scala seront nécessaires, à mon avis.
Les courbes de résultat sont sympas à lire, pas trop compliquées, accessibles facilement en lecture. Ma prochaine opération sera surement de balancer la sauce à partir d’un Jenkins pour automatiser des tests réguliers.
To be continued… !