Et oui, encore un article sur JMeter, ça fait beaucoup. Enfin quand on aime hein 😉 …

Cette fois ci mon petit billet concerne l’automatisation de tests JMeter pour tester une API mettant en cache des données dans Couchbase (je sais c’est précis mais ça aidera peut-être quelqu’un).

En effet, ma problématique est la suivante:

  • Lors d’une demande de changement d’email de la part d’un utilisateur
  • Je stocke un hash dans Couchbase authentifiant sa demande, histoire qu’un petit malin puisse pas changer les emails de ses petits copains…
  • Ce hash est une clé stockée en mémoire dans Couchbase
  • Je lui envoie un mail à sa nouvelle adresse mail contenant un lien de validation (qui comporte le hash)
  • Je compare le hash de Couchbase avec celui reçu au moment ou l’utilisateur clique sur ce lien

Comment je peux automatiser un test JMeter avec ça???

Bien sûr il faut que je récupère le bon hash dans Couchbase… mais facile de retrouver un doc dans Couchbase en connaissant la clé… mais là c’est la clé que je ne connais pas.
Et Couchbase, ce petit malin, n’as qu’une API assez réduite pour récupérer des listes de clés stockées en mémoire.

J’ai donc appris à créer:

Et en fait, les vues sont assez puissantes!
On peut récupérer une liste des clés en les filtrant suivant la date d’expiration, le type de stockage, en fait tout type d’attribut accolé à un document stocké dans le système.
Comme je connais le temps d’expiration de mon hash en seconde, je crée ma vue avec le code suivant:

function (doc, meta) {
  var diff = Math.round((new Date().getTime()+1800000)/1000) - meta.expiration
  if(meta.id.length === 64 && diff > 0) { 
     emit(diff, doc);
  }
}
Une vue Couchbase
Une vue Couchbase

Je sais que mon hash est encodé sur 64 caractères et sa date d’expiration est 1800 secondes donc je filtre mes clés qui répondent à ces critères.
Et surtout, j’ordonne ma liste par « diff » qui est la différence entre new Date() et l’expiration de mes documents.

Au moment du test, tout de suite après le stockage de mon hash, je peux invoquer l’api de Couchbase pour récupérer le premier élément de cette liste.

GET http://myhost:8092/bucket_name/_design/dev_view_name/_view/token_view?stale=false&connection_timeout=1000&limit=1&skip=0

et je récupère une liste de 1 élément (limit=1) contenant le dernier hash stocké dans Couchbase dans l’id:

{
"total_rows":3,
"rows":[
    {
      "id":"e6642a872961b34ca129d74f4e280974e03b3ae53153b9ed91b687609a505131",
      "key":1,
      "value":null
    }
  ]
}

Côté JMeter, un petit script beanshell pour récupérer l’id and… voilà

import java.io.*;
import java.util.*;
import java.lang.*;
import org.json.*;
import org.apache.jmeter.samplers.SampleResult;

getToken(JSONArray rows) {

for(int i=0; i<rows.length(); i++ ){
 JSONObject o = rows.getJSONObject(0);
 String probableToken = o.getString("id");

if(probableToken.length() == 64) {
 return probableToken;
 }
 }
 return "Extraction failed!";
}

JSONObject jsonResponse = new JSONObject(new String(ResponseData));

if(jsonResponse.length() != 2){
 Failure = true;
 FailureMessage = "Nombre d'éléments incorrecte.";
}else{
 JSONArray rows = jsonResponse.getJSONArray("rows");

 String token = getToken(rows);

log.info("token: " + token);

props.put("token", token);
}

J’espère que ça vous sera utile.

Leave a comment

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *