Gatling 2 : La nouvelle API d'injection
Lorsque nous écrivons une simulation Gatling, nous avons généralement 2 parties :
- La définition du scénario : orchectration des différentes requêtes
- L’injection de charges : nombre d’utilisateurs, définition de rampe, etc…
La seconde partie a été refondue, les mots clés du DSL : users, delay et ramp ont été supprimés et un nouveau DSL a été défini.
Pour illustrer l’utilisation de ce nouveau DSL, nous allons utiliser un scénario qui consiste à rechercher successivement sur Twitter les mots clés : jcertif, gatling, nantes, scala.
Définir un tel scénario consiste à écrire les lignes suivantes :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
val httpConf = httpConfig
.baseURL("http://search.twitter.com")
.acceptHeader("*/*")
.acceptCharsetHeader("ISO-8859-1,utf-8;q=0.7,*;q=0.3")
.acceptEncodingHeader("gzip,deflate,sdch")
.acceptLanguageHeader("en-US,en;q=0.8")
.connection("keep-alive")
.userAgentHeader("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Ubuntu/12.10 Chromium/25.0.1364.172 Chrome/25.0.1364.172 Safari/537.22")
val scn = scenario("Recherches sur Twitter")
.exec(http("Recherche JCertif").get("/search.json?q=jcertif"))
.exec(http("Recherche Gatling").get("/search.json?q=gatling"))
.exec(http("Recherche Nantes").get("/search.json?q=nantes"))
.exec(http("Recherche Scala").get("/search.json?q=scala"))
La première partie définie l’URL de base “http://search.twitter.com” à utiliser et des informations que nous allons envoyer à chaque requête.
La seconde définie le scénario que nous allons exécuter.
Voyons à présent plusieurs cas d’injection et leurs mises en oeuvre.
Cas 1 : 100 utilisateurs lancés une seule fois en même temps
Le code de l’injection
1
2
3
setUp(scn.inject(
atOnce(100 users)
).protocolConfig(httpConf))
Graphe du nombre d’utilisateurs actifs pendant le test
Les 100 utilisateurs sont lancés en même temps.
Le code complet
Cas 2 : 100 utilisateurs simultanés puis 10 secondes d’attente puis 50 utilisateurs simultanés
Le code de l’injection
1
2
3
4
5
setUp(scn.inject(
atOnce(100 users),
nothingFor(10 minutes),
atOnce(50 users)
).protocolConfig(httpConf))
Graphe du nombre d’utilisateurs actifs pendant le test
Le code complet
Cas 3 : 50 utilisateurs lancés en 5 minutes
Le code de l’injection
1
2
3
setUp(scn.inject(
ramp(100 users) over (40 seconds)
).protocolConfig(httpConf))
Graphe du nombre d’utilisateurs actifs pendant le test
La répartition des utilisateurs dans le temps est faite de façon linéaire : 1 nouvel utilisateur toutes les 6 secondes dans notre cas.
Le code complet
Cas 4 : 2 requêtes/seconde pendant 2 heures
Le code de l’injection
1
2
3
setUp(scn.inject(
constantRate(2 usersPerSec) during (2 minutes)
).protocolConfig(httpConf))
Résultat
Le code complet
Cas 5 : Passer de 2 utilisateurs/seconde à 10 utilisateurs/seconde en 5 minutes
Le code de l’injection
1
2
3
setUp(scn.inject(
rampRate(2 usersPerSec) to(10 usersPerSec) during(5 minutes)
).protocolConfig(httpConf))
Résultat
Le code complet
Cas 6 : Pour 100 utilisateurs au total, lancer 10 utilisateurs en 20 secondes et espacer deux lancements avec une pause de 15 secondes
Le code de l’injection
1
2
3
setUp(scn.inject(
split(100 users).into(ramp(10 users) over (20 seconds)).separatedBy(15 seconds)
).protocolConfig(httpConf))
Résultat
Le code complet
Cas 7 : 2 scénarios (recherche twitter et recherche facebook) lancés en simultanné
Les scenarios
1
2
3
4
5
6
7
8
9
10
11
val scnSearchTwitter = scenario("Recherches sur Twitter")
.exec(http("Recherche Twitter JCertif").get("http://search.twitter.com/search.json?q=jcertif"))
.exec(http("Recherche Twitter Gatling").get("http://search.twitter.com/search.json?q=gatling"))
.exec(http("Recherche Twitter Nantes").get("http://search.twitter.com/search.json?q=nantes"))
.exec(http("Recherche Twitter Scala").get("http://search.twitter.com/search.json?q=scala"))
val scnSearchFacebook = scenario("Recherches sur Facebook")
.exec(http("Recherche Facebook JCertif").get("https://graph.facebook.com/search?q=jcertif&type=post"))
.exec(http("Recherche Facebook Gatling").get("https://graph.facebook.com/search?q=gatling&type=post"))
.exec(http("Recherche Facebook Nantes").get("https://graph.facebook.com/search?q=nantes&type=post"))
.exec(http("Recherche Facebook Scala").get("https://graph.facebook.com/search?q=scala&type=post"))
Le code de l’injection
1
2
3
setUp(
scnSearchTwitter.inject(atOnce(40 users)).protocolConfig(httpConf),
scnSearchFacebook.inject(atOnce(40 users)) protocolConfig (httpConf))
Résultat
Le code complet
Mon avis
Vous l’avez peut-être constater, dès fois le DSL est plus facile à lire que ma retranscription en français :)
Note
J’ai écris les scénarios en utilisant l’API Twitter version 1 qui doit être bientôt désactivé (si ce n’est pas déjà fait :)).
Liens utiles