Partager des variables entre scénarios gatling
Je suis en train de mettre en œuvre des tests de performance avec Gatling. Un des principaux outils libres de tests de performance.
J’ai eu récemment à résoudre un « petit » soucis : je souhaitai partager des variables entre plusieurs scénarios. Il existe pas mal de solutions sur stackoverflow. J’ai condensé certaines d’entre elles pour les adapter à mon besoin.
Ces variables sont issues de exécution d’une seule requête et sont automatiquement injectées dans les scénarios suivants. Ce mécanisme permet par exemple de récupérer un jeton d’un serveur d’identification et de l’injecter pour le scénario que l’on souhaite tester.
Pour ce faire, il faut ajouter une variable de type LinkedBlockingDeque
et injecter le contenu choisi via la session
val holder = new LinkedBlockingDeque[String]() ... val firstScenario = scenario("First Simulation") .exec(http("first scenario") .post("/base/url1") .check(jsonPath("$.my_variable").find.saveAs("variable"))) .exec(session => { holder.offerLast(session("variable").as[String]) session} );
Maintenant on peut l’utiliser dans un autre scénario comme feeder:
val secondScenario = scenario("Second Simulation") .feed(sharedDataFeeder)
Voici l’exemple complet
class RecordedSimulation extends Simulation { | |
val httpProtocol = http | |
.baseUrl("https://mabaseurl") | |
.inferHtmlResources() | |
.acceptHeader("*/*") | |
.acceptEncodingHeader("gzip, deflate") | |
.connectionHeader("close") | |
.userAgentHeader("PostmanRuntime/7.17.1") | |
/* randomized data information */ | |
var feeder = Iterator.continually(Map("somedata" -> (Random.alphanumeric.take(20).mkString))) | |
/* ------------------------------------- */ | |
val holder = new LinkedBlockingDeque[String]() | |
/* Enables to store and fetch the oauth access token */ | |
var sharedDataFeeder= Iterator.continually(Map("variable" -> holder.takeFirst())) | |
/* ------------------------------------- */ | |
val firstScenario = scenario("First Simulation") | |
.exec(http("first scenario") | |
.post("/base/url1") | |
.check(jsonPath("$.my_variable").find.saveAs("variable"))) | |
.exec(session => { | |
holder.offerLast(session("variable").as[String]) | |
session} | |
); | |
val secondScenario = scenario("Second Simulation") | |
.feed(feeder) | |
.feed(sharedDataFeeder) | |
.repeat(1){ | |
exec(http("url1") | |
.post("/url1") | |
.headers(Map("my_header" -> "Bearer ${variable}","Content-Type" -> "application/json")) | |
.body(ElFileBody("recordedsimulation/anonymized_data.json"))); | |
} | |
setUp(firstScenario.inject(atOnceUsers(1)),secondScenario.inject(constantConcurrentUsers(10) during (10 minutes), | |
rampConcurrentUsers(10) to (20) during (10 minutes)) | |
.protocols(httpProtocol)); | |
} |
En espérant que cela puisse aider à certain.e.s d’entre vous