web-dev-qa-db-fra.com

Comment ajouter une valeur aléatoire dans Json Body à Gatling?

J'ai besoin de créer un entier positif aléatoire à chaque fois et de l'envoyer au corps Json dans Gatling.

J'ai utilisé le code ci-dessous pour créer un entier positif aléatoire:

val  r = new scala.util.Random;
val OrderRef = r.nextInt(Integer.MAX_VALUE);

mais, comment puis-je introduire la valeur générée aléatoirement dans le corps json?

J'ai essayé:

.exec(http("OrderCreation")
.post("/abc/orders")
.body(StringBody("""{    "orderReference": "${OrderRef}"}""").asJson)  

Mais cela ne semble pas fonctionner. Tous les indices s'il vous plaît.

Merci!

18
Gold Meen

Tout d'abord, vous voulez générer un nombre aléatoire à chaque fois, donc OrderRef doit être une méthode, comme:

def orderRef() = Random.nextInt(Integer.MAX_VALUE)

Commentaire secondaire: par Scala: nom camelCase, () pendant qu'il génère de nouvelles valeurs, sans ; À la fin.

Pour utiliser la méthode préparée, vous ne pouvez pas utiliser la chaîne Gatling EL . La syntaxe est très limitée et, fondamentalement, "${OrderRef}" Recherche une variable portant le nom OrderRef dans Gatling Session.

La bonne façon est d'utiliser la fonction d'expression comme:

.exec(
   http("OrderCreation")
  .post("/abc/orders")
  .body(StringBody(session => s"""{ "orderReference": "${orderRef()}" }""")).asJSON
)

Ici, vous créez une fonction anonyme en prenant Gatling Session et en retournant String comme corps. La chaîne est composée via le mécanisme d'interpolation de chaîne standard Scala et utilise avant la fonction préparée orderRef().

Bien sûr, vous pouvez omettre Scala interpolation de chaîne comme:

.body(StringBody(session => "{ \"orderReference\": " + orderRef() +" }" )).asJSON

ce qui n'est pas un style très préféré lors de l'utilisation de Scala.

Voir plus de détails dans la documentation Gatling à Request Body et en savoir plus sur Galting EL syntax .

Une autre manière consiste à définir un Feeder:

// Define an infinite feeder which calculates random numbers 
val orderRefs = Iterator.continually(
  // Random number will be accessible in session under variable "OrderRef"
  Map("OrderRef" -> Random.nextInt(Integer.MAX_VALUE))
)

val scn = scenario("RandomJsonBody")
  .feed(orderRefs) // attaching feeder to session
  .exec(
     http("OrderCreation")
    .post("/abc/orders")
    // Accessing variable "OrderRef" from session
    .body(StringBody("""{ "orderReference": "${OrderRef}" }""")).asJSON
  )

Ici, la situation est différente, nous définissons d'abord le feeder, puis nous l'attachons à la session et ensuite utilisons sa valeur dans le corps de la requête via Gatling EL string . Cela fonctionne alors que la valeur du feeder est tirée du feeder par Gatling avant une session attachée à chaque utilisateur virtuel. En savoir plus sur les mangeoires ici .

Recommandation: si votre scénario est simple, commencez par la première solution. Si cela prend plus de complexité, pensez aux mangeoires.

Prendre plaisir

38
Teliatko