Lecture 2 minutes
Pour réaliser des tests de montée en charge, nous utilisons entre autres l’outil Gatling. Cela nous permet de faire à la fois des tests de scénarios de navigation ainsi que des tests d’appels aux API par exemple. Si vous débutez avec Gatling, voici deux astuces qui pourraient vous servir.
Chargement de donnée depuis un fichier
Il est très facile de charger des données depuis un fichier avec Gatling. Pour cela il vous faut quelques ingrédients :
- mettre le fichier dans le répertoire data présent dans le répertoire user-file;
- déclarer ce fichier dans votre simulation :
1 |
val users = csv("users.csv").random |
- piocher une ligne au hasard dans ce fichier lors de votre simulation en ajoutant une étape dans votre scénario :
1 |
.feed(users) |
- utiliser les données de votre fichier csv en utilisant des variables portant le nom de vos colonnes. Il faut donc avoir une ligne avec les en-têtes et faire attention à ne pas avoir dans votre scénario des variables qui s’appellent déjà comme cela :
1 |
${userPassword} |
Parser du JSON et extraire des variables
Si vous souhaitez tester une API vous aurez à gérer un jeton d’identification, que vous devrez utiliser par la suite dans vos appels. Pour cela vous pouvez simplement utiliser la fonction jsonPath pour parser votre JSON associée à la méthode saveAs pour stocker le résultat dans une variable.
Concrètement cela peut donner quelque chose comme ceci :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
import scala.concurrent.duration._ import io.gatling.core.Predef._ import io.gatling.http.Predef._ import io.gatling.jdbc.Predef._ class LoginAndMore extends Simulation { val url = "WebServiceUrl" val httpProtocol = http .baseURL(url) .inferHtmlResources(BlackList(""".*\.js""", """.*\.css""", """.*\.gif""", """.*\.jpeg""", """.*\.jpg""", """.*\.ico""", """.*\.woff""", """.*\.(t|o)tf""", """.*\.png"""), WhiteList()) .acceptHeader("application/json, text/javascript, */*; q=0.01") .acceptEncodingHeader("gzip, deflate, sdch") .acceptLanguageHeader("fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4") .doNotTrackHeader("1") .userAgentHeader("Mozilla/5.0") val users = csv("users.csv").random val headersRequestToken = Map( "Accept-Encoding" -> "gzip, deflate", "Content-Type" -> "application/json", "Origin" -> url, "X-Requested-With" -> "XMLHttpRequest") val headersMore = Map( "Content-Type" -> "application/json", "X-Requested-With" -> "XMLHttpRequest") val scn = scenario("LoginAndMore") .feed(users) .exec( http("requestToken") .post("/rest/v10/oauth2/token") .headers(headersRequestToken) .body(StringBody("{\"grant_type\":\"password\",\"username\":\"${userName}\",\"password\":\"${userPassword}\",\"client_id\":\"sugar\",\"platform\":\"base\",\"client_secret\":\"\",\"current_language\":\"en_us\",\"client_info\":{\"current_language\":\"en_us\"}}")) .check(jsonPath("$.access_token").find.saveAs("accessToken")) .resources( http("requestMore") .get("/rest/v10/me") .headers(headersMore ++ Map("OAuth-Token" -> "${accessToken}")) ) ) setUp(scn.inject(atOnceUsers(1))).protocols(httpProtocol) } |
Et voilà!