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 🙂
Vus : 269
Publié par Littlewing : 368